Перейти к содержимому


Пара советов тем кто решил делать 3d


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 Andy_0x76

Andy_0x76

    Активный участник

  • Разработчик
  • 373 сообщений
    • 17
  • Город:Ростов-на-Дону
  • Мой телефон:iPhone 4S

Отправлено 22 August 2014 - 21:36

Развитие технологий не стоит не месте, и если еще вчера большинство игр на мобильных платформах были с использованием 2d графики, то уже сегодня многие разработчики перешли / переходят в 3d.  Ниже дам несколько практических tips, которые, возможно, помогут оптимизировать графику в вашем приложении, особенно, это будет актуально тем разработчикам, которые до этого вообще не сталкивались с 3d.

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

- 3d model.
Трех-мерная модель, которая используется в вашем проекте - это набор вертексов, полигонов , нормалей, текстурных координат. Обычно выполняется в любом 3d редакторе - 3ds max, maya, blender и т.д.

- текстура. Обычная 2d картинка, в любом удобном формате использования - png/tga/bmp/jpg.

- материал. Способ визуализации текстуры и модели. Если говорить проще, эффект, который имитирует какое-либо свойство - металл, неровность, блики, прозрачность или какой-то эффект.

Итак, что критично в реальном проекте при разработке 3d.
Прежде всего надо понимать, чем "тяжелее" 3d model, т.е. чем больше в ней полигонов, а соответственно и вертексов, нормалей и текстурных координат, а значит тем больше она занимает памяти, причем видеопамяти! Т.к. все данные модели,  текстуры после передачи на отрисовку хранятся в видеопамяти. При нехватки видеопамяти, используется ОЗУ, и происходит весьма тормозной процесс передачи данных по шине. Это первый момент. Второй момент, чем "тяжелее" модель, тем больше времени gpu (графический процессор) затрачивает на ее отрисовку, соответственно чем больше тяжелых моделей в кадре, тем ниже будет количество кадров в секунду (fps).
Тоже самое работает и для текстур - чем больше разрешение у текстуры, тем больше она занимает видеопамяти. И самое главное - текстура хранится в видеокарте в своем формате. Т.е., чтобы узнать сколько реально занимает ваша текстура видеопамяти в килобайтах умножьте ширину * высоту * 4 / 1024. Например текстура 512х512 точек занимает в видеопамяти 512 * 512 * 4 / 1024 = 1024 кб или 1 мегабайт! Проще способ - просто запишите вашу текстуру в формате TGA (32 bit) или BMP (32 bit) это и будет примерный реальный размер. Т.о. если вы думаете, что используя текстуру в PNG, размером в 80килобайт на диске, и разрешением 512х512 она будет столько же занимать места в видеопамяти на устройстве, вы ошибаетесь! Все дело именно в реальном разрешении в пикселах.


1: Оптимизируйте модель по количеству треугольников.
Здесь важно понять, какого качества требуется выполнить модель, чтобы она не была слишком угловатая (рубленная) но при этом хорошо выглядела на экране реального устройства.
Не забываете, что рассматривая модель в 3д редакторе в упор, это одно, но когда она будет отображаться на экране устройства размером в две пачки сигарет, то высокая детализации будет просто излишней, не заметной.
Если это мелкий объект в игре по отношению к остальным, ну например гиря, то нет смысла на нее тратить очень много треугольников. Куда важнее например сделать более детальным персонажа, или постройку, которую вы можете подойти и рассмотреть вплотную или на то, что у вас занимает большую площадь экрана.

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

Untitled-2.jpg
Примерный вид на устройстве. Как мы видим, хотя модель справа конечно выглядит более сглаженной и плавной, версия слева с количеством полигонов в 20 раз меньше! тоже выглядит весьма достойно, при этом мы сэкономили в количестве треугольников (а значит и в затратах по памяти и в производительности).


2: Модель это форма, детализация это текстура.
Все что можно показать на текстуре - рисуйте на текстуре, т.е. надписи, тени, объемы, блики, мелкие объекты вроде гаек, заклепок, и т.д. Это существенно уменьшит вес модели.

3.JPG


3: Удаляйте те треугольники, которые никто и никогда не увидит.
К примеру, мы гирю всегда ставим на уровне так, что она повернута к нам либо боком, либо лицевой частью, т.о. заднюю часть модели мы никогда не увидим, так зачем нам ее моделить и тратить ресурсы устройства в никуда? Правильно, мы просто удаляем те полигоны модели, которые никогда и никогда не увидит.

