【问题标题】:Is there a better way to draw multiple points in SFML?有没有更好的方法在 SFML 中绘制多个点?
【发布时间】:2021-04-10 17:59:26
【问题描述】:

我正在尝试使用随机颜色在 800 x 800 窗口上绘制每个像素,并且我正在使用 sf::Vertex 绘制像素,但是当我运行程序时,它非常慢。有没有更好的方法来绘制更快且使用更少内存的多个点?这是我写的代码:

#include <SFML/Graphics.hpp>

#include <ctime>
#include <random>


int main() {
    // Window
    sf::RenderWindow window{ sf::VideoMode{ 800u, 800u }, "Views" };
    sf::Clock clock;

    static std::mt19937 randomEngine{ static_cast<unsigned int>(std::time(nullptr)) };
    std::uniform_int_distribution<int> randDist{ 0, 255 };

    // Main game loop
    while (window.isOpen()) {
        // Event loop
        sf::Event sfmlEvent;
        while (window.pollEvent(sfmlEvent)) {
            if (sfmlEvent.type == sf::Event::Closed) {
                window.close();
            }
        }

        // Draw
        for (float i = 0; i < window.getSize().x; ++i) {
            for (float j = 0; j < window.getSize().y; ++j) {
                uint8_t r = randDist(randomEngine);
                uint8_t g = randDist(randomEngine);
                uint8_t b = randDist(randomEngine);
                sf::Vertex pixel{ { i, j }, { r, g, b } };
                window.draw(&pixel, 1, sf::Points);
            }
        }

        // Display
        window.display();
    }
}

【问题讨论】:

  • 你见过sf::Image吗?
  • 谢谢,效果很好。

标签: c++ visual-c++ sfml


【解决方案1】:

感谢其中一位 cmets,我现在知道如何解决此问题。

我可以使用sf::Image,而不是使用一堆sf::Vertecies。我所做的是我创建了一个窗口大小的图像并将其全黑。然后,我没有绘制每个单独的点,而是将图像中的每个像素设置为随机颜色。然后,在退出 for 循环后,我将图像加载到纹理中,并将该纹理设置为我绘制到窗口上的精灵。

这是更新后的代码:

#include <SFML/Graphics.hpp>

#include <ctime>
#include <random>


int main() {
    // Window
    sf::RenderWindow window{ sf::VideoMode{ 800u, 800u }, "Views" };
    sf::Clock clock;

    static std::mt19937 randomEngine{ static_cast<unsigned int>(std::time(nullptr)) };
    std::uniform_int_distribution<int> randDist{ 0, 255 };

    sf::Image image;
    image.create(window.getSize().x, window.getSize().y, sf::Color::Black);
    sf::Texture texture;
    sf::Sprite sprite;

    // Main game loop
    while (window.isOpen()) {
        // Event loop
        sf::Event sfmlEvent;
        while (window.pollEvent(sfmlEvent)) {
            if (sfmlEvent.type == sf::Event::Closed) {
                window.close();
            }
        }

        // Draw
        for (float i = 0; i < window.getSize().x; ++i) {
            for (float j = 0; j < window.getSize().y; ++j) {
                uint8_t r = randDist(randomEngine);
                uint8_t g = randDist(randomEngine);
                uint8_t b = randDist(randomEngine);

                image.setPixel(i, j, { r, g, b });
            }
        }

        texture.loadFromImage(image);
        sprite.setTexture(texture);
        window.draw(sprite);

        // Display
        window.display();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多