如果Core Graphics在引擎盖下使用Metal,Metal的实现是否能比CG更快?为什么



假设我想开发一个Paint应用程序,并且需要实现一个笔刷引擎。对于光栅笔刷,您基本上需要在具有给定间距的触摸位置上标记纹理。

--任务:在较大的图像上合成一个小图像(笔尖)。

我决定首先在CG中使用CGContext来渲染邮票,并发现即使使用合并的触摸和合适大小的画布(CGContext输出大小),它也表现得很好。

然而,由于我需要在非常大的纹理上作画(8000x6000会很好),我决定给金属一个机会。我知道,对于一个有金属背景的人来说,这项任务可能微不足道,但我是这个领域的新手。因此,我尝试使用CIFilters(Metal-backed)在画布上合成笔刷,并将其显示在自定义MetalImageView:GTKView中。

我认为将画布和画笔作为CIImages并在金属层中显示它们已经比天真的CG实现更具性能了。但事实并非如此。CIFilter方法在每一个印记(at:Point)渲染整个画布,无论在CG中我只是刷新该点周围的一个小矩形。

现在,我想如果我能改变计算的范围,我可以用CIFilter实现这一点。我不知道Core Image是否可以做到这一点,但我相信,对于有经验的人来说,在金属领域会很容易。

--问题:考虑到CG在引擎盖下运行金属,纯金属实现是否可以比CG实现更快地冲压图像?如果是,速度有多快?如何做到这一点值得学习吗?还是我应该更好地花时间改进CG的实现?

请注意,我要的是光栅笔刷,而不是带有贝塞尔路径的矢量笔刷,它更容易编码,运行速度更快,但不能使用纹理笔刷。

我真的很感激任何帮助。

实际上《核心映像编程指南》中有一章是关于这一点的。它们使用CIImageAccumulator类描述了在相同纹理中的连续绘制。您也可以下载示例应用程序。

我认为就表现而言,不应该有太大的差异。您应该能够通过告诉核心图像笔刷笔划过滤器的感兴趣区域和定义域(extent)来进行大量优化。然后,它应该能够只渲染图像的必要部分,而不是在每一帧中渲染整个图像。

最新更新