Ответ зависит частично от того, что делает конструктор и что происходит с объектом после цикла, так как это определяет в большой степени, как код оптимизирован.
, Если объект является большим или сложным, абсолютно объявите его вне цикла. Иначе люди, говорящие Вам не преждевременно оптимизировать, правы.
Я раньше играл с генерацией ландшафта. Предполагая, что целью является растровое изображение, я нашел способ сделать такие вещи, как реки, и в целом сделать их лучше: Эрозия.
Если у вас есть рельеф, созданный другими способами, немного его размывайте: вам нужно, чтобы мир был выражен высотой в пикселях . Возьмите место на карте и переместите одну единицу высоты к самому низкому соседу. Переместите курсор к этому соседу и повторяйте, пока он не перестанет двигаться. Повторите то же самое для других пикселей.
Чтобы реки подсчитали, сколько раз вы проходите через точку, перемещая биты вниз. Больше всего попадают в пятна реки.
Продолжение: я не стирал каждый пиксель так сильно, как просто большое количество случайных пикселей, пока он не выветрился достаточно. Причина их фактического разрушения в том, что это уносит биты вниз и заполняет дыры.
Рельеф создается множеством разных причин в разных временных масштабах. Чтобы действительно создать реалистичную местность, вам нужно смоделировать их.
В «краткосрочной» перспективе гидросфера определяет большинство характеристик. Вероятно, вы можете начать с вокселя / частицы / карты высот / сетки местности, содержащей основные объекты (горные хребты и т. Д.), И рассматривать их как неизменяемые, а затем обработать их с помощью множества имитаций воды. Вам нужно будет вычислить, где будут реки и озера, как они разрушают основной ландшафт и где образуют отложения. Если бы мне пришлось это кодировать, я бы, вероятно, начал с трехмерного воксельного мира.
Это была бы гигантская задача, и я уверен, что существует множество приемов для создания определенных типов ландшафта, которые занимают миллисекунды вместо минут. Какую местность вы хотите создать? Горный? Низина? Промышленный? Лес? Пустыня? Архипелаг?
Короче говоря: если вы хотите, чтобы местность выглядела реалистично для людей (которые, в конце концов, склонны быть экспертами в подобных вещах), вам придется создать его, моделируя реальные геологические процессы.
Мой метод в Terra3D заключался в том, чтобы сгенерировать случайные значения высоты, а затем сделать 3 прохода сглаживания с небольшим изменением формы, записанным в алгоритм. Изменение формы приводит к тому, что местность под ватерлинией немного смещается вниз, а все, что находится выше ватерлинии, немного смещается вверх. Однако эффект - много холмов и небольших озер. И это может быть не то, что вы ищете.
Однако я не уверен, что принцип, лежащий в основе моего метода, нельзя использовать для получения того, что вы хотите. Возможно, вам просто придется записать еще несколько условий в алгоритм изменения формы / сглаживания. Например, уменьшение сглаживания рельефа на больших высотах приведет к созданию более скалистого вида горы. А затем написание более сложного сглаживающего (или гауссовского) алгоритма, который простирается дальше для более низких высот, может объединить эти озера вместе, чтобы сформировать естественные реки.
Вот код для генерации ландшафта в Terra3D на случай, если вам интересно:
// GENERATE TERRAIN
for (i = 0; i < MAX; i++)
{
for (i2 = 0; i2 < MAX; i2++)
{
if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10)
field[i][i2].y=0;
else
field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05;
}
}
// SMOOTH/RESHAPE TERRAIN
for (int cnt = 0; cnt < 3; cnt++)
{
for (int t = 1; t < MAX-1; t++)
{
for (int t2 = 1; t2 < MAX-1; t2++)
{
field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4;
if (cnt == 0)
{
if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2;
else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5;
}
}
}
}
Это небрежный код, который я написал около 10 лет назад. Terra3D был долгим процессом обучения экспериментов и возни в темноте, чтобы произвести те эффекты, которые я искал. Но, может, это поможет.