4.jpg
Изначально было порядка 200 треугольников, после удаления не видимых полигонов, стало 167.


4: Правильно используем текстуры.
Момент первый - разрешение текстуры в точках (пикселах), должно быть кратное степени 2. Т.е. правильная текстура может иметь размеры: 2,4,8,16,32,64,128,256,512,1024,2048,4096 пикселей, но никак не, например, 1435 х 987. Конечно можно использовать текстуру размерами 1435 на 987, но в этом случае система сама достроит внутри видеокарты размер до кратного степени 2 минимального размера соответствующего. Т.е. в итоге внутри, в видеокарте будет храниться текстура размером 2048 x 1024. Как следствие вы можете получить не правильный маппинг (наложение текстуры на модель) вы же делали развертку модели под 1435 на 987! и конечно куча просто потраченных ресурсов в никуда, т.к. эти достроенные до 2йки точки на текстуре никак не будут использоваться!

Кроме того, очень важно для iOS разработчиков - особенность ios в том, что система не поддерживает не квадратные текстуры. Например, вам достаточно для модели текстуры размером 512 х 128. Но, к сожалению, после загрузки, iOS достроит эту текстуру до 512 х 512! и откушает соответственно памяти в устройстве. Поэтому как можно эфективнее используйте этот момент. Обычно, просто на одну текстуру помещается несколько текстур для разных объектов:

5.jpg
Как видно из картинки на одну текстуру размером 1024х1024 точек я поместил 14 разных текстур для 14 разных моделей.
Т.о. я максимально использовал доступное пространство. Безусловно, можно сделать 14 отдельных текстур по 256 х 256 точек, но это тоже не эффективно, о чем будет написано чуть ниже.

Момент второй. Применяйте адекватный размер текстур. По началу, некоторые девелоперы, следуя логике - чем больше тем качественнее, делают огромные текстуры, к примеру (утрировано), на объект размером с пачку сигарет (в пропорциях на уровне) выделяется текстура размером в 512 или 1024 точек. Разумеется это необоснованная трата ресурсов, т.к. физически при размере экрана, например 960 x 480, чтобы увидеть всю детализацию и красотищщу вашей пачки сигарет ее нужно увеличить на весь экран. Если модель может быть размером максимум 20% от высоты экрана, то даже на ретина дисплее это составит 300 точек. Поэтому наиболее приемлемый размер текстуры для такого объекта, если это конечно не сложная форма, у которой обзор будет со всех сторон - 256х256 точек. Для сложных объектов можно использовать 512х512.

6.jpg
Модель мешка с монетами (на текстуре, номер 1) в разрешении 960 х 640 (iphone 4s/5s).


5: Применяйте материалы (эффекты).
С тех времен, как видеокарты научились работать с пиксельными шейдерами, а в телефоны начали встраивать серьезные видеопроцессоры, материалы в играх действительно преобразились. Что же такое материал? Если наглядно на примере, то смотрим сравнение двух одинаковых моделей, но с двумя разными материалами.

7.jpg
На модели слева используется просто текстура, с диффузным (обычным материалом), на моделе справа используется та же обычна текстура, но с материалом который имитирует рельеф (normal mapping + specular light).

