我正在慢慢设计我的游戏"中涉及的类的结构,我想知道 SDL_Renderer 是否应该是一个公共资源,跨多个线程或每个不同的线程同步对象应该有自己的渲染器(例如,每个敌人都指向自己的渲染器以使其存在于窗口中)。任何建议将不胜感激,最好有解释。
提前致谢。
答案 0 :(得分:0)
正如keltar所指出的,API不能像这样使用。但这不是API的缺陷。 GPU完成的基础工作与C API中的“渲染此并那个”调用非常不同,因此并发不会像这样进行1:1转换。从某种意义上讲,CPU大多只是在告诉GPU该怎么做,并且一次告诉两次事情并不能使它以两倍的速度工作。
不够快吗?
如果您正在为当今相关的任何平台编写2D游戏,那么在大多数情况下SDL2应该足够快。如果您的游戏运行速度不够快,则可能是其他原因出了问题,而CPU方面的问题正在引起瓶颈。您确定要使用硬件加速渲染吗?也许某些设置出错了,并且使用软件渲染器作为后备-调用SDL_GetCurrentVideoDriver()并检查结果以确保不是这种情况。 SDL_Surface的任何用法都可能导致性能瓶颈。另外,一直将大量数据加载到GPU会导致其速度变慢,因此请确保加载的Sprite的数量不超过已加载的数量。例如,当再次加载相同的怪物时,可以重新使用已经加载的纹理,而不必再次加载它们。另一个示例是SDL_TTF,该库很慢。为怪物绘制一些HP数字要比首先渲染怪物慢得多-有些方法是预先绘制字形并将其存储为纹理。
更快地渲染纹理
话虽如此,渲染许多小的精灵确实有一些开销,如果您需要渲染大量的精灵,即使您做得正确,也可能不够快。在某些情况下,诸如 SDL_gpu 之类的库可以利用诸如纹理批处理之类的技术来提高渲染速度。您也可以直接使用OpenGL,但这还是SDL_gpu之类的库所要做的。最后但并非最不重要的一点是,SDL2现在支持Vulkan,虽然我还没有机会尝试过Vulkan,但据说在CPU端进行API调用时,它的效率要高得多。因此,如果这是您的瓶颈,并且有可能使用Vulkan,那就值得一试。
很抱歉,如果其中大部分都不适用于您的问题。也许您实际上并没有遇到瓶颈/性能问题,但只是对如何最佳使用API感到好奇。