c++ - SDL2 面向对象包装器; 1000+ Virtual Function 调用一个框架;有什么办法可以优化这个吗?

标签 c++ function oop polymorphism sdl-2

我正在为 SDL2 编写一个面向对象的包装器。我决定制作 2 个类:一个 Sprite 类和一个 Rectangle 类。我使用了一些多态性,所以我不必为每个可绘制对象重载 draw 函数。我有一个基类 Drawable,它有一个纯虚拟函数 draw

现在SpriteRect都继承了Drawable并定义了draw函数来适应类的风格。现在,当我必须在屏幕上绘制很多东西时,我会使用指向 Drawable 的指针,然后调用 draw 方法。这种情况每秒发生 1000 多次。

如果我查看我的 CPU 使用率,大约是 10%。我知道每秒绘制 60 次 1000 多个 Sprites 会阻碍我的 CPU 使用率,但我认为不会有这么多。

现在,我的问题是:有什么方法可以优化它吗?也许去掉纯虚函数并重载函数?

我的代码(我尽量缩短它):

Sprite::Draw 声明

void Draw() override;

Sprite::绘制函数

void Sprite::Draw() {

    // rect is SDL_Rect

    rect.x = rect.x - window->getCamera().getCoords().x;
    rect.y = rect.y - window->getCamera().getCoords().y;
    SDL_RenderCopyEx(window->renderer, texture, NULL, &rect, 0, NULL, flip);

}

调用Sprite::Draw的函数

void Window::Draw(Drawable *d) {

    d->Draw();

}

绘制循环

// 1024 grass Sprites

for (int i = 0; i < 1024; i++) {

            mainWindow.Draw(&grass[i]); // Calls Window::Draw

}

正如我之前所说,它占用了我大约 10% 的 CPU 使用率。我有一个 AMD 6300 和一个 NVIDIA GTX 750Ti。我正在使用 Microsoft Visual Studio Express 2013。

可执行文件名称是OBA.exe

OBA

最佳答案

能否将这些草 Sprite 的纹理压缩成 1 个纹理贴图,然后绘制其中的一部分(第三个参数,srcrect -- https://wiki.libsdl.org/SDL_RenderCopyEx)?

我猜你没有 1024 种独特的草纹理,而是一些重复的纹理。将它们全部组合成一个图像并将其加载为草纹理。 然后,您的 sprite 类只需要定义一个 SDL_Rect 用于绘制纹理的哪一部分。

示例纹理:

<img>http://i.imgur.com/MY0BIh2.png</img>

假设您的 Sprite 使用纹理 0,它的 srcrect 将是 0,0,32,32。绘制它只是将一个参数添加到您的 RenderCopy 调用中。

SDL_RenderCopyEx(window->renderer, texture, &srcrect, &rect, 0, NULL, flip);

这应该会提高绘制大量 Sprite 的性能。此外,您只能在相机 View 中绘制 Sprite 。

关于c++ - SDL2 面向对象包装器; 1000+ Virtual Function 调用一个框架;有什么办法可以优化这个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33614476/

相关文章:

python - TCP Receive in Python,读取数据

java - Runtime如何选择外部类方法和父类(super class)方法的调用方式?

c++ - 无法将参数从 `const char *` 转换为 `char *`

c++ - 为 C++ 搜索好的调试器

python - 位置参数和关键字参数的求值顺序

c++ - C++ 代码的符号表是否包含函数名和类名?

c++ - C++ 测试用例的基本字符串差异

从 IDE 调试时来自文件的 C++ 标准输入

mysql - 存储函数中的继续处理程序仅调用一次

javascript - 在函数内部使用 "this"- nodeJS