Найти тему
Мусин Михаил

Октябрь 2020. Unity C#. Мусин Михаил

Перенос с другого сайта.
Добавил падение кубов, если под ними нет опоры. Чтобы в воздухе не оставалось непонятных конструкций.

---
У меня уже мозги кипят от банальной задачи, которую я каждый раз не могу вспомнить и забываю записать после того как нашёл...
Нужно из цикла For добавить цифру к названию переменной.
У меня есть переменные Point1,Point2,Point3 и т.д. Где хранятся координаты Vector3
И нужно через цикл создать эти переменные.
Я могу создать строку. string test = "point"+ i;
но больше ничего не получается...
Это у меня тестовый, временный код.

Я тут подумал, и решил... Эти координаты нужно добавить в массив.
Только вспомнить как создать этот массив и добавить туда эти координаты.
---
Пока жаловался на свою проблему, смотрел на свой код и решил её другим путём. С помощью второго массива с координатами.
Тут я тестирую генерацию земли без дополнительных проверок с помощью других скриптов.
https://gist.github.com/Musin-Mihail/ce341168ab975...

---
Очередная версия игры.
Без ограничения обзора камеры и при большом количестве дронов, фпс в среднем 10.
По большей части это из-за кубов. Нужно дальше оптимизировать.
Как минимум понять, как при объединении мешей удалять вершины и грани которые находятся внутри и которых не видно снаружи.

Можно попробовать делать ещё один опрос кубов. Если вокруг них всё занято, помечать себя, чтобы их не объединять в меш.
Но это нужно будет делать довольно часто. к примеру каждые 5 секунд для каждого куба. Это довольно сильно будет тормозить игру. Но общее ФПС поднимется. Нужно экспериментировать.
Я подобный опрос делал для включении гравитации, сильно падало ФПС. Пришлось отключить
Но это без оптимизации мешей.
Я наверно в тот скрипт и добавлю отметку добавлять этот куб в объединение мешей или нет.
Пришлось создать документ, куда добавляю идеи для оптимизации.
Вроде логичное решение, но я почти никогда ничего не записываю.
---
Идея с отключением мешей, которых не видно не сработала...
Технически всё работает, но ФПС сильно падает, когда идёт проверка на эту метку.
Это же нужно опросить 1000 кубов в каждом чанке.
Теги тоже не поменять, а то пойдёт цепная реакция. Может можно будет меши опросить при при объединении.
Но я пока не знаю что там хранится и что можно пометить.
Но я отключил объединение кубов, если их не трогать. Первое время там просто один куб. Добавляет немного ФПС.
И добавил удаление дронов, когда у них закончилась работа.
В итоге без работы дронов ФПС больше 100 Без ограничения дальности обзора. Так как дальние чанки это просто один куб, а ближние уменьшаются дронами.
Ну и в реальной игре врятли будет столько дронов в один момент. Ещё будет ограничение на перемещение и область обзора будет меньше.

-2
-3

Скорей всего в пребафе кубов удалить вообще меш и через скрипт его добавлять. Если так можно. Ещё не пробовать
---
Нашёл как добавить меш к объекту. Но через другой объект.
Создаётся объект, у него копируется меш и удаляется объект.
То что первым нашёл в интернете.
Думаю также можно из пребафа брать меш, не создавая дополнительный объект на сцене.
Но пришлось дополнительную проверку добавлять. Проверять есть мышь или нет, перед тем как объединить.
Иначе он пытается пустые тоже объединять и пишет в консоль предупреждение. На что уходят ФПС.
Хотя может в скомпилированной версии не будет такой проблемы, так как там нет консоли.
Но при тестах у меня возникла проблема. Игра зависает при выходе.
Я бы это заметил раньше, если бы у меня оперативки было поменьше.
На скриншоте покажу на что уходит 1 гигабайт памяти
Сейчас нужно изучать эту проблему. Слишком много игра хранит данных.

-4
-5
-6

