【问题标题】:Bad performance using CATransform3D使用 CATransform3D 性能不佳
【发布时间】:2012-04-10 12:43:32
【问题描述】:

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

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

如何提高渲染性能?

【问题讨论】:

    标签: ios cocoa-touch quartz-graphics


    【解决方案1】:

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

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

    现在一切都很快。

    【讨论】:

      【解决方案2】:

      我还想出了一种更简洁的方法来应用相机变换,如下所示:

      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
      };
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-01
        • 2012-12-14
        • 2012-01-14
        • 2015-11-15
        • 2011-12-13
        • 1970-01-01
        • 2011-01-03
        • 2016-11-06
        相关资源
        最近更新 更多