使用 CATransform3D 性能不佳

Posted

技术标签:

【中文标题】使用 CATransform3D 性能不佳【英文标题】:Bad performance using 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];
    

如何提高渲染性能?

【问题讨论】:

【参考方案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
;

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

【讨论】:

以上是关于使用 CATransform3D 性能不佳的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 中 GMM 的意外性能不佳

RandomForestClassifier 性能不佳

NSFetchedResultsController 性能不佳

使用 nHibernate 选择具有许多子集合的实体的性能不佳

为啥使用 EF / Linq to sql 创建性能不佳的查询如此容易[关闭]

PostgreSQL:未使用的索引导致查询性能不佳?