我是SDL的新手,到目前为止,我已经阅读了十几个入门教程。我对硬件表面和软件表面(即SDL_SetVideoMode()调用中的SDL_HWSURFACE和SDL_SWSURFACE标志)之间的区别以及SDL_UpdateRect()对于每种类型的表面的行为有些困惑。我的理解是,对于硬件表面,不需要调用SDL_UpdateRect(),因为可以直接在显示屏上绘制。然而,这篇维基图书教程(http://en.wikibooks.org/wiki/SDL_%28Simple_DirectMedia_Layer%29)中的示例却显示了不同的情况:它在硬件表面上调用SDL_UpdateRect()。
发布于 2013-03-05 04:01:48
我对硬件和软件表面的区别感到有点困惑(例如,调用SDL_SetVideoMode()时的SDL_HWSURFACE和SDL_SWSURFACE标志)
在SDL文档AFAIK中,它们简单地说明了软件表面存储在系统内存(计算机内存)中,硬件表面存储在视频内存( GPU RAM)中,并且硬件表面可以利用硬件加速(参见下面的SDL_Flip)。
虽然文档中没有太多的说明,但还是有区别的,例如,我知道当使用alpha混合时,软件表面比硬件表面的性能更好。我还听说软件表面更适合直接访问像素,但我不能证实这一点。
以及SDL_UpdateRect()对于每种类型的曲面的行为方式
两者的行为是相同的:该函数更新给定曲面中的给定矩形。也许,在实现方面,一定会有差异,但是,文档并没有说明任何关于它的内容。
但对于SDL_Flip则是另一回事:当它与硬件表面一起使用时,它会尝试交换视频缓冲区(只有当硬件支持双缓冲时才有可能,记住要将SDL_DOUBLEBUF标志传递给SDL_SetVideoMode)。如果硬件不支持双缓冲或如果它是软件表面,则SDL_Flip调用等同于用SDL_UpdateRect (SDL_UpdateRect(screen,0,0,0,0))更新整个表面区域。
我的理解是,对于硬件表面,不需要调用SDL_UpdateRect(),因为可以直接在显示屏上绘制。
不,你应该把它叫做软件表面。
另请注意,在SDL_UpdateRect和SDL_Flip函数上为表面参数选择的名称可能会有一点误导:参数名称是SDL_Surface,但它可以是任何屏幕(而不仅仅是表示用户屏幕的表面)。大多数时候(至少对于简单的应用程序),您将只在屏幕表面上进行blit,但在非用户屏幕的其他表面上进行blit是有意义的(有时是必要的)。
发布于 2013-03-03 18:14:28
SDL与曲面类型无关(使用SDL OpenGL时不要使用SDL_UpdateRect() )。每当您需要更新SDL_Surface的一个(部分)时,都应该调用它。实际上,每次您flip一个表面时,都会为该表面调用一个SDL_UpdateRect(screen, 0, 0, 0, 0)。
https://stackoverflow.com/questions/15184549
复制相似问题