8

私のゲーム エンジンでは、物理演算に Box2D を使用しています。Box2D の命名規則と貧弱なコメントは、私のエンジンの一貫性があり十分に文書化された残りの部分を台無しにします。

Box2D の一連のラッパー クラスを作成することを検討しました。つまり、共通の Box2D オブジェクトのそれぞれを拡張し、エンジンの残りの部分の命名規則に従って関数を書き直して、より明確かつ一貫したコメントを付けるクラスです。一部のクラスの上に構築し、いくつかの小片を追加することも検討しました (b2Vec2クラス内のピクセルベースの測定用のゲッターなど)。

これは問題ありませんが、これがどのような悪影響を及ぼし、アプリケーションやゲームにどの程度影響するかについては 100% 確信が持てません。コンパイラが私の懸念の一部をある程度軽減するかどうか、または読みやすさと一貫性のために不要なクラスを追加するときに配慮する必要があるかどうかはわかりません。

私はいくつかの疑いがあります:

  • 余分なレベルのクラス構造に対応するためのより多くのメモリ消費。
  • 余分なレベルのメンバーを初期化することによる新しいオブジェクトの作成時のパフォーマンスへの影響?

ランタイムへの影響について具体的に質問しています。

4

5 に答える 5

1

私はベンチマークを書くのが面倒なので、この回答が報奨金の対象にならないことはわかっています。しかし、Flash コード ベースに取り組んできたので、いくつかのヒントを与えることができるかもしれません。

avm2 は動的言語であるため、この場合、コンパイラは何も最適化しません。呼び出しをサブクラス呼び出しとしてラップするとコストがかかります。ただし、そのコストは一定時間で小さくなります。

オブジェクトの作成コストも、一定量の時間とメモリの影響を受けます。また、時間と金額は、基本コストと比較しておそらく重要ではありません。

しかし、多くのことと同様に、悪魔は細部に宿ります。box2d を使用したことはありませんが、何らかのオブジェクト プーリングを行うと、うまく機能しなくなる可能性があります。一般に、ゲームはプレイ時にオブジェクトを割り当てずに実行を試みる必要があります。したがって、見栄えを良くするためだけにオブジェクトを割り当てる関数を追加しないように十分注意してください。

function addvectors(a:vec,b:vec,dest:vec):void

醜いかもしれませんが、よりもはるかに高速です

function addvectors(a:vec,b:vec):vec

(AS3 構文が正しいことを願っています...)。さらに便利で醜いかもしれません

function addvectors(a:Vector.<vec>, b:Vector.<vec>, dest:Vector.<vec>, offset:int, count:int):void

したがって、私の答えは、読みやすさのためにのみラップする場合は、それを選択してください。少額ですが、一定のコストです。ただし、関数の動作方法を変更する場合は、非常に慎重に行ってください。

于 2013-09-15T06:34:00.347 に答える
0

インスタンス化時間に大きな影響があるかどうかはわかりませんが、あなたの質問には別の方法で答えます: 他にどのような選択肢がありますか? 彼らはうまくいくように見えますか?

Jackson Dunstan によって作成された機能パフォーマンスに関する美しいベンチマークがあります: http://jacksondunstan.com/articles/1820

要約すると:

  • 閉鎖は高価です
  • static は遅い: http://jacksondunstan.com/articles/1713
  • オーバーライドして、サブクラス内で関数を呼び出しても大きな影響はないようです

したがって、継承を使用したくない場合は、静的呼び出しに置き換える必要があり、パフォーマンスが低下します。個人的には、これらのクラスを拡張し、実行時に必要なすべてのオブジェクトの熱心なインスタンス化を追加します。それが大きい場合は、美しい読み込み画面を作成します...

また、apparat などのバイトコード後の最適化もご覧ください: http://code.google.com/p/apparat/

于 2013-09-15T07:05:57.087 に答える
0

拡張がパフォーマンスに大きな影響を与えるとは思いません。はい、多少のコストはかかりますが、合成を使用しない限り、それほど高くはありません。つまり、Box2d クラスを直接拡張する代わりに、そのクラスのインスタンスを作成し、クラス内で操作します。たとえば、これ

public class Child extends b2Body {
    public function Child() {
        // do some stuff here
    }
}

これの代わりに

public class Child  {
    private var _body:b2Body;
    public function Child() {
        ...
        _body = _world.CreateBody(...);
        ...
    }
}

作成するオブジェクトが少ないほど良いことを知っていると思います。作成されたインスタンスの数を維持する限り、同じパフォーマンスが得られます。

別の観点から: a) 抽象化のレイヤーをもう 1 つ追加すると、Box2d が大幅に変更される可能性があります。チームで作業している場合、これは問題になる可能性があります。なぜなら、他の開発者はあなたの命名を学習する必要があるからです。b)ミドルマンコードの匂いに注意してください。通常、既存の機能をラップし始めると、ただのデリゲータであるクラスになってしまいます。

于 2013-09-15T07:25:22.690 に答える
0

ここにいくつかの素晴らしい答えがありますが、私は2セントを投入します.

クラスを拡張するときとクラスを実装するときの2 つの異なる概念を認識する必要があります。

これは拡張の例ですMovieClip

public class TrickedOutClip extends MovieClip {
   private var rims = 'extra large'
   public function TrickedOutClip() { 
     super();
   }
}

MovieClip の実装例を次に示します。

public class pimpMyClip {
   private var rims = 'extra large';
   private var pimpedMovieClip:MovieClip;
   public function pimpMyClip() { 
     pimpedMovieClip = new MovieClip();
     pimpedMovieClip.bling = rims;
   }

 public function getPimpedClip() { 
     return pimpedMovieClip;
   }
}

おそらく、これらの box2D クラスを拡張するのではなく、実装したいと思うでしょう。大まかな概要は次のとおりです。

 public class myBox2DHelper {
   private var box2d = new Box2D(...);

  public function MyBox2DHelper(stage) {

  }

   public function makeBox2DDoSomeTrickyThing(varA:String, varB:Number) { 
       // write your custom code here
     }

   public function makeBox2DDoSomethingElse(varC:MovieClip) { 
       // write your custom code here
     }
  }

幸運を。

于 2013-09-19T14:23:31.010 に答える