0

物理エンジンを使わずにゲームを作ろうとしたとき、私の iPod 4g はコードの実行が非常に遅くなりました。コードは機能しますが、本当に遅いです。誰かがそれをより速く実行するのを手伝ってくれるかどうか疑問に思っていました.

-(void)Loop {
NSMutableArray *_remove = [NSMutableArray array];
for (UIImageView *b in _blocks) {
    int i = 0;
    for (UIImageView *b2 in _blocks) {
        if (!CGRectContainsPoint(b2.frame, CGPointMake(b.center.x, b.center.y + b.frame.size.height/2)) && b != b2) {
            i++;
        }
    }
    if (i == [_blocks count] - 1 && b.image != wall) {
        b.center = CGPointMake(b.center.x, b.center.y + 1);
    } else if (b.image != wall) {
        for (UIImageView *b2 in _blocks) {
            for (UIImageView *b3 in _blocks) {
            //Check for collitions
            if (b !=b2 && ((CGRectContainsPoint(b2.frame, CGPointMake(b.center.x + b.frame.size.width/2, b.center.y)) && b.image == b2.image && b.image !=wall && b2.image != wall && CGRectContainsPoint(b3.frame, CGPointMake(b2.center.x, b2.center.y + b2.frame.size.height/2))) || (CGRectContainsPoint(b2.frame, CGPointMake(b.center.x, b.center.y + b.frame.size.height/2)) && b.image == b2.image && b.image !=wall && b2.image != wall) )) {
                    [_remove addObject:b];
                    [_remove addObject:b2];
            }
            }}
    }
}
for (UIImageView *b in _remove) {
    [b removeFromSuperview];
    [_blocks removeObject:b];
}
}

コードが行うことは、「壁」または「ブロック」を持ち、同じ画像を持つ「ブロック」の上または横に並んでいる UIImageViews を削除することです。つまり、接触している場合は同じ画像を持ち、接触している場合は画像を削除します (下にブロックがあります)。

4

2 に答える 2

1

これは obj-c です。コードを超えて機能するランタイム コードがあります (c や c++ とは異なります)。オブジェクトにメッセージを渡すたびに、バックグラウンドで多くの関数呼び出しチェックが行われます。

ちなみに、呼び出しごとに NSMutableArray をループで作成していますが、これは本当に時間がかかります。

本当に高速なエンジンが必要な場合は、たとえば cocos2d lib を使用してください。

于 2012-10-10T07:56:15.193 に答える
1
  1. より意味のある変数名を使用してください。
  2. プロフィール、プロフィール、プロフィール。
  3. 高価なテストよりも安価なテストを移動します。たとえば、最初の if では、 b != b1 をチェックする前に rect のポイントをチェックします。
  4. 可能な限り最も外側のテストでテストを行います。たとえば、最も内側のテストでは、b != b2 のテストから始めます。これをすべての b3 に対して行います。これは大きな勝利にはなりませんが、無料です。

  5. NSMutableArray の割り当てについて心配する必要はありません。これは外側のループにあるため、要因ではありません。内部レベルで発生する新しい値を追加するときの配列内のストレージの再割り当てについて心配してください。最初に十分な大きさの NSMutableArray を割り当てることで、これを修正してください。[NSMutableArray arrayWithCapacity:_blocks.count];

  6. ブロックは他の複数のブロックと重複する可能性があるため、remove 配列に何度もブロックを追加していると思われます。代わりに変更可能なセットを使用しないでください。ブロックを複数回追加している場合、可変配列のサイズを正しく設定していても、可変配列のストレージ割り当てが発生する可能性があります。6 プロファイルもう少し :)
于 2012-10-10T08:55:21.947 に答える