3

我正在尝试使用 CALayer 3d 转换创建一个 3D 用户界面。我已经想出了实现这一点的基本技术,但是我的实时性能很差。具体来说,用户应该能够交互地“平移”界面“场景”。

在下面的代码片段中,“模型”是我要设置动画的图层。“相机”是一个 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];
    }
}

如何提高渲染性能?

4

2 回答 2

4

好的,我自己解决了:问题是隐式动画。每个 model.transform = ... 调用都会触发一个隐式动画,导致行为非常缓慢。在创建“模型”层时,禁用转换键的隐式动画,解决了这个问题:

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

现在一切都很快。

于 2012-04-11T06:51:29.277 回答
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
};

这样,我什至不必再禁用隐式动画了——它就可以工作了。

于 2012-04-11T07:03:06.087 回答