【问题标题】:Why is this code taking up so much memory?为什么这段代码占用这么多内存?
【发布时间】:2020-11-14 19:20:14
【问题描述】:

我在尝试分别绘制窗口中的每个像素时遇到了这个问题,所以这是我的问题的更简单版本。当我运行这段代码时,进程内存开始迅速增加,直到达到 365 MB 并停止增加。为什么这会占用如此多的内存,我该如何解决这个问题?

#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow window{ sf::VideoMode{ 1024, 960 }, "Pixels", sf::Style::Close };

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

        window.clear();

        for (int i = 0; i < window.getSize().x; ++i) {
            for (int j = 0; j < window.getSize().y; ++j) {
                sf::RectangleShape rect{ { 1.0f, 1.0f } };
                rect.setPosition(i, j);
                window.draw(rect);
            }
        }

        window.display();
    }

    return 0;
}

【问题讨论】:

  • 你期望多少钱?
  • 在应用程序中不仅仅是你的代码,尤其是在使用这样的库时
  • 我预计它会非常低,接近 20 MB 左右,因为所有 sf::RectangleShape 对象每次都被销毁,内存没有理由堆积。
  • "当我运行这段代码时,进程内存开始迅速增加,直到达到 365 MB 并停止增加。" - 只是你没想到,它是不一定是坏行为。
  • 驻留大小确实在20MB左右。虚拟大小几乎没有意义。这都是库代码(不是数据)。它在许多应用程序之间共享,即使这是唯一的应用程序,大部分代码也不会在这个小程序中使用。因此它将位于磁盘上,永远不会加载到 RAM。

标签: c++ sfml


【解决方案1】:

您正在做的是为每帧的每个像素创建一个新的 sf::RectangleShape。 sf::RectangleShape 类有 4 个浮点数,分别表示 x、y、宽度和高度。每帧创建的矩形总数为 983,040,每个将包含四个浮点数,这意味着您每帧创建近 400 万个浮点数,占用大量内存。我不确定你到底想做什么,但如果你想精确控制单个像素,你应该在 GPU 上使用 OpenGL 和一些着色器来做到这一点。

【讨论】: