2012-04-10 12 views
3

CALayer 3D変換を使用して3Dユーザーインターフェイスを作成しようとしています。私はこれを達成するための基本的なテクニックを考え出しましたが、私のリアルタイムパフォーマンスはかなり悪いです。具体的には、ユーザはインタフェイス「シーン」をインタラクティブに「パン」することができなければならない。CATransform3Dを使用したパフォーマンスが悪い

次のスニペットでは、「モデル」はアニメーション化しようとしているレイヤーです。 「カメラ」は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 
}; 

この方法では、暗黙のアニメーションをもう無効にする必要はなくなりました。

関連する問題