为什么OSX没有Windows那样的闪烁问题?

为什么OSX没有Windows那样的闪烁问题?,windows,user-interface,macos,flicker,Windows,User Interface,Macos,Flicker,我正在阅读拉里·奥斯特曼(Larry Osterman)最近的博客文章,突然意识到我不记得在我的OS X笔记本电脑上看到过应用程序闪烁。根据我的经验,即使是编写得很差的应用程序也可以避免闪烁问题。如果这没有演变成苹果与Windows的辩论,为什么OSX应用程序似乎没有同样的闪烁问题 我很难相信苹果的开发人员在编程无闪烁GUI方面非常出色,而Windows程序员却很差劲,那么原因是什么呢?OSXAPI是否要求所有GUI实现双缓冲?虽然有些应用程序具有稍微缓慢的双缓冲大小调整行为,但许多应用程序没有

我正在阅读拉里·奥斯特曼(Larry Osterman)最近的博客文章,突然意识到我不记得在我的OS X笔记本电脑上看到过应用程序闪烁。根据我的经验,即使是编写得很差的应用程序也可以避免闪烁问题。如果这没有演变成苹果与Windows的辩论,为什么OSX应用程序似乎没有同样的闪烁问题

我很难相信苹果的开发人员在编程无闪烁GUI方面非常出色,而Windows程序员却很差劲,那么原因是什么呢?OSXAPI是否要求所有GUI实现双缓冲?虽然有些应用程序具有稍微缓慢的双缓冲大小调整行为,但许多应用程序没有,它们仍然避免闪烁。OSX重绘流程是否与Windows有根本的不同,完全避免了WM_擦除BKGRND问题?还是有其他我没有看到的可能性

更新:谢谢你的回答。我希望我能选择ken和cb160的答案,因为它们都很有帮助。

MacOSX有

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

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

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

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

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

10.6添加了另外两个此类新API,LayerContentsRelawPolicy和layerContentsPlacement


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

是的,它都是自动双缓冲的。当然,如果你正在跑步 mac os 9的遗留代码,或windoze移植的代码,这意味着您将
可能在不知情的情况下进行三重缓冲。嘿,自行车很便宜

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

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

由于Windows合成器仅在Windows Vista中添加,并且只有在GPU可用且您拥有正确版本的操作系统时才添加,因此它不像OSX中的石英合成器那样普及。由于合成器并不总是在窗口中使用,因此当区域被消隐且负责绘制的应用程序无法足够准确地重新绘制区域时,将发生闪烁