SDL库:确实需要为SDL_HWSURFACE调用SDL_UpdateRect()吗?

时间:2013-03-03 10:05:47

标签: graphics sdl

我是SDL的新手,到目前为止我已经阅读了十几个入门教程。我对硬件和软件表面之间的差异(即调用SDL_SetVideoMode()中的SDL_HWSURFACE和SDL_SWSURFACE标志)以及SDL_UpdateRect()对每种类型的表面的行为方式感到有些困惑。我的理解是,对于硬件表面,不需要调用SDL_UpdateRect(),因为正在直接绘制到显示屏幕。但是,此Wikibooks教程(http://en.wikibooks.org/wiki/SDL_%28Simple_DirectMedia_Layer%29)中的示例另有说明:它在硬件表面上调用SDL_UpdateRect()。

2 个答案:

答案 0 :(得分:1)

  

我对硬件和软件表面之间的区别(即调用SDL_SetVideoMode()中的SDL_HWSURFACE和SDL_SWSURFACE标志感到有点困惑)

在SDL文档AFAIK中,他们只是声明软件表面存储在系统内存(您的计算机RAM)中,硬件表面存储在视频内存(您的GPU RAM)中,硬件表面可以利用硬件加速(请参阅下面的SDL_Flip)。

尽管文档没有说太多,但是存在差异,例如,我知道在使用alpha混合软件时,表面优于硬件性能。我还听说软件表面更适合直接像素访问,但我无法确认。

  

以及SDL_UpdateRect()对每种表面类型的行为

两者的行为相同:函数更新给定曲面中的给定矩形。也许,在实现方面,必须存在差异,但同样,文档也没有说明任何内容。

对于SDL_Flip虽然它是一个不同的故事:当它与硬件表面一起使用时,它会尝试交换视频缓冲区(仅当硬件支持双缓冲时才有可能,请记住将SDL_DOUBLEBUF标志传递给SDL_SetVideoMode)。如果硬件不支持双缓冲或者它是软件表面,则SDL_Flip调用相当于使用SDL_UpdateRect(SDL_UpdateRect(屏幕,0,0,0,0))更新整个表面区域。

  

我的理解是,对于硬件表面,不需要调用SDL_UpdateRect(),因为正在直接绘制到显示屏幕。

不,你应该像使用软件表面一样调用它。

另请注意,在SDL_UpdateRect和SDL_Flip函数上为surface参数选择的名称可能有点误导:参数名称是屏幕,但它可以是任何SDL_Surface(不仅仅是表示用户屏幕的表面)。大多数时候(至少对于简单的应用程序而言)你只会在屏幕表面上进行blitting,但是在非用户屏幕的其他表面中进行blit是有意义的(有时需要)。

答案 1 :(得分:0)

SDL_UpdateRect()与表面类型无关。(使用SDL OpenGL时不要使用它)。每当必须更新SDL_Surface的(部分)时,都应该调用它。 实际上,每当flip表面SDL_UpdateRect(screen, 0, 0, 0, 0)为该表面调用时,