11

我正在阅读 Larry Osterman 关于调试 Windows Vista/7 音量控制中闪烁问题的最新博客文章,我突然意识到我不记得曾经在我的 OS X 笔记本电脑上看到过应用程序闪烁。根据我的经验,即使是看起来写得很糟糕的应用程序也能避免闪烁问题。如果没有这变成 Apple 与 Windows 的辩论(请),为什么 OS X 应用程序似乎没有同样的闪烁问题

我很难相信 Apple 开发人员在编写无闪烁 GUI 方面简直令人惊叹,而 Windows 程序员却很糟糕,那么原因是什么?OS X API 是否需要所有 GUI 来实现双缓冲?虽然一些应用程序的双缓冲调整大小行为稍显迟缓,但许多应用程序没有,而且它们仍然避免闪烁。OS X 重绘流程是否与 Windows 有根本的不同,WM_ERASEBKGRND完全避免了这个问题?或者还有其他一些我没有看到的可能性?

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

4

3 回答 3

17

Mac OS X 有双缓冲窗口

你不需要做任何事情来实现它。它在幕后。

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

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

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

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

10.6 添加了另外两个新的此类 API,layerContentsRedrawPolicy并且layerContentsPlacement.

最后,自定义绘图不如 Windows 上常见。您看到的大多数视图都是框架提供的,而不是子类的。框架提供意味着苹果优化。

于 2009-09-17T07:11:37.540 回答
11

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

OSX 自首次发布以来就拥有一个合成引擎。当时,很多人认为这是一种疯狂的方法,因为当时发布的所有视频卡都经过优化以绘制位图(即窗口按钮和边框)而不是合成图像。在更高版本的 OSX 中,合成被推到 GPU 上(在 Quartz Extreme 中),因此减轻了 CPU 的大量负载并使更多效果成为可能。

因为 Windows 合成器仅在 Windows Vista 中添加,并且仅在有可用的 GPU 并且您拥有正确版本的操作系统时才添加,因此它不像 OSX 中的 Quartz Compositer 那样普遍。因为合成器并不总是在 Windows 中使用,所以当一个区域被空白并且负责绘制的应用程序不能足够快地重新绘制该区域时,会发生闪烁。

于 2009-09-17T07:52:30.883 回答
2

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

于 2009-09-17T07:23:30.857 回答