【问题标题】:replacing CALayer arrays with CAMetalLayer arrays用 CAMetalLayer 数组替换 CALayer 数组
【发布时间】:2019-04-02 18:21:32
【问题描述】:

我有一个绘画应用程序,它可以在任何给定时间通过UIImageView 以交互方式显示来自大约 200 个 CALayers 数组的内容。我得到了合理的性能,但我想知道使用 CAMetalLayers 是否有任何性能优势。特别是,我很好奇我是否可以从将纹理直接传送到每个CAMetalLayer 中受益,并且一次堆叠/显示这么多CAMetalLayers 是否有任何硬件考虑因素。

在实施之前我应该​​考虑什么问题,我是否应该继续使用UIImageView(或其他)来托管这些新的 Metal 支持的子层?任何想法将不胜感激。

【问题讨论】:

  • 你只是在找 200 层的麻烦。你会以这种方式烧掉所有的应用程序内存。你为什么要尝试以这种方式实现绘画应用程序?您是否尝试支持多个撤消步骤?更好的方法是使用 1 层,将所有组合的绘画步骤收集到 1 个纹理中,然后可以通过单个操作将其写入金属可绘制对象。
  • 撤消正是原因。每个 CALayer 只包含一个笔触,并且它非常有效,因为它只是笔触边界框的大小。诚然,200 层是上限,但到目前为止,通过此实现,内存消耗得到控制。您能稍微扩展一下您建议的方法吗?
  • 总而言之,iOS 将无法以您描述的方法处理内存使用情况。如果您只在 Mac 上运行,那么您可能能够摆脱更多层,但 iOS 会生成内存警告,然后您的应用程序将因内存使用而被终止。正确的做法是将“笔触”数据存储为 X、Y 和元数据,如笔触宽度和颜色等。然后,在任何时候,您都可以通过从元数据到撤消返回的位置重建整个组合缓冲区来“撤消”。
  • 这里有一些关于我正在谈论的内存使用类型的原始数字,您将存储为像素缓冲区的每个“笔划”都与视频帧相同:modejong.com/blog/post5_video_and_memory_usage_on_ios_devices/…
  • 我是说你的设计的根本问题是内存使用。正确的解决方法是建立一个“正在进行”的纹理,将所有笔画收集为一个像素缓冲区。如果用户启动撤消操作,则可以通过重建缓冲区来实现撤消。在正常情况下,没有撤消,也没有内存或性能问题。

标签: arrays uiimageview calayer metal


【解决方案1】:

那是行不通的。您应该跟踪您的中风数据。例如,一个点数组将是一个笔画,然后你应该有一个这些笔画的数组。它可能只是点 (x, y) 或更可能还包含颜色、大小和其他变量。你应该知道你需要什么来描述你的中风。

然后用它来绘制(在这些位置盖章)。当你想撤消时,只需从头开始绘制数组中的所有笔划,直到n-1,n-2等......

【讨论】:

  • 我确实拥有所有这些数据,并且我可能可以按照建议实施。我担心在我的历史中前后擦洗会产生影响(就像我现在一样,任意通过历史滑块)......换句话说,我会推动 Metal 在一小部分中绘制数百到数千个冲压多边形一秒钟。我知道 Metal 非常有能力,但我正在尝试一种聪明的方法来构建它,这样我就可以保持高度的交互性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2012-01-26
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多