每帧多次调用SDL_SetTextureColorMod是安全/可接受的吗?

时间:2014-07-26 09:56:36

标签: sdl sdl-2

作为渲染除了颜色以外的多个纹理的简单方法,我将一个纯白色圆圈加载到SDL_Texture,然后只需调用SDL_SetTextureColorMod(),为其赋予我想要制作圆圈的颜色。

如果纹理是单独的(示例1),这一切都可以正常工作但是如果我共享SDL_Texture以便多个对象都引用它,则意味着必须在每个渲染帧之前调用SDL_SetTextureColorMod()该对象渲染纹理,因为它上次给出的颜色可能已被另一个对象更改(例2)。

每个渲染帧都调用SDL_SetTextureColorMod(),因为可能会有很多共享纹理的对象,会导致严重的性能问题吗?

需要的原因是系统是使用共享纹理功能和基本引用计数设计的(我知道使用智能指针可能有更好的方法来执行此操作,但这不是此处讨论的主题)。让每个对象拥有它自己的SDL_Texture副本会更好吗?所以它只需要设置一次颜色(或者每当它需要改变时)而不是每个渲染帧? / p>

示例1:

SDL_Texture* tex1;
SDL_Texture* tex2;
SDL_Texture* tex3;
...
// All 3 instances have their own SDL_Texture
MyObject A(tex1);
MyObject B(tex2);
MyObject C(tex3);
...
// A call to set the color of the texture is only required once for each class

示例2:

SDL_Texture* tex;
...
// All 3 instances share the SDL_Texture
MyObject A(tex);
MyObject B(tex);
MyObject C(tex);
...
// A call to set the color of the texture must be made before rendering 
// each object to ensure that any other object has not set a different color.
// E.g if the draw order was A, B, C and the color was set to be different
// for each object then before rendering B, each frame it would need to set 
// the color again otherwise it would have the color of A and the same 
// for the others    

编辑:这也会扩展到SDL_SetTextureAlphaMod()SDL_SetTextureBlendMode()或其他类似的功能

供参考我使用SDL2。

更新:最初认为对函数的调用只是更新颜色混合标志。我已经做了一些调查,这部分是正确的,可以在 - http://pastebin.com/pMjgVkmM

中的函数中看到

但是,如果渲染器具有为SetTextureColorMod()指定的功能(大多数情况下都是这种情况),那么它将映射到函数' SW_SetTextureColorMod()' - http://pastebin.com/qYtxD0TH

这反过来调用SDL_SetSurfaceColorMod() - http://pastebin.com/GrsVibAz

我现在关注的是SDL_InvalidateMap可能会调用{{1}},我认为这可能导致释放,但我不确定 - http://pastebin.com/r0HGJYHT

1 个答案:

答案 0 :(得分:2)

SDL_SetTextureColorMod不会更新纹理纹理 - 它会保存乘数颜色并提升SDL_MODTEXTURE_COLOR标记。该纹理上的后续RenderCopy将使用固定颜色的纹素乘以。

由于它不会修改纹理,并且在纹理标题中只有一点点常量,因此在相同纹理的渲染帧中多次设置它是完全可以的。克隆纹理会适得其反(大量内存使用,并且由于更高的内存带宽压力,可能会降低帧速率)。