2009-09-17 62 views
9

我在阅读拉里奥斯特曼关于debugging a flickering problem in the Windows Vista/7 volume control的最新博客文章,我突然意识到我无法想起在我的OS X笔记本电脑上看到应用程序闪烁。即使是写得很差的应用程序也能避免我经历的闪烁问题。如果没有这变成一个苹果与Windows的辩论(请),为什么OS X应用程序似乎没有相同的闪烁问题为什么OS X没有像Windows那样的闪烁问题?

我很难相信苹果开发人员在编程无闪烁GUI时简直令人惊叹,而Windows程序员吮吸,所以这是什么原因? OS X API是否需要所有GUI来实现双缓冲?虽然有些应用程序具有稍微缓慢的双缓冲大小调整行为,但许多应用程序却没有,并且仍然避免闪烁。 OS X重新绘制流程从某种程度上与Windows完全不同,完全避免了WM_ERASEBKGRND问题?或者还有其他可能性,我没有看到?

更新:感谢您的回答。我希望我可以选择ken和cb160的答案,因为它们都有帮助。

回答

9

Windows Vista/7和OSX都使用合成引擎在屏幕上绘制栅格化位图。这些合成引擎负责处理来自所有窗口的输出并绘制最终的屏幕图像。这种合成方法是当OSX最小化到码头以及aero如何绘制半透明边框时,OSX如何使用genie效果。它们还可以防止闪烁,就好像填充屏幕特定区域的位图不可用一样,它将使用已有的图像而不是绘制空白区域。

自从首次发货以来,OSX就有了一个合成引擎。当时,很多人认为这是一个疯狂的举动,因为当时发布的所有显卡都优化了绘制位图(即窗口按钮和边框)而不是合成图像。在后来的OSX版本中,合成被推送到了GPU(在Quartz Extreme中),所以从CPU中消耗了大量的负担,并且使更多的效果成为可能。

由于Windows合成器仅在Windows Vista中添加,并且只有在有可用的GPU且您拥有合适的操作系统版本时,才会与OSX中的Quartz Compositer一样普遍。由于在Windows中并不总是使用合成器,因此当区域空白并且负责绘制的应用程序无法足够准确地重绘区域时,将发生闪烁。

16

Mac OS X有double buffered windows

您不必做任何事情就可以做到。它在幕后。

当某些事情发生变化时,你(几乎总是)不会明确地绘制到Cocoa中的某个窗口,从而导致窗口区域无效。该框架稍后将下降视图的层次结构,并将窗口的脏区域绘制到辅助缓冲区中。然后它交换缓冲区。

您可以选择性地做出一些允许框架在重绘时采用快捷方式的承诺,但它们都是选择性的。只有精明的观点受到影响。

如果您的NSView的子类实现isOpaque方法来返回YES,那么框架将永远不会清除您的视图背后的任何内容或绘制它下面的任何视图。

执行preservesContentDuringLiveResize返回YES会给您一些额外的责任,但可以提高窗口大小调整期间的性能。

10.6增加了另外两种这种新的API,layerContentsRedrawPolicylayerContentsPlacement

最后,自定义绘图不如Windows。您看到的大部分视图都是框架提供的,而不是子类。框架提供的手段是通过苹果优化的。

1

是的,它都是自动双缓冲。当然,如果你正在运行mac os 9的 遗留代码,或者从windoze移植代码,那意味着你可能在不知道它的情况下进行三重缓冲。嘿,周期很便宜!