---
Профиль говорит, что на текстуры и мешы уходит немного гигабайт...
Но подождав ещё, я заметил, что очень много мешей.
Хотя общее потребление выше. Судя по диспетчеру задач.
Профиль что-то не показывает.
Буду думать...

-7
-8

---
Удалил меши которые становятся невидимые со временем.
Визуально их стало меньше, но по цифрам их почему-то стало больше...
Было 90 тысяч, стало 100 тысяч.
Компонент(Mesh Filter) где хранятся меши, пусть даже и нулевые, я удалить не могу.
Иначе объединение мешей перестаёт работать.
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(false);
Можно в массив добавить объекты. Но придётся делать ещё одну проверку для сортировки.
Хотя там уже есть одна проверка. Её можно будет убрать.

-9
-10
-11

Оказывается количество мешей не уменьшается, даже при удалении всех объектов со сцены.
---
Чем больше я занимаюсь глобальной оптимизацией, чтобы увеличить ФПС при рендере кубов (уменьшая количество вершин и граней), тем сильнее проседает отработка скриптов.
Сейчас при большой территории перед глазами, ФПС больше 500.
Но у меня начали тормозить дроны. Вплоть до нуля.
В основном это void OnTriggerEnter.
Я тут ещё подумал... Я же могу все чанки объединить ещё в один чанк. )
И так до бесконечности. В конце у меня будет один гигантский объект.
Нужно будет как-нибудь попробовать.
Но пока нужно разобраться со скриптами и с бесконечным увеличение мешей в оперативной памяти.

-12

У меня 200 реальных действий, при 850 целевых контактов. А всего 1030 контактах.
В этом и проблема. У меня 850 выполнений скрипта, а результатов 200...
У меня идёт контакт, после идёт удаление блока.
Как может пройти 850 таких проходов, а удалится 200 блоков.
У меня при удалении куба идёт пересчёт меша. Может у меня меш не успевает пересчитываться.
У меня идёт пропуск, когда удалилось 2 куба очень быстро.
А если в одном чанке работают несколько дронов, там несколько штук за раз может удалялся.
Поэтому такая разница
Создал ограничение, чтобы в один момент не запускалось несколько объединение меша.
Ничего не поменялось.
Видимо программно уже есть ограничение, чтобы нельзя было запускать метод пока он не завершил свою работу.
Но по этой причине бывают дыру в меше. Очень редко, но бывают.
Всё ровно в триггере проблема.
Было 1000 кубов. стало 833. Должно быть 167 контактов.
А было 314...
Проверил генерацию. Никаких невидимых объектов нет.
Но эта проблема происходит, когда дрон очень быстро прикасается к двум объектам. И за место 2 контактов регистрируется больше.
Хотя это не должно влиять на фпс.
Но профиль говорит, что 30-50 процентов уходит на триггеры.
Отключил объединение мешей и ФПС больше 100.
Только нельзя на кубы смотреть ФПС до 0 падает.
Непонятно...
Проведя эти часы за оптимизацией, всё ровно пришёл к этим триггерам.
Идёт много уничтожения объектов, хотя по факту их намного меньше.
Кубов 1000, а уничтожений 2200
---
Обнаружил очень полезную строчку кода.
Resources.UnloadUnusedAssets();
https://docs.unity3d.com/ScriptReference/Resources...
Удаляет неиспользованные ресурсы из памяти. Не знаю на что она ещё влияет. Но пока помогает.
Но игра всё ровно виснет при выходе, если перед выходом ФПС мало.
И ФПС при коллизиях также сильно падает.
---
Не думал, что коллизии настолько тяжелы для Unity.
Пришлось искать обходные пути. Добавлять дополнительный код в метод Update.
Даже это лучше чем использовать OnTriggerEnter.
Сейчас считаю расстояние, если слишком близко, уничтожаю объект.
Сейчас нужно оптимизировать объединение мешей.
Сейчас на это уходит в среднем 50% и 20 процентов на уничтожение объектов.
Ещё приходится использовать "костыли" в виде меток, что процесс уже пошёл. Чтобы один код не запускался по несколько раз.
Есть вероятность, что за место удаления объектов буду их куда-нибудь девать. Но будет куча "покалеченный" объектов на сцене.
Хотя рендера на них не будет и все скрипты будут деактивированы. Может это будет лучше чем полное удаление. А то 20% много для такой несложной операции, по крайней мере так кажется.

