【问题标题】:How to detect hardware acceleration for Core Image?如何检测 Core Image 的硬件加速?
【发布时间】:2014-05-24 06:24:23
【问题描述】:

在我的应用程序中,我在 CALayer 动画期间使用了“CIMotionBlur”CIFilter。问题是当硬件加速不可用时过滤器无法正常工作:

  • 在 OS X 安全模式下,图层在动画期间变得不可见;
  • 使用 VMWare Fusion 时,动画速度慢得让人难以忍受,这让测试应用变得更加困难;

没有过滤器的动画效果很好。我只想在硬件加速可用时应用过滤器。

让我知道何时禁用过滤器的最高级别 API 是什么? 我要在IOKit中寻找线索。

【问题讨论】:

  • 您是在没有 Mac 的情况下进行开发吗?
  • 我在 Mac 上开发,但我使用 VMWare 在早期的 OS X 版本上进行测试。
  • 我遇到了类似的问题,不确定您是否找到了在您遇到问题时可以解决的问题:stackoverflow.com/questions/23814022/…

标签: macos cocoa core-animation core-image cifilter


【解决方案1】:

我在技术问答QA1218中找到了答案
“我如何判断一个特定的显示器是否正在被 Quartz Extreme 硬件加速?”

就这么简单:

NSNumber* curScreenNum = [self.window.screen.deviceDescription objectForKey:@"NSScreenNumber"];
if (CGDisplayUsesOpenGLAcceleration(curScreenNum.integerValue))
{
    // Do accelerated stuff
}

在我的情况下按预期工作。

【讨论】:

    【解决方案2】:

    https://developer.apple.com/library/ios/documentation/graphicsimaging/Conceptual/CoreImaging/ci_concepts/ci_concepts.html#//apple_ref/doc/uid/TP30001185-CH2-TPXREF101

    我想你可以用这个来确定你想要的过滤器是否可用。如果 Core Image 不可用,它们可能不可用。

    【讨论】:

    • 感谢您的建议。不幸的是,[CIFilter filterNamesInCategory:kCICategoryBlur] 在这两种情况下都会返回过滤器。
    【解决方案3】:

    如果 filterNamesInCategory 返回 CIMotionBlur 过滤器的名称,即使它不可用,那么您应该向 Apple 的错误报告者提交错误报告。

    作为进一步的测试,您可以调用 filterWithName 并检查非零结果。如果返回 nil,则表明过滤器可用。

    或者你是说在没有硬件加速的平台上,你得到一个过滤器但它不起作用?如果是这种情况,那么是时候提交错误报告了。

    或者,你是说在非硬件加速平台上,你得到一个有效的过滤器,但它太慢而无用?

    在文档中四处寻找,我没有看到任何方法可以判断 Core Image 是否针对给定平台进行了硬件加速。

    但是,CI 过滤器是在 OpenGL 之上构建的,您可以查询 OpenGL 驱动程序以查看它是否是硬件加速的。我的猜测是,这样的查询结果也会告诉你 CIFilters 是否是硬件加速的。

    【讨论】:

    • [CIFilter filterWithName] 在我的两种情况下都返回一个过滤器。我试图深入研究技术说明 TN2080:“检测 OpenGL 功能”,但结果证明它是矫枉过正。
    • “原来是矫枉过正?”因为工作比你想投资的多?如果您没有其他解决方案,这似乎并不过分。
    • 您是否看到手动检查 GL 功能所需的代码量?据我了解,它需要从头开始创建 GL 上下文,其唯一目的是检查功能。事实证明,有一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2012-10-19
    • 2011-06-05
    相关资源
    最近更新 更多