Автор Тема: Качественный террейн в Unity3d  (Прочитано 24411 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Январь 02, 2014, 03:18:21 am
Прочитано 24411 раз

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
И так, уже давненько ломаю голову над всевозможными решениями данной задачи.

Ну да, террейн в Юнити есть, и есть редактор, в котором каждый школьник может по-быстрому натворить, почти любой ландшафт...
Но будет ли это ландшафтом приемлемого уровня? Не говоря уж про уровень игр AAA, про который всё больше упоминается вокруг да  около Юнити... 
И если допустить что будет, то насколько приемлема окажется стоимость такого качества  ландшафта, в смысле ресурсов системы?


Проблема количества текстур террейна, в Unity3d
Незнаю, как с этим обстоят дела в других движках, но в Unity3d всё упирается в довольно существенные падения fps, которые начинаются уже  даже от абсолютно чистого, только что созданого террейна...
Вот создаю новый террейн, запускаю, и где-то как минимум, минус 30 fps, уже улетает в никуда...
Текстуры - это ещё одна "хромая нога", в Юнити-террейне.
Везде можно найти советы умников, не использовать на террейне более 4 текстур (4 диффуз + 4 нормал)
Ну и какие игры могут быть созданы, с таким бедным набором текстур? Уж явно, это будут игры не этого века, а прошлого (если конечно это не спецефичные игры-бродилки, в которых не требуется разнообразие поверхности террейна и гор)
Понятно и ежу, что для современного левел-дизайна, тестур нужно больше.

И вот какая просадка по fps, лично у меня получается:

0 текстур = 51-52fps
1-4 текстуры = 49-52fps
5-8 текстур = 38-42fps
9-12 текстур = 34-36fps
13-16  текстур = 28-31fps

Причём, текстуры просаживают fps независимо от того, использованы они на террейне, и в какой мере использованы.
 - оно и понятно, так как лишь первые 4  текстуры, отрисовывает основной шейдер за один проход.
А для отрисовки кажой четвёрки дополнительных текстур, вызывается  дополнителный шейдер, и отрисовывает их по 4 текстуры за 1 проход. Тоесть 8 текстур = 2 прохода, 12 текстур = 3 прохода, 16 текстур = 4 прохода шейдера.

В итоге, даже с всего 4 текстурками, получается джопа...
При узком окне во вкладке редактора, ещё так-себе, где-то порядка 40 fps в сцэне, не нагруженой ничем, кроме террейна с небольшим количеством горок. Но при разворачивании экрана на широкоэкранный монитор, шириной 1280 - fps уже падает до 30, а местами и ниже...
« Последнее редактирование: Январь 02, 2014, 03:31:45 am от Mimi Neko »

Январь 02, 2014, 03:31:31 am
Ответ #1

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Проблемы тайлинга текстур
Другая проблема - тайлинг текстур на террейне. (ну для меняэто уже давно не проблема, но с этой проблемой сталкивается любой новичёк)
Многие конечно замечали, как издали некрасиво выглядят однотиипные ковры  текстур на террейне, которые вблизи, вроде бы смотрелись очень ничего.
Проблема конечно не столь велика, и методы борьбы с ней уже придуманы и описаны не раз в интернете.
Один из методов - наслоение одной и той же текстуры, но с различным тайлингом, одна поверх другой.
Другой метод - наслоение двух разных текстур, одна на другую.
Но для обоих методов, нам нужны 2 текстуры, из 4 возможных (если поджимает fps)
Ну и оставшаяся пара у нас пойдёт на горы, чтобы они хоть какой-то вид имели...
Вобщем, с текстурами нужно серьёзно допиливать движёк... либо как-то хитро изъёживаться.

Интересно, что иностранцы наоборот, идут по пути увеличения числа применяемых текстур.
Есть очень интересные решения  и мастерклассы, и я постараюсь в этой теме, их все рассмотреть.
Многие я попробовал, есть такие что ну очень впечатляют... Но расход ресурсов зачастую такой, что почти не оставляет места, для серьёзной игровой логики, и мультиплеерных функций.

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

Январь 02, 2014, 03:53:33 am
Ответ #2

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Редактор террейна в Unity3d
Редактор террейна в Юнити конечно не плохой, но удобным я бы его не назвал.
Вобщем, чем больше с ним  работаю, - тем больше осознаю, что нужно делать свой.
Например, куда удобней выполнять все работы по оформлению игрового мира, непосредственно бегая или  летая по миру, админским персонажем, создавая  где надо горы и впадины, нанося нужные текстуры, подгоняя с большой точностью любые элементы и рельеф, устанавливая растительность и прочие игровые объекты.

Первые эксперементальные шаги в этом, я уже сделал. Уже могу прямо в запущеном проекте, бегать чаром, и мышкой изменять рельеф террейна, создавая возвышенности и горы, либо убирая их.  Поскольку происходит редактирование самой terrainData, то результаты изменения поверхности, не требуют сохранения.

В принципе, я уже продумал ряд интересных решений, которые можно дополнительно реализовать, таких как клонирующая кисть, наподобии как в фотошопе,  а так же выделение частей рельефа на террейне, вырезание их, вставка, копирование или произвольное перемещение по террейну.
Так же возможно и расширение наборов кистей, и управление их настройками.
Например, в стандартном редакторе террейна, я замучился пытаться сделать ступеньчатые склоны или спуски,  да и просто плавные спуски-подъёмы, ровными сделать не так уж легко.

Правда сейчас упёрся в некоторую делему, с проблемой:
Нанесение возвышеностей на  террейн, происходит паттерном, представляющим из себя двумерный массив:
float[,] heights = new float[x,z];

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

Есть мысль, попытатся в качестве шаблонов кистей, использовать небольшие png карты высот...
Но пока что не нашёл способа конвертации png в двумерный float-массив...
Ну и по изменению размеров кисти - видимо, было бы удобнее всего, изменять габариты этой карты высот, и затем конвертировать в паттерн.
Но как это реализовать программно на С# - пока что тоже неизвестно.


Когда разберусь с этой частью реализации, буду думать над функциями нанесения текстур, и возможно, над новым принципом текстурирования террейна. Идея есть, но её ещё нужно обдумать и проэкспериментировать.
« Последнее редактирование: Январь 02, 2014, 04:00:14 am от Mimi Neko »

Январь 02, 2014, 22:05:30 pm
Ответ #3

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля

Проблемы потребления системных ресурсов

Провёл некоторые тестирования с террейном, на своём компьютере:
(на другорм конечно результаты будут другие, в зависимости от производительности системы и видеокарты)

Пустой проект - свободные ресурсы: 
(редактор, во вкладке 782x674) = 67-68fps 0dk
(редактор, полный экран 1280х674) = 66-67fps 0dk

Террейн по умолчанию (2000х2000х600):
(редактор, во вкладке 782x674) = 67-68fps 1dk
(редактор, полный экран 1280х674) = 67-68fps 1dk

Террейн с 1 текстуркой  + немного гор:
(редактор, во вкладке 782x674) = 67-68fps 11dk
(редактор, полный экран 1280х674) = 67-68fps 14dk
----------------------------------------------------------------------------


вид 1

Весь террейн в неровностях и горках:
(редактор, во вкладке 782x674) = 69-70fps 127dk
(редактор, полный экран 1280х674) = 46-49fps 170dk

или
(редактор, во вкладке 782x674) = 57-59fps 154dk
(редактор, полный экран 1280х674) = 39-42fps 207dk

---------------------------------------------------------------------


вид 1a

(редактор, во вкладке 782x674) = 46-49fps 171dk (трис 99.0к  верт 49.4к)
(редактор, полный экран 1280х674) = 30-31fps 257dk (трис 148.7к  верт 74.3к)

после экспорт-импорт хейджмап 16 бит (1-2  раза), изменений абсолютно никаких:
(редактор, во вкладке 782x674) = 46-49fps 171dk
(редактор, полный экран 1280х674) = 30-31fps 257dk
---------------------------------------------------------------


вид 1b:



При пиксел ерор = 5:
(редактор, во вкладке 782x674) = 57-60fps 157dk
(редактор, полный экран 1280х674) = 37-39fps 230dk


При пиксел ерор = 200 - 100:
(редактор, во вкладке 782x674) = 68-69fps 23dk
(редактор, полный экран 1280х674) = 54-58fps 27 - 26dk

 К сожалению, не могу  ничего посмотреть профайлером по GPU, потому что эта графа там пустая, и написано что драйвер не поддерживается. а менять его на более старые как-то не тянет.

Из тестов видно, что видимо, в моём случае, идёт перегрузка видеокарты, даже по не столь значительным дравколам, и это просаживает FPS, и видимо изза слабоватой видеокарты, часть нагрузки ложится на CPU.

Из профайлера видно, что львиную долю ресурсвой потребляет рендеринг, а именно Mesh.DrawVBO
Что это, и возможно ли как-то его оптимизировать - ещё предстоит разбираться...
« Последнее редактирование: Январь 03, 2014, 21:16:13 pm от Mimi Neko »

Январь 02, 2014, 22:39:50 pm
Ответ #4

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Нарыл вот такой интересный пост, в зарубежной конфе, на оффсайте Unity3d:

Mesh.DrawVBO optimizations
Там приводится некий умопомрачительный скрипт... Видимо, для кешировани материалов и объектов?!

Ага, VBO это  Vertex Buffer Object
Вот ещё статейка про похожую проблему:
650+ DrawCalls, Mesh.DrawVBO

Пока что остаётся пытаться спасаться через оптимальный Pixel Error, ну и Base Map Dist. тоже малость экономит, на не прорисовке дальних текстур. Видимо, для слабых неигровых систем, прорисовка и детализация ландшафта, уходящего вдаль - непозволительная роскошь.
И ещё мне кажется, что даже Pixel Error не всегда спасает. Вроде бы на каком-то ландшафте, он уж слишком капитально обрезал весь вид, но экономия выходила не особо радостная...
« Последнее редактирование: Январь 02, 2014, 22:56:13 pm от Mimi Neko »

Январь 03, 2014, 23:17:30 pm
Ответ #5

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Чудеса с Pixel Error

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

Казалось бы, всё просто! Чем больше - тем лучше!
Но результаты сегодняшнего эксперимента, меня весьма озадачили...

Создаю чистый проект, и такой же чистый террейн. Выставляю настройки: 512 на 512 размер, высота 200, детайл и прочие  текстуры - 1024, хейджмап резолюшин 513, детайл резолюшин пер патш - 8
Подгружаю на террейн 4 стандартные текстурки, и хейджмап. Получаю простенький горный рельеф.
Ставлю источник освещения и камеру, чтобы был нормальный вид.

Выставляю Pixel Error = 39,  и запускаю:

 - 24 дравкола и 59 фпс

Выставляю Pixel Error = 29, и вижу:

 - 43 дравкола, 507 фпс! (небывалое для моего компьютера!)

Что интересно, в свёрнутом во вкладку редактора окне, фпс ниже, но всёравно выше чем на первом скрине:


Едем  дальше, Pixel Error = 100:


Pixel Error = 200 (максимум):

 - Террейн до нельзя упростился, дравколы снизились до 10, но прироста фпс как небывало...

 - WTF??!  :o

Ну и чтоб совсем уж оконьчательно всё запутать, я снова уменьшаю Pixel Error, но до 25:

 - Эффекта нет!

Получается, что есть какой-то диапазон, который наиболее оптимальный для данного террейна или вообще, и его нужно нащупать опытным путём?
Или всё это глюки Видеокарты, либо Юнити?
На всякий случай, я уже не один раз перезапускал всё и проверял - ничего не меняется.
Даже наоборот, опытным путём удалось выяснить, что повысив немного Pixel Error до 37, можно попасть в ещё более оптимальную точку, и фпс поднимается до 600!

Вот такие чудеса...



« Последнее редактирование: Январь 12, 2014, 21:57:22 pm от Mimi Neko »

Январь 05, 2014, 23:53:09 pm
Ответ #6

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Вобщем, описаный выше прирост фпс, на двух других террейнах стандартного по умолчанию размера, небыл замечен...
Значит и рассчитывать на него нет смысла.

Решил пойти немного иным путём, взял скрипт, для експорта террейна в мешь, экспортнул для начала с настройкой хальф.
Открыл в максе - ох мама родная!
524 288 полигонов!

Но это ведь ещё упрощённый террейн...
Экспортировал полный - за миллион полигонов перевалило! Макс вылетел с ошибкой, при попытке загрузки.
Собственно, такого количества полигонов и следовало от террейна ожидать, если размер хейджмапы 1024х1024 то
1024*1024 = 1 048 576 полигонов. а юнити работает с трисами, тоесть, делит все полигоны, на треугольники, в итоге будет за два миллиона трисов.

А ведь в интернете можно то там то сям встретить заверения некоторых умников, что наиболее оптимальный террейн - это стандартный террейн Юнити (тот который 2000 на 2000)  ;D

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

А ведь есть технология Редукции полигонов, применяемая уже давно в играх и движках:


Вобщем, выгрузил я хейджмапу, отбрезал в фотошопе лишние пустые поля, и сделал из неё террейн размерами 512х512 (габариты хейджмапы: 513х513).  Особо много это не сэкономило, почти ничего не изменилось.
Экспортировал это тиррейн в мешь, загрузил в макс, экспортировал в fbx. В результате увидел вот это:


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

Затем снова вернулся в макс, к мешу этого террейна:


Добавил модификатор опитимизации сетки, со стандартными настройками, и получил такую мешь:


После импорта в Юнити:

В этот раз тормозов уже небыло, и 8 мешей тоже.  Вверху слева, выводятся два подсчёта фпс, по двум разным методикам, найденым в зарубежных коммунити. Странно, но почему-то ни один из методов показа фпс, не сходится с фпс в редакторе...
С этим тоже ещё предстоит разобраться. 
Но верхнее, самое левое значение, практически соответствует показаниям фрапса! на полном экране примерно: 45 - 47 fps
С выключеным мешем: 58 - 58 fps
С выключеным мешем и выключеным персонажем: 63 - 78 fps
А на прежнем стандартном террейне, с этим же рельефом: 22-25 fps

 - Вот и чему верить? 
Судя по ФПС в статистике редактора, выигрышь уже просто чудесный!
А вот судя по фрапсу и фпс, измеряемому первым скриптом - выигрышь пока не так уж велик, но есть.
В любом случае, единая мешь - далеко ещё не самый оптимальный вариант.

По-видимому, для серьёзных проектов, с большим и сложным рельефом, террейн Юнити НЕ пригоден, и может использоваться лишь отчасти, для начальной разработки ландшафта.
Видимо, имеет смысл, делать ландшафт мешами... И даже не просто меши, а меши + их LODы.

PS: скомпилил тестовый билд с этим оптимизированым мешем, который выше - фпс в режиме 1280x768 принципе порадовал:
« Последнее редактирование: Январь 12, 2014, 22:00:35 pm от Mimi Neko »

Январь 06, 2014, 17:11:01 pm
Ответ #7

LiGuB

  • Пользователь

  • Оффлайн
  • **

  • 61
  • Репутация:
    5
    • Просмотр профиля
про что и говорили мы с тобой, что более всего прийдется брать терейн для небольших склонов, а горы лупить уже мешем

а вообще думаю тестить надо еще ТЕСТИТЬ!

Январь 06, 2014, 17:27:14 pm
Ответ #8

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
про что и говорили мы с тобой, что более всего прийдется брать терейн для небольших склонов, а горы лупить уже мешем

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

Апрель 05, 2014, 01:48:11 am
Ответ #9

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Попалась интересная статья от зарубежных коммерческих геймдевелоперов
тут есть над чем подумать...

Ландшафт игры:


Сетка этого ландшафта, с улучшеным разрешением, в отдельных важных участках карты:


Концепция "Патчей":
Патч система, с тремя уровнями обновления карты, относительно центра камеры игрока


Конвейер данных:


Vertex and Index Buffer Generation:


Читать Статью (english)

Апрель 05, 2014, 09:30:06 am
Ответ #10

LiGuB

  • Пользователь

  • Оффлайн
  • **

  • 61
  • Репутация:
    5
    • Просмотр профиля
такую фичу делал в jme3 (игровой двиг на яве) там довольно легко это делалось

Апрель 05, 2014, 09:54:32 am
Ответ #11

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
такую фичу делал в jme3 (игровой двиг на яве) там довольно легко это делалось
Что именно делал?

Апрель 05, 2014, 14:39:26 pm
Ответ #12

LiGuB

  • Пользователь

  • Оффлайн
  • **

  • 61
  • Репутация:
    5
    • Просмотр профиля
лод система (чем дальше от камеры тем меньшая плотность сетки)

Апрель 05, 2014, 14:46:31 pm
Ответ #13

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
лод система (чем дальше от камеры тем меньшая плотность сетки)
А сетка одной мешью или как?

Апрель 06, 2014, 08:55:12 am
Ответ #14

LiGuB

  • Пользователь

  • Оффлайн
  • **

  • 61
  • Репутация:
    5
    • Просмотр профиля
если память не отшибает то да, от расстояния зависело количество вортексов