-13
-14
-15

---
С этими оптимизациями я как то умудрился избавится от утечки памяти.
Сейчас не нужно использовать Resources.UnloadUnusedAssets();
Или делать это очень редко для профилактики.
Я их называю "костылями". В коде обозначается test. Чтобы код не могу запускаться по несколько раз.
Может это не всегда уместно, но нагрузки эти проверки особо не добавляются.
По крайней мере есть эффект. Хотя я и в целом код постоянно видоизменяю.
Также все отработанные кубы я скидываю в мусор. В теории их тоже можно все удалить раз в несколько минут. Но пока проблем с ними нет.
Сейчас нужно оптимизировать комбинацию мешей.
Пришлось отключить отключение невидимых мешей, чтобы уменьшить нагрузку при объедении.
Так как в моём коде использовался OnTriggerEnter. И каждый дрон создавал много коллизий.
Хотя с новыми знаниями я может смогу обойти эту проблему.
Прикольно получать новые знания, но приходится переписывать многие части кода.
Ещё пришлось создать промежуточный код test2.
Мне нужно было обратиться к родителю уничтожаемого объекта.
А напрямую у меня возникали ошибки. Которые плавили мне мозг. Может позже исправлю, когда изучу что-нибудь новое.

-16
-17

Ещё я сообразил, что меш можно сохранить при создании объекта.
А я для чего-то создавал новый куб, брал у него меш и удалял.
---
Погнавшись за красотой внутреннего мира, уменьшая визуально размер объединённого меша, я загнал себя в угол.
На процесс уменьшение мешей уходит больше ресурсов, чем скомбинировать все меши в один, не трогая оригиналы.
В итоге удалил ещё большой кусок кода и ФПС стал стабильно больше 100. И это в редакторе.
Хотя по сути я сделал откат к предыдущей версии. к 3 октября.
Потом отключу выполнение скриптов, если игрок находится далеко. И добавлю Лоды.
Ещё заметил, что оперативной памяти всё ровно используется много.

-18
-19
-20

---
Разобрался с мешами.
Почему то в прошлые разы не получалось это выполнить.
Неужто опыт помог... и по сути банальные вещи для меня реально стали банальными. )
Я просто в префабе выбрал один меш, и сейчас они не дублируются и память ими не забивается.
Также можно меш брать из префабе другого объекта. И он тоже будет один на всех.

-21
-22
-23

---
Немного оптимизировал выбор цели для дронов, чтобы они не летели к одной и той же цели.
Но из-за этого отключилось переопределение цели во время полёта.
Дрон целенаправленно летит к цели и только после её уничтожения ищет следующую.
А из-за того, что область поиска цели я увеличиваю очень медленно, движение дронов выглядят очень хаотично.
Хотя после оптимизации я могу увеличивать область поиска быстрее.

-24
-25

Пробовал в цикл while добавить условие btarget==null
Но ничего не работает.
Пришлось делать дополнительное условие внутри цикла.
И выход из игры стал работать быстрее.
---
Ещё убрал предупреждение, что в массиве есть объект без меша. И он его не может объединить.
До этого я указал, чтобы он не объединял сам себя.
Но не указал, чтобы он создавал новый массив на один меньше.
Сейчас у меня добавился ещё один объект, который не нужно объединять и этих предупреждений стало в два раза больше.
Вот я и решил подумать. )
Ещё я попробовал использовать LOD Group, но это оказалось не удобно.
Написал свой код для этого.

-26
-27

