【问题标题】:CIImage and CIFilter implementation specificsCIImage 和 CIFilter 实现细节
【发布时间】:2023-03-17 06:38:01
【问题描述】:

我对 Core Image 系统的底层实现有疑问。我在彼此之上添加了一些CIImages。不多,大概有五六个。为了节省内存和性能,它们都裁剪了透明像素。然后在偏移量处绘制它们,因此我使用@"CIAffineTransform" 过滤器来定位它们。

CIFilter* moveFilter = [CIFilter filterWithName:@"CIAffineTransform"];

我的问题是: moveFilter.outputImage 真的会生成新图像,还是会生成稍后用于绘制实际图像的“渲染设置”?

(如果是第一个,那意味着我有效地渲染了两次图像。这将是 Core Image API 中的一个巨大缺陷,很难相信 Apple 会以这种方式创建它。)

【问题讨论】:

    标签: ios performance core-graphics core-image cifilter


    【解决方案1】:

    过滤器不会生成任何东西。 outputImage 不会产生任何东西。 CIImage 不会生成任何东西。您所做的只是构建一个过滤器链。

    在您明确要求它发生之前,不会发生对位图的渲染。您可以通过以下两种方式之一执行此操作:

    • 调用 CIContext createCGImage:fromRect:

    • 实际上将基于 CIImage 的 UIImage 绘制到图形上下文中。

    【讨论】:

    • 但是当我开始渲染时,它是在后台创建中间位图,还是为绘图操作设置转换矩阵?看表现,好像是先做的。
    • 当你做我提到的两件事中的任何一件时,然后只有这样所有的渲染才会发生,kaboom。这在 iOS 上可能会很耗时,因为它没有某些过滤器的数学 cojones(例如高斯模糊;实际上,出于这个原因,某些过滤器完全不在讨论范围内)。与 CIFilter / CIImage 相关的任何其他内容都不会占用任何时间/空间。基本上你只是让我重复自己......
    • 是的,在我的评论中,我问,当渲染开始时(你的两个要点之一),它是否会:将 2 个图像组合成新纹理 => 在下一个过滤器中使用新纹理 - 或- 是否可以:将 2 个图像(或仿射变换和一个图像)组合成“渲染管道设置”以在最终目标纹理上绘制?
    • 在游戏引擎中使用第二个选项。但是看看使用和不使用简单 TRANSLATION MATRIX 的性能,iOS 似乎在后台创建了一个额外的纹理以输出到最终图像。
    • CIFilters 在 iOS 设备上可能会变慢,这是肯定的 - 正如我在之前的评论中已经提到的那样。它们是为台式机设计的,处理器的功能要强大几个数量级。这就是为什么有像GPUImage 这样的替代品的原因——你可以试试看。
    猜你喜欢
    • 2014-07-14
    • 2014-01-13
    • 2021-09-10
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多