3

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

次のスニペットでは、「モデル」がアニメーション化しようとしているレイヤーです。「カメラ」は、タッチ変換を適用して継続的に更新している 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

2 に答える 2

4

問題は暗黙のアニメーションでした。すべての model.transform = ... 呼び出しが暗黙的なアニメーションをトリガーし、動作が非常に遅くなりました。「モデル」レイヤーを作成するときに、変換キーの暗黙的なアニメーションを無効にすると、問題が解決しました。

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

これで、すべてがすばやく高速になりました。

于 2012-04-11T06:51:29.277 に答える
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
};

このようにして、暗黙のアニメーションを無効にする必要さえなくなりました - それだけで機能します。

于 2012-04-11T07:03:06.087 に答える