为什么 SDL_RenderCopy 和 SDL_RenderCopyEx 使用非常量纹理?

Why SDL_RenderCopy and SDL_RenderCopyEx take non-const textures?

我正在优化我的 SDL 代码并尽可能添加 const 限定符,无意中发现了 SDL_RenderCopy 的以下声明:

int SDL_RenderCopy(SDL_Renderer*   renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect)

纹理参数不是常量。 纹理应该是非常量是否有原因? 我还以为这个函数只是把贴图作为一个源,并没有修改它。

我是不是漏掉了什么?

简短回答:RenderCopy 通过修改 texture->last_command_generation 来跟踪何时使用纹理:https://hg.libsdl.org/SDL/file/355a4f94a782/src/render/SDL_render.c#l2997

texture->last_command_generation = renderer->render_command_generation;

retval = QueueCmdCopy(renderer, texture, &real_srcrect, &real_dstrect);

当您在排队等待渲染时大量修改纹理(例如销毁)时,需要此跟踪。在销毁时,SDL 检查生成并在需要时刷新渲染队列。否则,实现诸如“创建纹理、填充数据、绘制、立即销毁纹理”之类的东西(不是很好)会有问题。

虽然可以修改 SDL 以将生成保留在某个单独的位置(例如渲染器),但这种情况在逻辑上“const”是有问题的 - 您已将纹理排队等待渲染,在它和 RenderPresent 之间修改它可能是一个坏主意,所以..不是那么常量?