Сейчас нужно научится создавать глобальные переменные. К примеру список объектов.
При создании чанка у меня ищется игрок. А на сцене десятки тысяч объектов.
Дроны тоже искали корзину с мусором, но я пока отключил.
А поиск игрока отключить не могу.
---
Очередной банальный, но очень нужный для меня навык.
Это использование глобальных переменных. Только что научился пользоваться. :)
Создал скрипт и добавил туда координаты игрока и игровой объект с мусоркой.
И в скриптах заменил поиск этих координат и объекта по сцене. Так как эти процессы очень тяжёлые.
Таким образом у меня исчезли подвисания при генерации чанков и установки дронов.
Сейчас у меня вся нагрузка уходит на объединении мешей.

-28
-29
-30
-31
-32

---
Вернул в код OnTriggerEnter. В текущей версии игры это не грузит систему.
С помощью триггеров я уменьшаю объединённый меш.
OnTriggerEnter уменьшает ФПС периодически. А оптимизация меша поднимает ФПС навсегда.
И стал указывать пребаф не через инспектор, а через код Resources.Load<GameObject>("Земля");
И вернул очистку памяти Resources.UnloadUnusedAssets().
И что в итоге...
Ничего...
В редакторе всё работает замечательно.
Создал одинаковые условия.
В редакторе до очистки - всего 1.79. Мешей 0,7.
После очистки - всего 1.09. Мешей 0,1
В игре - всего 2.3. Очистка не работает.
И на что уходит память не понятно...

-33
-34
-35
-36

---
С памятью пока не разобрался. Нужно как то удалять старые меши через код. и минимизировать добавление новых.
Там каждый чанк по мегабайту. И каждый куб по несколько килобайт.
Но убрал строчку в цикле объединения мешей. Добавив несколько срок до и после цикла.
Думаю небольшой прирост ФПС должен быть.
Тестировать лень.

-37

---
У меня же везде только кубы, все одинаковые на данный момент.
Тогда зачем мне хранить меши на каждом кубе, если я могу хранить один образец на чанках...
Позже конечно придётся придумывать, когда виды земли будут добавляться. Но там будет работа с текстурами, а не с мешами.
Но на текущий момент сойдёт.
В итоге у меня в памяти только меши чанков и всё. Ещё нужно их оптимизировать, а то принцип поменялся. Сейчас лень этим заниматься.
В скомпилированной игре оперативная память всё ровно тратиться больше чем в редакторе.
Может ещё что-нибудь придумаю.
И ФПС тоже стал лучше. Но нагрузка на процессор от 20 до 30%, в ждущем режиме в начале игры. Даже в пустой сцене...
Может из-за отсутствии ограничений на частоту кадров.

-38
-39
-40

Да, проблема с частотой кадров. ограничил до 100.
Application.targetFrameRate = 100;
Нагрузка на процессор исчезла.
---
Посмотрел очень полезное видео.
Там человек объединяет меши своим кодом. В том числе материалы.
И там я увидел интересную строчку UnityEngine.Rendering.IndexFormat.UInt32;
Это увеличивает количество вершин до 4 миллиаров... У меня сейчас 65 тысяч.
Я таким образом могу сделать огромный меш...
Но написано, что это не везде работает. Но это вроде на некоторых мобильных устройствах.
Буду тестировать.
https://docs.unity3d.com/ScriptReference/Rendering.IndexFormat.UInt32.html

Уже хотел видео по текущей версии игры делать, а тут такая новость...
Хотя ещё долго тестировать буду и генерировать большую территорию сразу.
Поэтому можно и записать будет текущую версию.
---
Для оптимизации объединения мешей пришлось запустить ещё один цикл для отсеивания скрытых кубов.
Думаю это будет быстрее, чем пытаться объединить пустые меши. И в консоли сейчас не появляются предупреждения о пустых мешах.
Хотя я предполагаю, что отсеять можно побыстрее. Но я другого способа не придумал и этого пока хватает.
Ещё в цикле объединения убрал одну строчку. Её нужно было убрать в прошлый раз.

-41
-42
-43

