質問
ゲームが大量の関数呼び出しを使用する場合、ゲーム開発に NDK を使用する方が良いですか? 少なくともおそらく1000〜10000の範囲で...
状況
コンポーネントベースのデザインを使用して高度な構造のアンドロイドで実行することを意図したゲームを書いています.God Objectの反パターンから逃れる. obj が削除されることは決してありませんが、これは問題ありませんでしたが、より多くの関数呼び出しが行われ、パフォーマンスが大幅に低下すると聞いています。参照: Google I/O 2009 - Android 向けリアルタイム ゲームの作成
テスト
protected static void voidFun(Integer i){
if(i == 4) Log.d(TAG, "This should be impossible.");
}
public static void test(){
stressTestMillis(1000);
stressTestMillis(10000);
stressTestMillis(100000);
}
protected static void stressTestMillis(int loops) {
long beforeBefore = System.currentTimeMillis();
long before = beforeBefore;
for(int i = 0; i < loops; i++){
//Just measuring raw loop time not function call time.
}
long rawLoop = System.currentTimeMillis() - before;
Integer test = 0;
before = System.currentTimeMillis();
for(int i = 0; i < loops; i++){
voidFun(test);
}
long loop = System.currentTimeMillis() - before;
long total = System.currentTimeMillis() - beforeBefore;
Log.d("Stress Test", "Loops:"+loops+" Loop:"+loop+" Loop Tare:"+rawLoop+" function Total:"+(loop-rawLoop)+" Total:"+total);
}
結果
Test() の実行結果
12-12 18:30:22.623: D/Stress Test(15863): Loops:1000 Loop:14 Loop Tare:1 function Total:13 Total:15
12-12 18:30:22.703: D/Stress Test(15863): Loops:10000 Loop:80 Loop Tare:4 function Total:76 Total:84
12-12 18:30:23.513: D/Stress Test(15863): Loops:100000 Loop:783 Loop Tare:26 function Total:757 Total:809
懸念
コンポーネントベースの設計 + AI (ビヘイビア ツリー) だけでも大量の関数呼び出しがあり、物理演算が投入され、多くのメソッド呼び出しを見て、多くの場合 10000 は既に範囲外であるため、これは非常に心配です...
その時点で関数呼び出しがクロックインしている1000ms/30fps=33.333ms
フレームごとの私の計算では、私はすでに予算を超えており、10000
76ms
1000ms/76ms=13fps
ボーナスポイント
ボーナス ポイントとして、Java を使用しながらこの設計パスに沿って続行できるようにするものを見過ごしましたか?