我正在阅读Larry Osterman关于在Windows Vista / 7音量控制中debugging闪烁问题的最新博客文章,我突然意识到,我无法想起在我的OS X笔记本电脑上看到应用程序闪烁。 即使应用程序,否则似乎写得不好,避免了我的经验闪烁问题。 如果没有这个变成一个苹果与Windows的辩论(请), 为什么OS X应用程序似乎没有相同的闪烁问题 ?
我很难相信苹果开发人员在编程无闪烁的GUI时非常了不起,而Windows程序员却吮吸,所以这是什么原因呢? OS X API是否需要所有GUI来实现双缓冲? 虽然有些应用程序具有稍微缓慢的双缓冲大小调整行为,但许多应用程序却不行,而且仍然避免闪烁。 OS X重新绘制stream程从根本上不同于Windows,完全避免了WM_ERASEBKGRND问题? 还是有其他的可能性,我没有看到?
更新:谢谢你的回答。 我希望我可以selectken和cb160的答案,因为它们都有帮助。
Windows Vista / 7和OSX都使用合成引擎在屏幕上绘制栅格化的位图。 这些合成引擎负责处理所有窗口的输出并绘制最终的屏幕图像。 这种合成方法是当OSX最小化到码头时,OSX如何能够使用genie效果,以及aero如何绘制半透明边框。 它们还可以防止闪烁,就好像位图填充屏幕的特定区域不可用,它将使用已经有的图像而不是绘制空白区域。
自从OSX首次发布以来,OSX就有了一个合成引擎。 当时很多人认为这是一个疯狂的举动,因为当时所有的视频卡都会优化绘制位图(即窗口按钮和边框)而不是合成图像。 在后来的OSX版本中,合成被推送到了GPU(在Quartz Extreme中),所以CPU占用了大量的资源,使得更多的效果成为可能。
由于Windows合成器仅在Windows Vista中添加,并且只有在可用的GPU和操作系统版本正确的情况下,它才不像OSX中的Quartz Compositer那样普遍。 因为在Windows中并不总是使用合成器,所以当区域被消隐时,将发生闪烁,并且负责绘制的应用程序不能够足够准确地重绘该区域。
Mac OS X具有双缓冲窗口 。
你不必做任何事情就可以实现。 它在幕后。
你(几乎总是)在Cocoa中没有明确地绘制一个窗口,当某些东西改变的时候,你使窗口的一个区域无效。 该框架稍后将下降视图的层次结构,并将窗口的脏区域绘制到辅助缓冲区中。 然后交换缓冲区。
您可以选择性地做出一些允许框架在重绘时采用快捷方式的承诺,但是都是选择性的。 只有精明的意见受到影响。
如果你的NSView的子类实现isOpaque方法返回YES,那么框架将永远不会清除你的视图背后的任何东西,或者在它下面绘制任何视图。
实现preservesContentDuringLiveResize返回YES给你一些额外的责任,但可以提高窗口调整大小时的性能。
10.6又增加了两种这样的新API,即layerContentsRedrawPolicy和layerContentsPlacement 。
最后,自定义绘图不如Windows。 您看到的大部分视图都是框架提供的,而不是子类。 框架提供的手段是通过苹果优化的。
是的,这全是双缓冲自动。 当然,如果你从mac os 9运行遗留代码,或者从windoze移植代码,这意味着你可能三倍缓冲而不知道它。 嘿,周期很便宜!