【发布时间】:2014-01-03 00:12:12
【问题描述】:
我正在开发一个使用 SDL 的 2D 游戏。由于某些系统的 CPU 较弱而 GPU 较强,因此我有一个渲染器后端,除了普通的 SDL/软件之外,它还使用 OpenGL。
渲染器界面的简化版本如下所示:
class Renderer {
public:
virtual void render_surface(SDL_Surface* surface) = 0;
virtual void render_text(const std::string& text, const Font& font) = 0;
};
但这有一个问题:每当我使用 OpenGL 绘制表面时,我都需要重复调用 glBindTexture 来浪费大量时间。目前,我有一个基于表面内存地址的愚蠢缓存,但它显然不适用于动态生成的表面,例如在render_text内。
我能想到的唯一合适的解决方案是彻底改变界面并让调用者合理地缓存纹理:
class Renderer {
public:
virtual Texture load_surface(SDL_Surface* surface) = 0;
virtual Texture load_text(const std::string& text, const Font& font) = 0;
virtual void render_texture(const Texture& texture) = 0;
};
但这在 IMO 上使用起来有些难看,并且必须为软件渲染器伪造。
对此我还能做些什么吗?
【问题讨论】:
标签: c++ opengl caching optimization