【发布时间】:2016-07-10 17:35:19
【问题描述】:
我目前正在将一堆应用程序从 SDL2 渲染(内部使用 OpenGL)迁移到“纯”OpenGL 渲染。在这项工作中,我弄清楚了如何将纹理上传到 GPU,并了解到每个纹理都有一个索引。
为了渲染文本,我使用了 SDL_TTF 函数,基本上可以将纹理上传到 GPU,描绘一些文本。我正在迁移的大多数应用程序的文本并不繁重,但我注意到它们可能存在问题。
想象一个应用程序接受用户文本输入并显示在屏幕上:每次击键都会生成一个包含所有输入文本的新纹理(与相同功能相关的任何其他先前纹理都将被删除)。所以,要写“Hello”,我们会得到五个纹理:“H”、“He”、“Hel”、“Hell”,最后是“Hello”。如前所述,每个“以前的”纹理(在这种情况下从“H”到“Hell”)都将被删除,并且只保留“Hello”的内存。
不过,在文本繁重的应用程序中(例如,使用这种方法来放置游戏的分数,做得很糟糕以至于您为每一帧生成一个新纹理)会上传和删除大量纹理,并且纹理索引会继续增长。
我的主要问题是:OpenGL 会回收这些索引,还是会用完数字并崩溃?。
PS:我知道可以将所有 TTF 字符打包到图集中,然后得到我需要的字母。我现在不想研究这个,除非我目前的方法很危险(这个图集有点像旧的位图字体)。
PS2:我也知道不断更改纹理并不完全是高性能的(GPU 方面),但这些应用程序在图形上并不具有挑战性,并且在旧系统中具有良好的性能。
【问题讨论】:
-
如果您担心,为什么不直接替换纹理数据而不重新创建纹理 ID/名称? IE。再次
glTexImage,或者分配大纹理并稍后替换其部分数据。 -
是的,是的,这正是我计划在未来做的事情:)。看,所有可能改变的文本(例如,前面提到的游戏中的分数标记或提示框)都封装在管理其资源删除的类中(这些通常有很长的生命周期,不会消耗很多索引)。我可以很好地扩展它们以“替换”当前纹理,但我不确定我周围的一些遗留代码。非常感谢。