2012-04-10 58 views
3

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

在下面的代码片段中,“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]; 
    } 
} 

如何提高渲染性能?

回答

4

好吧,我自己解决了它:问题是隐式动画。每一个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 
}; 

这样,我甚至不必禁用隐含的动画 - 它只是起作用。