一、SDL_RenderCopyEx
int SDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect, const double angle, const SDL_Point *center, const SDL_RendererFlip flip)
复制部分参考SDL_RenderCopy,这里只说旋转,即angle、center参数。

左侧是原图,右侧是顺时针旋转90度后图像。底下两条语句是旋转时使用的代码。
把第二条语句中的角度从90换为-90,则结果是逆时针旋转90度。正如SDL_RenderCopyEx在帮助中写的,angle正数时表示顺时针,负数时表示逆时针。
和一些人想的不一样,center参数是和dest纹理相关,不是和src。
一直到现在,我还没彻底弄明白SDL_RenderCopyEx如何工作,以下是几个结论。
- 旋转前后,两个纹理的像素是一一对应,因而不会存在旋转后图像失真,也不会存在被削去。
- SDL只有一份顶点着色器代码,即GLES2_VertexSrc_Default_,或旋转或不旋转都在用它,因而和不旋转相比,旋转不会增加cpu、gpu开销。
- 如何填写dstrect参数?我的做法是先确定width、height,然后看效果,再决定如何填x、y。
二、SDL_GetTicks
SDL_Quit会调用SDL_TicksQuit,后者一旦执行后,会让之后的紧接那次SDL_GetTicks返回0!后面则是在0之后按正常值增加。也就是说,SDL_Quit会使得SDL_GetTicks出现一个“置为0然后从0开始增加”的折拐。由于应用会把SDL_GetTicks在“整个生存期”只会增加视为公理,为此SDL_Quit要尽可能放在“外头”。
Rose中是CVideo的析构函数会调用SDL_Quit,而CVideo是game_controller中成员。为此要没什么意外,凡是涉及到SDL的代码都要放在game_controller构造函数之后(目的是在game_controller析构执行之前让它们完成析构)。