alexrnov:
ゲームのレンダリングは、アルゴリズムの変更(画面上のクリックの取扱い)の一部を開始すると。
2つのオプションがあります。1.「IF」演算子:
public class Leve1 implements GLSurfaceView.Renderer {
private boolean isLoadGame = false;
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
...
isLoadGame = true; // game is now loaded
}
// this method is called often in the render loop
public void setPassXY(float x, float y) {
if (isLoadGame) {
... // perform algorithm
}
}
}
2.( "IF" のない)ラムダ:
public class Leve1 implements GLSurfaceView.Renderer {
// when the game is not loaded yet use the empty method body
private PressXYInterface<Float, Float> pressXY = (pressX, pressY) -> {};
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
...
pressXY = (passX, passY) -> {
... // game is now loaded - add algorithm
};
}
// this method is called often in the render loop
public void setPassXY(float x, float y) {
pressXY.invoke(x, y); // perform algorithm
}
}
@FunctionalInterface
public interface PressXYInterface<T, U> {
void invoke(T x, U y);
}
質問:パフォーマンスの面で使用することをお勧めしアプローチ?
スティーブンC:
私は、単一の正解が存在することができるとは思いません。場合によります。
一方では、ラムダを使用したバージョンが保存されますif
声明を。
一方、メソッド呼び出しを使用したバージョンは、潜在的にJITコンパイラによってインライン化することができます。(異なる時点でアプリケーションが/異なるラムダを呼び出すことができるであろうので、ラムダコールがインライン化することができません。)
一方、// perform algorithm
十分に複雑であり、インラインにはあまりにも大きいだろう。
一方、algorithm
インラインには大きすぎる、おそらくコストif
のテストは無視できるほど小さくなります。
一方、if
テストは、あなたが想像するよりも高価になることがあります。例えば:
- コードJITのみで実行した後にコンパイルした場合
isLoadGame == true
の状態は、統計は、テストが成功した場合のコードを付勢伝えることができます。 - (ハードウェア)分岐予測は、パフォーマンスに影響を与える可能性があります。
一方、それはどちらか私にはクリアしていないか、または両方のバージョンは、単純な呼び出しまたは仮想呼び出しを行う必要があります。そして、JITコンパイラがいるかどうか可能性が仮想呼び出しを最適化します。私は単に知りません。
その後、別のJITコンパイラのバージョン、異なるハードウェアISA、異なるハードウェア実装の問題があります。
要するに、高速になりますどのアプローチを予測するためにあまりにも多くの要因があります。
あなたのベンチマーク実際のアプリケーションは、信頼できる答えを得るための唯一の方法です。