1

ゲームのパフォーマンスに深刻な問題があります。ジグソーパズルゲームを開発しています。画像を小さな画像に切り詰め、各ジグソー ピースの UIView を作成し、各画像を独自の UIView の CALayer に割り当てます。

次に、シェイプのランダムな UIBezier パスをマスクとして作成し、それらを CAShapeLayers に割り当ててから、シェイプ レイヤーを UIView.layer.mask プロパティに割り当てます。

ジグソーパズルのピースを動かそうとするところまでは、すべて魔法のように機能します。タッチを検出し、適切なピースの中心プロパティ (CGPoint) を移動します。

しかし、ピースを他のピースの上に移動すると、とても遅くて「ラグ」があります。

私はたくさんグーグルで検索し、 setNeedsDisplayInRect: my container view などを呼び出してみました。また、これらのメソッドは全体を再描画し、再描画する必要はなく、ピースを移動するだけでよいことがわかりました。そして、アニメーション化は OpenGL で構築されたメソッドを使用するため、良いアプローチであることがわかりました。そこで、ジグソー ピース オブジェクト (UIView のサブクラス) で UIView クラスのメソッドを使用して、ピースをアニメーション化 (移動) してみました。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.superview];
CGPoint offset = CGPointMake(touchLocation.x - _previousPoint.x, touchLocation.y - _previousPoint.y);
[UIView animateWithDuration:0
                 animations:^(void){
                     self.center = CGPointMake(self.center.x + offset.x, self.center.y + offset.y);
                 }
                 completion:^(BOOL finished){

                 }];
_previousPoint = touchLocation;   
}

しかし、それもうまくいきませんでした。

これのパフォーマンスを改善する方法を知っている人はいますか?

「移動のみ」のアプローチが解決策になると思います(再描画は非常にコストがかかるため、すべてのフレームを再描画するわけではありません)。しかし、それを実装する方法がわかりません。

どんなアイデアでも大歓迎です、事前に感謝します。

4

0 に答える 0