строчка btarget.gameObject.SetActive(false) нагружает систему.
Заменил на
btarget.GetComponent< Mesh2 >().enabled = false;
btarget.GetComponent< Collider >().enabled = false;
Никакой разницы. Также грузит.
Убрал btarget.GetComponent< Mesh2 >().enabled = false;
Стало лучше.
Добавил в Mesh2
if (transform.parent.name == "Trash")
{
Destroy(GetComponent< Mesh2 >());
}
Когда попадают в корзину, то отключаются.
Ещё нужно заменить Physics.OverlapSphere на лучи. Чтобы проверять только 6 сторон.
OverlapSphere собирает коллайдеры, а мне ничего собирать не нужно. Мне нужен только тег для проверки.
---
Пришлось отключить автообновление, после изменения скриптов.
А то я часто забываю отключать игру. Просто стоит на паузе. И если в этот момент изменить код и и войти в программу, то программа зависает.
В теории она запустится через какой то время, но это очень долго.
Но нужно не забывать обновлять игру перед запуском.

-44

Ещё было бы хорошо выводить из цикла автоматически, если он бесконечный.
А то иногда забываю добавить условие. И программа зависает сразу, даже если запуск идёт с паузой
При while(true)
---
Ради интереса поискал стажировку на Unity. По первой ссылке открылась стажировка C#.
Почитал вакансии, сложно и непонятно.
На том же сайте поискал просто Unity.
Прочитал первые 5 вакансий, всё понятно и интересно.
Только желательно портфолио. Для меня это будет моя игра в будущем.
И весь мой процесс обучения перед глазами. )
Только в моём городе не нашёл. Или удалённо, или ехать кудато.
Короче есть куда стремится.
---
Одно лечим, другое калечим.
Обнаружил что при объединении мешей в одном чанке, туда попадает меш из самого первого чанка
И я пока не могу найти логики. Где что нужно указывать и создавать по другому.
И это начинается только с первого чанка. Если его не трогать то вроде всё нормально (хотя это не так. Оптимизация на других чанках оказывается не работает. Только на самом первом чанке.). Нужно попробовать сгенерировать первый чанк через скрипт. Сейчас я его руками в редакторе добавил.

-45
-46
-47

Я оказывается лучи пускал без корректировки. Все пускаются от нулевых координат.
Придётся делать массив при создании каждого куба...
---
Добавляю чанк (1, 2, 3)
Опрашиваю куб внутри чанка
Локальные координаты куба(-4.5, -4.5, -4.5)
Глобальные (-3.5, -2.5, -1.5)
Всё верно.
Запускаю этот же опрос из другого скрипта
meshFilters[i].GetComponent<Mesh2>().test2()
Локальные координаты куба(-4.5, -4.5, -4.5)
Глобальные (-4.5, -4.5, -4.5)
Где логика... и как это исправить я пока не знаю.

-48
-49

Попробовал создать новые координаты.
Vector3 localPosition2 = transform.position;
Но в test2. Не помогло.
Сейчас попробую при старте сохранить координаты.
Логику я не понял, почему перестают определятся глобальные координаты, если запускаешь метод из другого скрипта.
---
Из-за проблем с глобальными координатами я куча времени потратил на всевозможные тесты в разных условиях.
Но решил проблему, сохранением этих координат при создании куба, в переменную.
И в дальнейшем уже использую её.
Сейчас всё работает как надо. Осталось проводить краш-тесты и оптимизировать работу дальше.
И если я не придумаю что можно ещё улучшить, то начну разработку следующего этапа. Скорей всего это будет генерация пещер и месторождения ресурсов. Я примерно представляю как это сделать, но только в теории.
Хотя ещё хочу попробовать объединить все чанки в один меш. Если у меня есть возможность увеличить количество вершин до 4 миллиардов в одном меше.

-50
-51
-52

---
В итоге я убрал строчку запускающую проверку из другого скрипта.
И за место этого использую OnTriggerEnter.
Скачки до 15 ФПС исчезли, так как не нужно опрашивать все кубы в чанке.
Но на поздних этапах ФПС падает.
Сейчас буду пробовать объединять все кубы в один большой меш. Не трогая чанки.
Это должно сэкономить оперативную память, но врятли компьютер с этим справится.
Иначе придётся оставить эту систему, и периодически объединять все чанки. Но нагрузка на память увеличится... Но увеличится ФПС.

