0

私の SpriteKit ゲームでは、ランダムに配置された多数のタイル ノード (>100) があり、タイルとキャラクター ノード間の衝突を検出できる必要があります。これを行うには、SKPhysicsBody を使用します。

SKPhysicsBody コードを有効にすると、フレーム レートが約 40 fps に低下することがわかりましたが、コードをコメント アウトすると、60 fps に上がります。これは、エンジンがフレームごとに 100 以上のノードの物理をシミュレートしようとしていることに関係していると思います...これが起こらないようにしながら、キャラクターとタイルの間の衝突を検出する方法はありますか?

タイルの物理演算については、タイルに次のコードを使用しています。

self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:size];
self.physicsBody.affectedByGravity = NO;
self.physicsBody.categoryBitMask = WallCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = CharacterCategory; 

そして私のキャラクターのために:

self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:size];
self.physicsBody.usesPreciseCollisionDetection = YES;

self.physicsBody.restitution = 0;
self.physicsBody.friction = 0;
self.physicsBody.linearDamping = 0;

self.physicsBody.categoryBitMask = CharacterCategory;
self.physicsBody.contactTestBitMask = 0xFFFFFFFF;
self.physicsBody.collisionBitMask = BoundaryCategory; 
4

2 に答える 2

0

これにはいくつかの理由が考えられます。

まず、シミュレーターは、実際の iPhone のように衝突をシミュレートしません。シミュレータ単体でご利用の場合は、実機での試乗を強くお勧めします。

次に、アプリのアセットが遅延読み込みなどの非効率的な方法で読み込まれていないことを主張する必要があります。アセットは、起動時にバックグラウンド スレッドへの非同期呼び出し内でロードする必要があります。詳細については、Apple によるサンプルプロジェクトをご覧ください。

第三に、メソッドを投稿していません- (void)didBeginContact:(SKPhysicsContact *)contact。非効率的または不適切に実装すると、遅延衝突が発生する可能性があります。

また、Instruments でアプリをプロファイリングする必要があるため、FPS の低下がいつどこで発生しているかを正確に判断できます。

注:usesPreciseCollisionDetection画面上に 100 個を超えるノードを作成している場合、このプロパティはかなりの量のオーバーヘッドに寄与している可能性があります。

于 2014-09-04T22:57:11.827 に答える