0

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

4

2 回答 2

1

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

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

虽然文档没有说太多,但还是有区别的,例如,我知道当使用 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-04T20:01:47.937 回答
0

SDL_UpdateRect()与表面类型无关。(使用 SDL OpenGL 时不要使用它)。每当您必须更新 SDL_Surface 的(部分)时,都应该调用它。事实上,每次你翻转一个表面时,SDL_UpdateRect(screen, 0, 0, 0, 0)都会调用那个表面。

于 2013-03-03T10:14:28.300 回答