-53
-54
-55
-56
-57

Хотя по сути меш не так сильно грузит. Больше работа дронов.
В основном это SetupCoroutine.InvokeMoveNext
Надо попробовать избавиться от корутины.
Он каждый шаг делает MoveNext. Если я правильно понял.
Вроде это нагружает систему.
---
Ради интереса 6 октября установил счётчик затраченого времени на сайтах.
Оставил только то, что связанно с unity и больше 100 секунд.
Это активное время, когда я что либо делал на сайте.

-58
-59

---
Может я пытаюсь сделать невозможное...
Пока упёрлось в запуск пересчёта меша.
1 вариант. Делаю через IEnumerator. Чтобы создать задержку с помощью WaitForSeconds
Тормозит MoveNext. Как я понял это делается на каждом шагу и передаёт делать следующий шаг или закончить.
2 вариант. Делаю через Update.
Он сам тормозит, он работает на всех и всегда. Даже если там одна проверка перед запуском.
3 вариант. Запускаю из другого скрипта с помощью GetComponent<GenCube>().MeshComb();
Тормозит сам GetComponent
Больше вариантов я не знаю...
P.S.
Вытащил GetComponent из цикла.
Сейчас только объединение меша тормозит. и там GetComponent в сортировке
И это 50 станций. Следовательно 200 дронов. Может хватит оптимизировать...
Я врятли игрокам дам возможность строить столько дронов.
А я этих дронов ставлю за секунд 20.
Но хочется, чтобы их было бесконечное количество и при 100 ФПС. :)
Хотя это желание помогает мне найти лучший вариант. Иначе бы у меня эти проблемы вылезли на поздних стадиях игры.
Добавил скриншот c пятью станциями. Там большая часть на работу программы уходит. Пока только пики на генерации кубов. и не важно по одному кубу я их создаю или сразу пребаф из 1000 кубов.

-60
-61

Я GetComponent в цикл случайно засунул.
Заменил
meshFilters[i].gameObject.GetComponent().test == 1
на
meshFilters[i].gameObject.name == "Cube1"
Но лучше не стало почему то.
И при большом количестве дронов показатели меняются.
Затраты идут на другие компоненты или в других пропорциях.
Все Get и всё, что нужно вытащить из объекта превращается в мусор.
При этом появляется строчка GC.Alloc.
---
Как же сложно избавится от корутины.
в IEnumerator добавил только одну строчку которое запускает метод в другом скрипте. И уже нагрузка пошла.
Пришлось извращатся с Invoke
Это чтобы уменьшить частоту комбинаций меша. Выглядит хуже, но нагрузка меньше.

-62

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

-63

Но из-за редких обновлений, у меня появляются дыры.
Видимо нужно снова забыть об оптимизации размера меша.
Как я уже делал один раз, но почему то снова пытаюсь это сделать...
---
Убрал у дронов поиск ближайшего куба. Сейчас они летят к самому первому из списка и не проверяется весь массив.
В итоге всё ровно будет перебираться весь массив, когда подходящие цели закончатся.
Но в любом случае это лучше.
И вывел создание массив в отдельный метод.
Раньше у меня каждый раз создавался новый массив.
Сейчас новый массив создаётся поле того, как закончится старый.
И тестировать такой код проще.
Глубокий анализ в профиле чётко показывает, какой метод нагружает систему.
И чем я сильнее разделю код на такие куски, тем проще будет работать.
Для примера добавлю скриншот. Это я снял ограничение на частоту комбинирований мешей.
И нужно лучше подбирать название методов, чтобы самому не путаться.

-64
-65

