首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL库: SDL_HWSURFACE真的需要调用SDL_UpdateRect()吗?

SDL库: SDL_HWSURFACE真的需要调用SDL_UpdateRect()吗?
EN

Stack Overflow用户
提问于 2013-03-03 18:05:47
回答 2查看 1.4K关注 0票数 0

我是SDL的新手,到目前为止,我已经阅读了十几个入门教程。我对硬件表面和软件表面(即SDL_SetVideoMode()调用中的SDL_HWSURFACE和SDL_SWSURFACE标志)之间的区别以及SDL_UpdateRect()对于每种类型的表面的行为有些困惑。我的理解是,对于硬件表面,不需要调用SDL_UpdateRect(),因为可以直接在显示屏上绘制。然而,这篇维基图书教程(http://en.wikibooks.org/wiki/SDL_%28Simple_DirectMedia_Layer%29)中的示例却显示了不同的情况:它在硬件表面上调用SDL_UpdateRect()。

EN

回答 2

Stack Overflow用户

发布于 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是有意义的(有时是必要的)。

票数 1
EN

Stack Overflow用户

发布于 2013-03-03 18:14:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15184549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档