2012-04-10 57 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 
}; 

這樣,我甚至不必禁用隱含的動畫 - 它只是起作用。