1

質問

ゲームが大量の関数呼び出しを使用する場合、ゲーム開発に 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フレームごとの私の計算では、私はすでに予算を超えており、1000076ms1000ms/76ms=13fps

ボーナスポイント

ボーナス ポイントとして、Java を使用しながらこの設計パスに沿って続行できるようにするものを見過ごしましたか?

4

1 に答える 1

1
  1. 単純なループまたは単純なスニペットが、どのテクノロジーが最適であるかを判断するのに役立つとは思えません。
  2. Androidランタイムの設計/アーキテクチャによると、JavaまたはNDKでのプログラミングは実際には同じです。つまり、JVMmain()関数の両方に、デフォルトで割り当てられたスレッドごとに1つのスレッドがあり、両方が「サンドボックス化」されており、直接アクセスできません。リソースへ; したがって、NDKを使用する予定で、C / C ++を使用すると、他のハードウェア/ロボットソリューションで発生するように、ハードウェアへのアクセスが低くなると思われる場合は、間違いです。アプリケーションのライフサイクルは基本的に同じであり、C / C ++を使用すると、使用するAPIがはるかに少なくなります。
  3. 決定は、再利用可能なコードと既存のコードのAndroidへの移植に関するものです。速度の向上はリストの最初のものではなく、C / C ++のような言語では、言語を上手に使用することで行われる可能性があります。ガベージコレクターや任意の形式の自動メモリ管理を取得しないでください。リソースをより正確にセットアップして指示できます。もちろん、何かを実行できるという事実は、プログラムが同等のJavaを魔法のように上回ることを意味するわけではありません。ベースのアプリ。
  4. 業界ではC++が王様であるため、iOS、Blackberry、Windows 8などでコードベースを共有したい場合は、NDKをAndroidの世界への入り口にすることができます。これが、 NDK、パフォーマンスではなく、既存のコンポーネントの再利用。
  5. 多くの人は、JNIが単に両方の方法で機能することを忘れていました。また、C ++とその逆からJavaメソッドを呼び出すことができます。また、NDKを使用してプログラミングし、ネイティブアクティビティとも呼ばれるC ++のみのアプリを作成すると、JVMスレッドは常に割り当てられ、デフォルトでapk用に常に2つのスレッドを持つことになります。
  6. JavaではC/C ++よりもはるかに簡単なことがあります。たとえば、Javaでボタンとタッチイベントの仮想インターフェイスを作成し、その後、NDKのみで同じことを実行してみてください。
  7. Androidは、サンドボックスの作成を容易にするためにJava言語を多用することを明確に指向しており、最終的にはこれは必要悪であり、おそらくJNIとJavaスレッドおよびC /C++スレッドの両方を使用することになると思います。 。
于 2012-12-13T05:28:14.413 に答える