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

时间:2020-06-27 08:39:01

标签: c++ constants sdl-2

我正在优化我的SDL代码并在可能的情况下添加const限定词,并偶然发现以下SDL_RenderCopy声明:

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

texture参数不是const。 为什么纹理应该是非常量的? 我以为该功能仅将纹理作为源,而不会对其进行修改。

我想念什么吗?

1 个答案:

答案 0 :(得分:1)

简短的回答:RenderCopy通过修改texture->last_command_generationhttps://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之间对其进行修改可能不是一个好主意,所以..不是那么常量?