(Начальная теория здесь: https://ru.wikipedia...текстурирование)

https://ru.wikipedia...org/wiki/Шейдер

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

Материалы позволяют вам существенно повысить привлекательность картинки, т.к. вы можете имитировать различные эффекты - воду, рельеф объектов, отражение, преломление, температурные искажение воздуха, пост эффекты и т.д. , но за все это нужно платить производительностью и fps, поэтому применять сложные материалы, основанные на shaders (пиксельных и вертексных шейдерах) нужно очень разумно.

Момент первый. Не перегружайте кадр материалами. Все то, что можно показывать обычным способом - показывайте. Чем больше физический размер экрана, тем больше физически будет выполняться просчетов, ведь материал (шейдер) будет просчитываться для каждого пиксела экрана там где они используется. Если вы перегрузите кадр моделями с шейдерами, вы просто получите низкий fps. Конечно существуют техники по оптимизации, например отключение щейдеров на моделях в зависимости от расстояния до камеры. К примеру, стоя на на расстоянии в 50 метров от вазы, вы вряд-ли увидите на ней рельеф поэтому материал с рельефом можно не применять, а отрисовывать вазу как показано слева, а вот уже с расстоянии в 15 метров можно активировать шейдер и видеть рельеф. Это дает выигрыш в fps.

Второй момент - Batches. Необходимо минимизировать число переключений состояний GPU (state changes) и максимизировать длину пакетов (batches).
К примеру если у вас 100 ваз, и на каждой вазе, свой уникальный материал, ну например на первой вазе используется материал с рельефом, на второй материал с отражением окружающей среды, на третьей блики под золото и т.д. При отрисовке кадра, будет ровно 100 переключений, т.е. видокарте нужно загрузить в конвеер новый материал, настроиться и отрендерить его. К сожалению процесс переключения состояний (batching) это очень ресурсоёмкий процесс, и не только для мобильных платформах. Поэтому необходимо оптимизировать отрисовку так, чтобы все модели с одинаковыми материалами рисовались за один раз. Если у вас 10 ваз с материалом рельеф, 5 ваз с материалом отражение и 17 ваз с материалом разводы под золото, вам необходимо так написать render pipe line, чтобы он рисовал модели не в случайном порядке, накручивая бестолковые batches, а последовательно, группами - сначала рисуем все объекты с материалом рельеф, потом с материалом отражение, потом все модели с разводами. В этом случае вы получите всего 3 переключения (batch), а не 23! Это правило так же применимо если у вас просто куча разных текстур на разных объектах,поэтому я рекомендую объединять небольшие текстуры в одну высокого разрешения.


6: Level of Details.
Для моделей, особенно для игр от первого лица, используйте Lods (level of details).
Теория здесь: https://ru.wikipedia...Level_of_Detail

Нет смысла перегружать gpu детализацией модели если ее на определенном расстоянии уже физически не рассмотреть. Фактически вам нужно хранить несколько вариантов одной и тоже же модели но с разной детализацией и рисовать нужную модель в зависимости от расстояния до камеры. Здесь вы затрачиваете больше видеопамяти, но можете поднять количество кадров в секунду.

8.jpg


7: Reused textures/materials.
Обычно, в проектах используется много текстур. И некоторые, не существенные объекты, могут быть затекстурены уже существующей текстурой. Т.е. к примеру у нас есть металлический контейнер, хорошая такая текстура 512х512 точек. Мы вполне можем так же использовать эту текстуру для какой-нить второстепенной модели вроде куска трубы, или гаечного ключа, или для ведра. Конечно было бы хорошо, для каждой мелочи рисовать свою текстуру, но не забываем, видеопамять не бесконечная, а работа по рисованию новой текстуры отнимает время и стоит денег.


8: Сформируйте технические требования.
Актуально для PMов и лидов. Особенно если работаете с outsource / freelance. Сформируйте четкий документ со спецификацией. Здесь потребуется участие тех лида, арт лида. По сути это небольшой список требований для разных отделов. К примеру для арт отдела, который создает арт контент,  требования к моделями и текстурам - количество треугольников, размер текстур, допустимость использования шейдеров исходя из категорий моделей и т.д. К примеру, максимальное кол-во треугольников для персонажа, допустим 3500, для крупных декора вроде техники - 1500, для объектов наполнения - столы, стулья и т.д. 120-150. Так же важно, чтобы финальная модель была готова к экспорту, все обнулено, корректно смасштабированно, прописаны текстуры в финальном разрешении, а не в psd, корректное название и т.д. Это существенно сокращает проблемы с рефакторингом, если потребуется, во вторых исключает недопонимание со стороны исполнителя и потери времени с формулировкой "а мне никто не говорил, что на ящик нельзя больше 50 треугольников и он должен быть в центре координат... ну ладно, я переделаю". В третьих не будет вопросов - "а чё у нас так все тормозит?". Всегда оставляйте исходники текстур, моделей и т.д. Храните итерации с существенными изменениями - стереть всегда проще, чем сделать заново.



Удачи в разработке! =)

Сообщение отредактировал Andy_0x76: 25 August 2014 - 14:36


#2 bulbax

bulbax

    Активный участник

  • Разработчик
  • 312 сообщений
    • 11
  • Город:Москва
  • Мой телефон:iPhone 6

Отправлено 25 August 2014 - 13:48

