Реализация мира сферы C++

Вы создаете слишком много тем. Это похоже на бомбу fork(). Потоки являются очень тяжелым системным ресурсом. Используйте их экономно.

В функции void Childwork я вижу две ошибки:

  1. Как кто-то уже указал в комментариях, вы проверяете информационный уровень потока, а затем вы идете и создаете некоторые больше потоков независимо от предыдущей проверки.

  2. Внутри цикла for, который порождает ваши новые потоки, вы увеличиваете информационный уровень непосредственно перед тем, как вы создаете реальный поток. Однако вы увеличиваете только что созданный экземпляр ThreadInfo здесь ThreadInfo* childInfo = new ThreadInfo[(int)n]. Все экземпляры в childInfo поддерживают уровень 0. По существу, уровень каждого потока, который вы создаете, равен 1.

Как правило, избегайте использования потоков для достижения параллелизма для операций ввода-вывода (*). Просто используйте потоки для достижения параллелизма для независимых операций с процессором. Как правило, вам никогда не нужно больше потоков, чем у вас в вашем ядре (**). Наличие большего не улучшает параллелизм и не улучшает производительность.

(*) Вы всегда должны использовать прямые вызовы функций и систему, основанную на событиях, для запуска псевдоконкурентных операций ввода-вывода. Вам не нужно никаких потоков для этого. Например, TCP-серверу не нужны потоки для обслуживания тысяч клиентов.

(**) Это идеальный случай. На практике ваше программное обеспечение состоит из нескольких частей, разработанных независимыми разработчиками и поддерживаемых в разных режимах, поэтому вполне допустимо иметь несколько потоков, которых теоретически можно было бы избежать.

Многопоточность все еще остается ракетостроением в 2019 году. Особенно в C ++. Не делайте этого, если вы точно не знаете, что делаете. Вот хорошая серия сообщений в блоге , которые обрабатывают темы.

6
задан Tom J Nowell 11 February 2009 в 11:11
поделиться

4 ответа

Для рендеринга необходимо будет использовать своего рода алгоритм уровня детализации для бесшовного перемещения от близко к поверхности планеты к далеко. Существует много динамических алгоритмов LOD (см. здесь). Более старый алгоритм, названный, ПЕРЕМЕЩАЕТСЯ, может быть адаптирован для обработки сферических объектов, или планеты (сферический ПЕРЕМЕЩАЮТСЯ). Геометрия clipmaps является более новым, более популярным алгоритмом, который может быть адаптирован к сферическим поверхностям также.

Что касается того, чтобы хранить данные, можно хотеть изучить процедурное поколение (в зависимости от потребностей) для текстурирования, heightmaps, и т.д. Это подобно тому, как Бесконечность и Спора делают вещи. Можно читать немного о программном наложении текстур здесь. Процедурные heightmaps более просты, в зависимости от того, как сложный/реалистичный Вы хотите свой ландшафт. На самом простом уровне можно просто переместить высоту вершины функцией шума перлина.

7
ответ дан 8 December 2019 в 13:03
поделиться

Это, вероятно, НЕ, что Вы ищете... А какого черта. Это - хорошая история.

Несколько эр назад, назад когда динозавры все еще переместились, земля и память все еще измерялись в килобайтах, я играл с некоторым программным обеспечением для генерации планет фрактальным образом.

Идея состояла в том, чтобы создать 2NxN прямоугольник, представляющий планету. Сократите планету в половине набора времен, сместив эти две половины немного каждый раз. (Синусоидальная волна для сокращения со случайным фазовым сдвигом и амплитудой. Другая случайная синусоидальная волна для сдвига.) Послесловия, лавинно разошлите области низшего уровня с водой и нанесите цветную маркировку на остальных высотой.

Затем поместите сферу Диаметра N на вершине и проекте, перенеся регион NxN карты приблизительно половина сферы. Переместите сферу вокруг карты, и было похоже, что она вращалась.

4
ответ дан 8 December 2019 в 13:03
поделиться

При поиске чего-то, чтобы хранить данные о поверхности в, Вы могли бы посмотреть на HEALpix. Это - программное обеспечение, разработанное астрономическим сообществом специально для отображения неба (другая сферическая поверхность).

HEALpix создает сетку, которая описывает положение, и размер поверхности стоит и присваивает каждому идентификатор. Можно затем использовать тот идентификатор в качестве ключа или индекса к доступу столько детали, сколько Вы хотите о том конкретном уровне.

HEASpix предоставляет методы для нахождения соседних площадей поверхности и может дать центру и положениям вершины для каждой сетчатой точки.

Это - иерархическая сетка, которая позволяет Вам подразделять каждую поверхность так, как Вы хотите так, Вы могли в теории иметь части сетки в низком разрешении и другие части в более высоких уровнях детализации, если бы Вы хотели. Это имеет хорошее свойство, что это бесконечно делимо (до Ваших пределов памяти), и каждый пиксель сетки в данном разрешении имеет ту же область как все другие на том уровне разрешения.

Пакет распределения обеспечивает много материала, в котором Вы, вероятно, не будете нуждаться, но оперативные библиотеки должны быть полезными.

5
ответ дан 8 December 2019 в 13:03
поделиться

Я предложил бы использовать своего рода модель полигона в памяти, чтобы реализовать их миры, использовать файл, чтобы сохранить их и представить их использующий своего рода 3-й механизм. Или это или просто указатель центрируются и радиус, наряду с наложением для описания географии мира.

Править: Спасибо за немного большее количество детали. В зависимости от того, сколько детали Вам нужно, необходимо будет использовать своего рода метод для разбивания структуры в меньшие части - можно просто генерировать структуру для 20 поверхностей и создать Икосаэдр вокруг центральной точки. Смотрите на проекции карты для некоторых мыслей о том, как это обрабатывается в реальной жизни.

2
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: