1

例として、いくつかの OpenGL アプリケーションに次の描画関数があります。

void Terrain::Draw(float ox, float oy, float oz) {
    float terrainWidth = stepWidth * (width - 1.0f);
    float terrainLength = stepLength * (length - 1.0f);
    float startWidth = (terrainWidth / 2.0f) - terrainWidth;
    float startLength = (terrainLength / 2.0f) - terrainLength;

        (...)
}

Terrainはクラスであり、オブジェクトの存続期間中、ステップおよび地形の幅/長さのインスタンス変数が変更されることはないと確信しています (描画関数への最初の呼び出しの前に初期化されます)。

アプリケーションが安定した 25 fps で実行されると仮定すると、関数は 1 秒間に 25 回呼び出されます。値は決して変わらず、常に同じです。

これらの関数変数を静的として宣言すると、何か得られるでしょうか? 関数が呼び出されるたびにそれらが破棄されて宣言されるのを防ぐには?

4

3 に答える 3

2

最近のコンパイラは、マイクロ最適化が非常に得意であるため、プログラムが改善されるか遅くなるかについて決定的な声明を出すことはほぼ不可能です。

本当に確実にするには、ベンチマークする必要があります。

于 2011-04-20T21:17:13.130 に答える
1

はい、あなたがそこにいる間に、それらconstも作ってください。これらは両方とも、これらの関数変数を最適化するためのコンパイラーへのヒントになります。

違いはごくわずかですが、これを価値のあるものにするには、少なくとも 1 秒あたり 25,000 回の呼び出しが必要です。

于 2011-04-20T21:16:58.430 に答える
1

これらの関数変数を静的として宣言すると、何か得られるでしょうか?

これは本当に少量のデータです。大量のインスタンスがない限り、気にしないでください。

関数が呼び出されるたびにそれらが破棄されて宣言されるのを防ぐには?

これは通常、次の形式を取ります。

class Terrain { 
public:
    // interface
protected:
    // more stuff
private:
    // ... existing variables
    const float d_terrainWidth;
    const float d_terrainLength;
    const float d_startWidth;
    const float d_startLength;
};

その後、実装から事前計算された不変条件を使用できますDraw

于 2011-04-20T21:25:29.543 に答える