我有点卡在 SDL2 纹理背后的逻辑上。对我来说,它们毫无意义,因为你无法吸引它们。
在我的程序中,我有几个表面(或者在我切换到 SDL2 之前是是表面),我只是将它们拼凑在一起形成层。现在看来,我必须创建多个渲染器和纹理来创建相同的效果,因为 SDL_RenderCopy
需要一个纹理指针。
不仅如此,所有渲染器都必须来自一个窗口,这我理解,但仍然让我更讨厌。
这一切看起来都非常庞大和缓慢。我错过了什么吗?有没有办法直接绘制到纹理?纹理的意义何在?我可以安全地使用多个(如果不是数百个)渲染器来代替表面吗?
最佳答案
SDL_Texture
对象存储在尽可能靠近显卡内存的位置,因此您的 GPU 可以轻松加速。调整大小、alpha 混合、抗锯齿和几乎所有计算繁重的操作都会受到这种性能提升的严重影响。如果您的程序需要在纹理上运行逐像素逻辑,建议您暂时将纹理转换为表面。也可以使用流式纹理实现解决方法。
编辑: 由于这个答案很受关注,我想详细说明我的建议。
如果您更喜欢使用 Texture -> Surface -> Texture
工作流程来应用逐像素操作,请确保缓存最终纹理,除非您需要在每个渲染周期重新计算它。此解决方案中的纹理是使用 SDL_TEXTUREACCESS_STATIC
标志创建的。
流式纹理(创建标志为 SDL_TEXTUREACCESS_STREAMING
)鼓励用于像素数据源是网络、设备、帧服务器或超出 SDL 应用程序完全范围的其他源的用例,并且当很明显从源缓存帧效率低下或不起作用时。
如果使用 SDL_TEXTUREACCESS_TARGET
标志创建纹理,则可以在纹理之上进行渲染。这将绘制操作的来源限制为其他纹理,尽管这可能已经是您首先需要的。 “作为渲染目标的纹理”是 SDL2 最新且最不广泛支持的功能之一。
给好奇的读者的 Nerd 信息:
由于 SDL 实现的性质,前两种方法依赖于应用程序级别的读取和复制操作,尽管它们针对建议的场景进行了优化,并且对于实时应用程序来说足够快。
与 GPU 上的后处理相比,从应用程序级别复制数据几乎总是很慢。如果您的要求比 SDL 所能提供的更严格,并且您的逻辑不依赖于某些外部像素数据源,那么分配从您的 SDL 表面绘制的原始 OpenGL 纹理并应用 着色器(GPU逻辑)给他们。
着色器是用 GLSL 编写的,GLSL 是一种编译成 GPU 程序集的语言。 硬件/GPU 加速实际上是指在 GPU 内核上并行化的代码,使用着色器是实现渲染目的的首选方法。
注意!将原始 OpenGL 纹理和着色器与 SDL 渲染函数和结构结合使用可能会导致一些意外的冲突或库提供的灵 active 损失。
TLDR; 尽管修改它们有时会很麻烦,但在纹理上渲染和操作比表面更快。
关于c++ - SDL2 纹理的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506979/