C++ SDL学习之路 2nd —— 扩展 —— SDL中的双缓冲

时间:2021-04-25 12:06:04

还记得么,C++ SDL学习之路 2nd的时候我说过要有一个扩展的博文,现在来了!

C++ SDL学习之路 2nd中有下面一段话:

如果这是我们画的唯一的代码,我们仍然看不到我们在屏幕上加载的图像。还有一个步骤。

SDL_UpdateWindowSurface( gWindow );

重点就在这行代码:

SDL_UpdateWindowSurface( gWindow );

只有用了SDL_UpdateWindowSurface后表面(就是窗口)才会刷新,之后才会显示之前使用的图片。官方教程中是这样解释的:

当你画到屏幕上时,你通常不会在你看到的屏幕上画出图像。
(原因:)
默认情况下,大多数系统呈现都是双缓冲的。
这两个缓冲区分为前面和后面的缓冲区。
当你做像SDL_BlitSurface这样的绘制调用时,你会渲染到后缓冲区。
你在屏幕上看到的是前缓冲。

所以我们需要用SDL_UpdateWindowSurface来将后缓冲区的东西画到前缓冲区,也就让你看到了你之前所绘制的东西。

这个有什么用呢?

其中最大的作用:
C++ SDL学习之路 2nd —— 扩展 —— SDL中的双缓冲

画了一条线。
放了一张图片。
又画了一条线在图片上。
又放了一张图片。

计算机的运算速度是嗖嗖的,假设是立刻执行绘图每一行代码的话,如果你用一个无限循环执行上面的事情,你就会发现整个屏幕一白一白(闪屏)的,所以用到了双缓冲。
如果上面的4行并不是实时立刻执行的,而是有了 刷新 这行代码再绘图上面所有的事情,也就是这样:

画了一条线。
放了一张图片。
又画了一条线在图片上。
又放了一张图片。
刷新

这样就不会有闪屏了。
这里的 刷新 也就相当于SDL_UpdateWindowSurface。
在双缓冲中,所有的绘图(包括放图片什么的)都是画到后缓冲了,SDL_UpdateWindowSurface后就把这些画到前缓冲了,也就不会闪屏了,还能提高效率。

好吧,你能不能理解看你喽,我初二的词汇已经用尽了。

3rd会将2nd无法关闭SDL窗口的问题解决。