为什么 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 之间修改它可能是一个坏主意,所以..不是那么常量?
我正在优化我的 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 之间修改它可能是一个坏主意,所以..不是那么常量?