отличная статья для начинающих разработчиков 3D-игр. Плюсую репутацию автору. Есть нюанс  - после прочтения складывается впечатление, что batch - это переключение состояний GPU, хотя в действительности это "пакет данных" между переключениями, что следует даже из названия. Более корректно рекомендация будет такой: "необходимо минимизировать число переключений состояний GPU (state changes) и максимизировать длину пакетов (batches)"
Изображение Изображение Изображение Изображение Изображение Изображение Изображение Изображение

#3 Andy_0x76

Andy_0x76

    Активный участник

  • Разработчик
  • 373 сообщений
    • 17
  • Город:Ростов-на-Дону
  • Мой телефон:iPhone 4S

Отправлено 25 August 2014 - 14:37

Просмотр сообщенияbulbax (25 August 2014 - 13:48) писал:

"необходимо минимизировать число переключений состояний GPU (state changes) и максимизировать длину пакетов (batches)"

Спасибо за поправку. Внес коррективы в текст.

#4 beton

beton

    Активный участник

  • Адепт
  • 370 сообщений
    • 11
  • Мой телефон:iPhone 4

Отправлено 08 September 2014 - 13:28

Да хорошо расписал. Я бы ещё посоветовал осветить тему запекания освещения в текстуру.

#5 Andy_0x76

Andy_0x76

    Активный участник

  • Разработчик
  • 373 сообщений
    • 17
  • Город:Ростов-на-Дону
  • Мой телефон:iPhone 4S

Отправлено 08 September 2014 - 13:49

Просмотр сообщенияbeton (08 September 2014 - 13:28) писал:

Да хорошо расписал. Я бы ещё посоветовал осветить тему запекания освещения в текстуру.

Да, лайтмапы полезная вещь. Напишу, немного попозже.

#6 Axel

Axel

    Активный участник

  • Разработчик
  • 642 сообщений
    • 36
  • Мой телефон:другая модель

Отправлено 09 September 2014 - 14:18

прямо капитан очевидность :) но новичкам конечно будет радость, держи плюс :)
еще стоит уделить внимание анимации и текстурам с прозрачкой, а так же аутентичному индусскому коду, что отжирает немерянно ресурсов.

#7 Andy_0x76

Andy_0x76

    Активный участник

  • Разработчик
  • 373 сообщений
    • 17
  • Город:Ростов-на-Дону
  • Мой телефон:iPhone 4S

Отправлено 09 September 2014 - 14:32

Просмотр сообщенияAxel (09 September 2014 - 14:18) писал:

еще стоит уделить внимание анимации

Tnx
Анимация сильно к используемому engine привязана. Говорить особо не о чем, кроме теории кватернионов и их интерполяции =)

#8 Axel

Axel

    Активный участник

  • Разработчик
  • 642 сообщений
    • 36
  • Мой телефон:другая модель

Отправлено 09 September 2014 - 14:55

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

мы в вас верим, пишите :)

#9 Andy_0x76

Andy_0x76

    Активный участник

  • Разработчик
  • 373 сообщений
    • 17
  • Город:Ростов-на-Дону
  • Мой телефон:iPhone 4S

Отправлено 09 September 2014 - 14:59

Просмотр сообщенияAxel (09 September 2014 - 14:55) писал:

анимация - любые анимированые объекты, и говорить как раз есть о чем.
мы в вас верим, пишите :)

Угу, заодно еще про ambient occlusion, octree, колидеры, оклюдеры, разные паралакс мапинги и т.д., dynamic lightы и т.д. и т.п. =))

Чего в меня верить , вот смотри вживую над чем приходилось работать:
https://www.youtube....eYWNF2McBU#t=87
https://www.youtube....h?v=rnhuDFo-wMk

Сообщение отредактировал Andy_0x76: 09 September 2014 - 15:05


#10 Axel

Axel

    Активный участник

  • Разработчик
  • 642 сообщений
    • 36
  • Мой телефон:другая модель

Отправлено 09 September 2014 - 15:04

да да, про это все пишите :)
я серьезно, интересная и полезная тема.

#11 Andy_0x76

Andy_0x76

    Активный участник

  • Разработчик
  • 373 сообщений
    • 17
  • Город:Ростов-на-Дону
  • Мой телефон:iPhone 4S

Отправлено 09 September 2014 - 15:08

Просмотр сообщенияAxel (09 September 2014 - 15:04) писал:

да да, про это все пишите :).

Обязательно напишу! Как будет вдохновение =))




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей


Rambler's Top100