在我的应用中,我使用了" CIMotionBlur" CALayer动画期间的CIFilter。问题是当硬件加速不可用时,过滤器无法正常工作:
没有过滤器,动画工作正常。我想在硬件加速可用时才应用过滤器。
什么是允许我知道何时禁用过滤器的最高级API? 我将在IOKit中寻找线索。
答案 0 :(得分:3)
我在技术Q& A QA1218 中找到了答案 "如何判断特定显示器是否由Quartz Extreme进行硬件加速?"
这很简单:
NSNumber* curScreenNum = [self.window.screen.deviceDescription objectForKey:@"NSScreenNumber"];
if (CGDisplayUsesOpenGLAcceleration(curScreenNum.integerValue))
{
// Do accelerated stuff
}
在我的案例中按预期工作。
答案 1 :(得分:0)
我想你可以用它来确定你想要的过滤器是否可用。如果Core Image不可用,它们可能不可用。
答案 2 :(得分:0)
如果filterNamesInCategory返回CIMotionBlur过滤器的名称,即使它不可用,那么您应该向Apple的bug报告者提交错误报告。
作为进一步的测试,您可以调用filterWithName并检查非零结果。如果你回来没有,你知道过滤器是可用的。
或者你是说在没有硬件加速的平台上,你会找回过滤器,但它不起作用?如果情况如此,则再次提交错误报告。
或者,你是说在非硬件加速的平台上,你会找到一个有效的过滤器,但它太慢而无法使用?
在文档中探讨我没有看到任何方法来判断Core Image是否为某个特定平台加硬件。
然而,CI过滤器是建立在OpenGL之上的,您可以查询OpenGL驱动程序以查看它是否硬件加密。我的猜测是,这样一个查询的结果也会告诉你CIFilters是否是硬件加速的。