SDL

SDL_RenderCopyEx、SDL_GetTicks

一、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如何工作,以下是几个结论。

  1. 旋转前后,两个纹理的像素是一一对应,因而不会存在旋转后图像失真,也不会存在被削去。
  2. SDL只有一份顶点着色器代码,即GLES2_VertexSrc_Default_,或旋转或不旋转都在用它,因而和不旋转相比,旋转不会增加cpu、gpu开销。
  3. 如何填写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析构执行之前让它们完成析构)。

 

全部评论: 0

    写评论: