質問
私は最近、シンプルな2Dゲームの作成を開始し、ジレンマに出会いました - オブジェクトのxおよびy位置にゲッターとセッターのメソッドを使用するかしないか。メソッドを使用しない場合は明確に見えますが、代わりに変数に直接アクセスし、オブジェクトの多くのメソッド呼び出しはパフォーマンスを損なうでしょう。また、ポジションを取得して設定することはほぼ単純なままですので、ここでカプセル化する必要はありませんか?それとも、常にゲッターとセッターの方法の慣習に固執する必要がありますか?
解決
コンベンションに固執する方が常に良いです。さらに、JITは、すべてのメソッドスタックを通過する代わりに、フィールドに直接アクセスするために操作を簡素化します。
メソッドインラインと呼ばれます。
Java VMのJava 2リリースは、実行時に簡単な方法を自動的に導入します。最適化されていないJava VMでは、新しい方法が呼び出されるたびに、新しいスタックフレームが作成されます。新しいスタックフレームの作成には、追加のリソースとスタックの再マッピングが必要です。最終結果は、新しいスタックフレームを作成すると小さなオーバーヘッドが生じることです。
メソッドのインランスは、プログラムが作成するメソッドコールの数を減らすことでパフォーマンスを向上させます。 Java VM Inlining Code Codeはメソッドを挿入します 定数を返します 内部フィールドのみにアクセスします.
資力 :
同じトピックについて:
他のヒント
GetterとSetterを持つべきではありませんし、属性を公開するべきではありません。
代わりに、.updateposition()、.draw()、.moveto()、.collidewith()などのメソッドがあるため、外部から値を直接取得または設定する必要はありません。
あなたが本当に外部から直接値を取得/設定したいと思ういくつかのまれなケースがありますが、これらのインスタンスはまれであり、多くの場合、悪いデザインを示していません(ただしそこにありますが それは 有効な用途)。
ゲッター/セッターを使用します。なんで ?
- カプセル化はです 鍵. 。おそらく、後で場所を保存する方法を変更します(例えば、デカルトからポーラー?)。ゲッター/セッターを使用すると、適切な変換を実行できます。
- セッターは、オブジェクトが条件を実施できるようにします(例:x> 0および<10?)
さらなる理由(おそらくあなたのニーズには現在適切ではないが)は、多くのJavaフレームワークが従来のセッター/ゲッターのリフレクションと内省のクラスを利用していることです setX
/getX
フォーマット。このような方法を実装することにより、クラスはすぐにさまざまなフレームワークで再利用できます。
既知の懸念になるまで、パフォーマンスを心配しないでください。時期尚早の最適化は、あまりにも多くの頭痛を引き起こします。
の ステンダル ゲッター/セッターを使用しています。ターンごとに処理される約60,000の可動オブジェクトがあります。 Stendhalでの私の経験から、単純な方法では測定可能なパフォーマンスへの影響はまったくありません。私たちはさまざまな問題を見つけるために少しプロファイリングを静かにし、過去数か月でパフォーマンスを大幅に改善しました。
私たちが持っている主なボトルネックは、パスの発見です(特に他の可動オブジェクトとの衝突検出)。すべての可能な衝突チェックで新しいペアオブジェクトを作成したり、エンティティがその位置とサイズを求められたときはいつでも新しい長方形オブジェクトを作成するなどの問題がありました。
それらのものはプロファイラーで非常に簡単に見つけられます(参照 Javaのサーバーサイドゲームループのプロファイリング Gamedevで)。
ゲームループのロジック部分の外側のラグの他の一般的な原因は、クライアント/サーバー通信とデータベースアクセスです。