#c #function #opengl #static-variables
#c #функция #opengl #статические переменные
Вопрос:
В качестве примера у меня есть следующая функция рисования в каком-либо приложении 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
это класс, и я уверен, что переменные экземпляра step и terrain width / length никогда не изменятся в течение срока службы объекта (они инициализируются перед первым вызовом функции рисования).
Предполагая, что мое приложение работает со скоростью 25 кадров в секунду, функция будет вызываться 25 раз в секунду. Значения никогда не изменятся, они всегда будут одинаковыми.
Получу ли я что-нибудь от объявления этих функциональных переменных как статических? Чтобы предотвратить их уничтожение и объявление при каждом вызове функции?
Комментарии:
1. Если значения никогда не меняются, зачем их снова и снова вычислять в функции, которая вызывается со скоростью 25 кадров в секунду? Вы можете просто инициализировать их в конструкторе и использовать в
void Terrain::Draw(..)
.
Ответ №1:
В наши дни компиляторы настолько хороши в микрооптимизации, что было бы практически невозможно сделать окончательное заявление о том, улучшит это вашу программу или замедлит ее.
Вам придется провести сравнительный анализ, чтобы действительно быть уверенным.
Ответ №2:
Получу ли я что-нибудь от объявления этих функциональных переменных как статических?
это действительно небольшой объем данных: не беспокойтесь, если у вас нет тонны экземпляров.
Чтобы предотвратить их уничтожение и объявление при каждом вызове функции?
обычно это принимает форму:
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
реализации.
Ответ №3:
Да, и пока вы там, создайте их const
тоже. Оба эти параметра могут быть подсказками компилятору для оптимизации этих функциональных переменных.
Хотя разница была бы настолько минимальной, вам потребовалось бы не менее 25 000 вызовов в секунду, чтобы сделать это стоящим.