使用CATransform3D时性能不佳

3
我正在尝试使用CALayer 3D变换创建3D用户界面。我已经找到了实现这一目标的基本技术,但实时性能相当糟糕。具体来说,用户应该能够交互式地“平移”界面“场景”。
在下面的代码片段中,“model”是我要动画化的图层。“camera”是我不断更新的CATransform3D矩阵,通过应用触摸平移来更新。
这种方法起作用,但平移非常缓慢。如果我取消注释带有CGAffineTransform的部分,我会得到快速响应的平移 - 但在平移时会失去应该发生的透视变化。
- (void)didPan:(UIPanGestureRecognizer*)pan
{
    if (pan.state==UIGestureRecognizerStateChanged) 
    {
        CGPoint p = [pan translationInView:self.view.window];

        camera = CATransform3DTranslate(camera, p.y, 0, -p.x);
        model.transform = CATransform3DConcat(camera, modelView);

        // CGAffineTransform tA = self.view.transform;
        // tA = CGAffineTransformTranslate(tA, p.x, p.y);
        // self.view.transform = tA;

        [pan setTranslation:CGPointZero inView:self.view.window];
    }
}

如何提高渲染性能?
2个回答

4

好的,我自己解决了:问题出在隐式动画上。每次model.transform = ...的调用都会触发一个隐式动画,导致行为非常缓慢。在创建“model”图层时,禁用transform关键字的隐式动画可以解决这个问题:

model.actions = [NSDictionary dictionaryWithObjectsAndKeys:
                   [NSNull null], @"transform",
                   nil];

现在一切都快得令人惊叹。

3
我还想出了一种更简洁的应用相机变换的方法,就像这样:
camera = CATransform3DTranslate(camera, p.x, p.y, 0);  
mainLayer.sublayerTransform = CATransform3DConcat(camera, CATransform3DPerspective);

这里的mainLayer是我的视口,而CATransform3DPerspective是一个常量CATransform3D,定义如下:

CATransform3D const CATransform3DPerspective = {
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, -1.0/500.0,
    0.0, 0.0, 0.0, 1.0
};

这样,我甚至不需要再禁用隐式动画 - 它可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接