Статические переменные в объеме функции рисования в OpenGL? - PullRequest
1 голос
/ 21 апреля 2011

Например, у меня есть следующая функция рисования в некоторых приложениях 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 кадров в секунду, функция будет вызываться 25 раз в секунду. Значения никогда не изменятся, они всегда будут одинаковыми.

Получу ли я что-нибудь, объявив эти переменные функции статическими? Чтобы предотвратить их уничтожение и объявление каждый раз при вызове функции?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Компиляторы настолько хороши в микрооптимизации в наши дни, что было бы почти невозможно сделать однозначное заявление о том, улучшит ли это или замедлит вашу программу.

Вам нужно будет тестировать, чтобы действительно быть уверенным.

1 голос
/ 21 апреля 2011

Получу ли я что-нибудь, объявив эти переменные функции статическими?

это действительно небольшой объем данных: не беспокойтесь, если у вас нет тонны экземпляров.

Чтобы предотвратить их уничтожение и объявление каждый раз при вызове функции?

это обычно принимает форму:

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.

1 голос
/ 21 апреля 2011

Да, и пока вы там, сделайте их const тоже. Оба из них могут быть подсказками компилятору для оптимизации этих переменных функции.

Хотя разница будет настолько незначительной, что вам понадобится как минимум 25 000 вызовов в секунду, чтобы это стоило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...