还记得么,C++ SDL学习之路 2nd的时候我说过要有一个扩展的博文,现在来了!
在C++ SDL学习之路 2nd中有下面一段话:
如果这是我们画的唯一的代码,我们仍然看不到我们在屏幕上加载的图像。还有一个步骤。
SDL_UpdateWindowSurface( gWindow );
重点就在这行代码:
SDL_UpdateWindowSurface( gWindow );
只有用了SDL_UpdateWindowSurface后表面(就是窗口)才会刷新,之后才会显示之前使用的图片。官方教程中是这样解释的:
当你画到屏幕上时,你通常不会在你看到的屏幕上画出图像。
(原因:)
默认情况下,大多数系统呈现都是双缓冲的。
这两个缓冲区分为前面和后面的缓冲区。
当你做像SDL_BlitSurface这样的绘制调用时,你会渲染到后缓冲区。
你在屏幕上看到的是前缓冲。
所以我们需要用SDL_UpdateWindowSurface来将后缓冲区的东西画到前缓冲区,也就让你看到了你之前所绘制的东西。
这个有什么用呢?
其中最大的作用:
你
画了一条线。
放了一张图片。
又画了一条线在图片上。
又放了一张图片。
计算机的运算速度是嗖嗖的,假设是立刻执行绘图每一行代码的话,如果你用一个无限循环执行上面的事情,你就会发现整个屏幕一白一白(闪屏)的,所以用到了双缓冲。
如果上面的4行并不是实时立刻执行的,而是有了 刷新 这行代码再绘图上面所有的事情,也就是这样:
画了一条线。
放了一张图片。
又画了一条线在图片上。
又放了一张图片。
刷新
这样就不会有闪屏了。
这里的 刷新 也就相当于SDL_UpdateWindowSurface。
在双缓冲中,所有的绘图(包括放图片什么的)都是画到后缓冲了,SDL_UpdateWindowSurface后就把这些画到前缓冲了,也就不会闪屏了,还能提高效率。
好吧,你能不能理解看你喽,我初二的词汇已经用尽了。
3rd会将2nd无法关闭SDL窗口的问题解决。