Ещё отработанные кубы отправляю в "космос" btarget.transform.position = new Vector3(0,100,0); Чтобы они не попадали в массив.
И добавил в physics.overlapsphere маски. Даже не знаю почему до этого этого не сделал.
Сейчас в массиве только нужные мне кубы.
Ещё пробовал сделать один один огромный меш из всех кубов. Собирается, но очень медленно.
---
В поздних стадия игры уже не получается тестировать игру в программе. Много ресурсов уходит на работу самой программы.
Оказывается можно скомпилировать игру с подключением к профайлеру.
При запуске игр, запускается профайлер и показывает то, что происходит в игре.

-66

---
Надоело мне поднимать ФПС.
При этом не допустить увеличение оперативной памяти, хотя всё ровно много жрёт.
Дальше буду изучать случайную генерацию в 3D пространстве.

Хотя внешне от предыдущей версии не отличается...
Там только оперативной памяти использовалось очень много
Но ФПС там вроде даже побольше было.
Но фризов было тоже больше. )
---
Очень странный результат...
Пока не могу даже проверку на координаты сделать правильную.
Нужно передать глобальную точку координат.
И как я погляжу... шум слишком мелкий.

-67
-68
-69

---
Эта генерация мне не подходит. Я вроде разобрался с размерами. Но она симметричная.
Хотя "на безрыбье и рак рыба"
Это заметно, если смотреть со стороны.
P.S
Тут нужно экспериментировать с разными параметрами.
И мне уже нравятся результаты.
На этой основе можно тестировать генерацию разных ресурсов. Только я не смогу их комбинировать в один меш, без дополнительного обучения.

-70
-71
-72

Этот кубик стоит 3 гигабайта оперативной памяти...
Скомпилировал игру. Сгенерировал пещеры. Запустил дронов.
И не почувствовал разницы. Нужны ли мне пещеры...
Но я научился генерировать пещеры. :)
---
Ради любопытства заполнил пещеры землёй, а землю убрал.
Полезно для понимания соотношения пустот к земле.
На сегодня хватит. Изменил несколько строк кода и всё.
Но достижение достигнуто. )
Чтобы убрать симметрию, я сдвинул начальную точку очень далеко.
var fff = new Vector3 (transform.localPosition.x+x-4.5f,transform.localPosition.y+y-4.5f,transform.localPosition.z+z-4.5f);
float noiseValue = Perlin3D(fff.x*noiseScale+1000,fff.y*noiseScale+2000,fff.z*noiseScale+3000);

-73
-74

---
Сегодня помучился с программой. После очередного запуска, в консоли стали вылазить ошибки NullReferenceException: Object reference not set to an instance of an object
И они не связанны с игрой. Я обновил версию игры, ошибки исчезли, но не работает экспорт.
Я почистил всё что можно, удалил, перезагрузился, установил по новой. Не помогло.
В итоге сбросил настройки отображения окон и всё заработало.
Он мне выдал.
Failed to destroy editor windows: #1
PackageExport
UnityEditor.<>c:<ReloadWindowLayoutMenu>b__35_0()
Что это было, почему всё сломалось, не понятно.
Но главное, что всё работает. И я почистил проект от мусора. Думая, что создам новый проект и перекину туда файлы.
Но в новом проекте было тоже самое. После чего я начал мучать интернет своими вопросами.

-75

---
Не могу разобраться с оперативной памятью.
Создаю сцену без кубов - 55 мегабайт
Создал 200 чанков разной плотности - 730 мегабайт. Уничтожил всё дронами -720 мегабайт
Создал снова 200 чанков. Через код сразу удалил. - 490мегабайт
Создал 1000 чанков. Через код сразу всё удалил. - 2400 мегабайт
В профиле пусто. Но зарезервировано 2450. И не уменьшается.
И что значить Unity в скомпилированной игре мне тоже не понятно.
И пока я с этим не разберусь, дальнейшая разработка бессмысленна. Мне не хватит оперативной памяти.
И указано, что у меня на сцене ещё много объектов. Хотя там пусто, только игрок с камерой.
GameObjects in Scene: 22
Total Objects in Scene: 118
Total Object Count: 693

-76
-77
-78

Пустая сцена оказывается не такая уж и пустая...

-79

Куча системных файлов и прочей ерунды.

