【问题标题】:Why does CA_LAYER_SURFACE=0 improve core animation performance?为什么 CA_LAYER_SURFACE=0 会提高核心动画性能?
【发布时间】:2017-09-03 18:00:48
【问题描述】:

我正在为带有核心动画的 macOS 构建一个滚动密集型应用程序。我一直在使用CA Instrument 来帮助优化。在执行此操作时,我注意到一些奇怪的事情......我的应用在 CA Instrument 调试工具下运行时的帧速率比正常运行时更好。

我发现根本原因是 CA Instrument 工具将 CA_LAYER_SURFACE 环境变量设置为 0。这样做会更改 cocoa 用于渲染核心动画层的代码路径,因此我的应用程序从 55fps 变为 60fps 并且明显滚动更流畅。

谁能告诉我更多关于这个 CA_LAYER_SURFACE 标志的信息。从上面链接到文章似乎包含它会启用旧行为。但如果是这样的话,为什么旧​​的行为会被新的较慢的行为所取代呢?如果我决定在我的生产应用程序中将此标志设置为 CA_LAYER_SURFACE=0,会有什么权衡?

谢谢!

更新

一旦我改变了创建屏幕外渲染上下文的方式,大部分性能提升就消失了(即两个版本都很快),如下所述:

Fastest way to draw offscreen CALayer content

我还发现了更多关于标志的信息,如我在下面发布的答案中所述。

【问题讨论】:

    标签: macos core-animation


    【解决方案1】:

    这些发行说明(搜索“对图层渲染的更改”)解释了标志的作用:

    AppKit Release Notes – Changes to layer rendering

    标志本身不是文档。但是将NSView.layerUsesCoreImageFilters 设置为true 具有相同的效果:在进程中而不是在进程外渲染图层,这是新的默认设置。

    我不完全理解权衡,但对我来说,要点是您不需要使用未记录的 CA_LAYER_SURFACE 标志,而只需设置 NSView.layerUsesCoreImageFilters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 2011-03-30
      • 2012-10-03
      • 2016-01-30
      • 2020-08-22
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多