代码之家  ›  专栏  ›  技术社区  ›  Derek Park

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

  •  10
  • Derek Park  · 技术社区  · 17 年前

    我在读拉里·奥斯特曼的最新博客文章 debugging a flickering problem in the Windows Vista/7 volume control 我突然意识到,我无法回忆起在我的OSX笔记本电脑上看到应用程序闪烁的情景。在我的经验中,即使是写得不好的应用程序也可以避免闪烁问题。如果不把这变成一场苹果与Windows的辩论(请), 为什么OSX应用程序似乎没有同样的闪烁问题? ?

    我很难相信苹果的开发人员仅仅是对编程无闪烁的gui感到惊奇,而Windows的编程人员却很差劲,那是什么原因呢?OS X API是否需要所有的GUI来实现双缓冲?虽然有些应用程序有轻微的双缓冲调整行为,但很多应用程序没有,它们仍然避免闪烁。OS X重新绘制流程是否与Windows有根本不同,避免了 WM_ERASEBKGRND 完全是问题?或者还有其他我看不见的可能性吗?

    更新:谢谢你的回答。我希望我能同时选择肯和CB160的答案,因为它们都很有用。

    3 回复  |  直到 17 年前
        1
  •  10
  •   Robert Christie    17 年前

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

    OSX自首次发货以来就有一个合成引擎。当时,很多人认为这是一个疯狂的Appraoch,因为当时所有的视频卡都被优化为绘制位图(即,Windows按钮和边框),而不是合成图像。在后来的OSX版本中,合成被推到GPU(在Quartz-Extreme中),因此从CPU上卸下了大量的负载,并使更多的效果成为可能。

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

        2
  •  16
  •   Ken    17 年前

    Mac OS X double buffered windows .

    你不必做任何事来实现它。在幕后。

    你(几乎总是)没有明确地在Cocoa中绘制一个窗口,当某些东西发生变化时,你会使窗口的某个区域失效。框架稍后将下降视图的层次结构,并将窗口的脏区域绘制到辅助缓冲区中。然后它交换缓冲区。

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

    如果nsview的子类实现了 isOpaque 方法返回yes,则框架将永远不会清除视图后面的任何内容或在其下绘制任何视图。

    实施 preservesContentDuringLiveResize 返回“是”会给您一些额外的职责,但可以在窗口调整大小期间提高性能。

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

    最后,自定义绘图不如在窗口上常见。您看到的大多数视图都是框架提供的,而不是子类的。框架提供的手段由苹果优化。

        3
  •  1
  •   ddyer    17 年前

    是的,都是自动双缓冲的。当然,如果你在跑步 Mac OS 9的遗留代码,或者从windoze移植的代码,这意味着你是 可能是三重缓冲而不知道。嘿,自行车很便宜!