-80

Прочитал, что память должна высвобождаться, но этого не происходит.
---
Раз пошла такая пьянка. Установлю Unreal Engine.
Язык программирования С++
Сначала установился лаунчер Epic Games.
Потом сам движок в 11 гигабайт.

-81
-82
-83

Первое впечатление.
Создал пустой проект, без стартовых пакетов.
Запустил сцену и могу управлять камерой, летать по сцене.
Не нужно для этого писать код и прочих танцев с бубном.
Ну а в остальном учится с нуля...
---
Первый опыт, научился работать с циклами и создавать при помощи них координаты.
Для сравнения покажу как это выглядело в Unity.
Пока не научился добавлять пребафы на сцену.

-84
-85

---
Куб из кубов готов. Программа минимум выполнена. :)

-86
-87

Сейчас нажал на кнопку похожую на компиляцию игры. И всё зависло.
Пока жду, может одумается.
Хотя там должна появится менюшка с выбором платформы. А он просто завис...
На форуме я увидел свежие сообщения об этой же проблеме. Сентябрь.
Получается разработка останавливается из-за независящих от меня причин.
Как вариант перейти на более старую версию. Вроде на ней проблем нет. Если судить по форуму.
Ещё 10 гигабайт
---
Какие то проблемы в новой версии. В старой версии всё работает.
И я нашёл на чём зависает программа.
Я не понял что делает кнопка Launch. Она создаёт копию проекта внутри проекта, но там можно запустить саму игру.
Смысла я в этом не вижу, там открытый код.
Я нашёл как скомпилировать игру. Через главное меню Package Project. При этом программа не зависает и показывает что она делает.
А делает она compiling shaders. 2600 штук. И очень медленно. Но этот процесс можно остановить.
При условии, что на сцене у меня ничего нет.
P.S.
В итоге нужно было дождаться обработки этих 2600 шейдеров. Больше они не появляются.
Видимо не появятся до момента работы с материалами.

-88
-89

Удалил из проекта весь стартовый пакет кроме одного куба и его материла. Ничего не изменилось.
Поползал по ютубу. Это свежая проблема. У многих. И вроде нет особо решений.
Оставил в работе эти 2600 шейдеров. Только где он их нашёл...
дождался.
В следующие разы этого не появляется. хорошо.
Кнопка Launch тоже работает без зависания
---
Пока приторможу с разработкой. Хотя и не начал особо...
Unreal Engine мне лень изучать.
А в Unity проблема с оптимизацией оперативной памятью.
А менять концепцию игры из-за этого не охота.
Можно попробовать перейти в воксельную графику. Но это тоже изучать всё с нуля.
Пока продолжу заниматься игровым каналом. Купил зелёный фон. Буду с ним играться. )
Любопытная воксельная игра.

---
Хотя в Unity нужно протестировать мою первую систему генерации блоков. Массово я её не тестировал.
Я там не использую объединение мешей. Там много удаление блоков. С новыми знаниями думаю получится что-то сделать.
Но если и эта систему будет тратиться много оперативной памяти, я точно временно брошу это дело.

---

-90
-91

Пробовал добавлять блоки самостоятельно за сцену, чтобы запечь сцену. После этого игра отключает объекты которые не видно.
Но всё равно верхний слой состоит из множества кубов. Этого хватает чтобы нагрузить видеокарту.
Есть вариант купить крутую видеокарту. но для кого тогда я делаю игру? только для тех у кого крутые компьютеры?
У меня и денег не хватить так сильно улучшить свой компьютер.
Хотя по сути, готовая игра не является конечной целью. Главное процесс обучения. Но обидно, что текущие условия не позволяют мне сделать глобальную игру.
Сейчас игра Teardown сталкивается с подобной проблемой. Она интересная, весь мир можно разрушить до основания. Но игра очень требовательна к ресурсам компьютера.
Нужно будет профиль ещё раз проверить. А то на текстуры ушло 100 мегабайт.
А я на сцене текстуры не использовал.
Хотя это не критично.