Миникарта + насколько большое значение имеет DrawCalls?

Раздел, посвящённый самому важному - скорости.

Миникарта + насколько большое значение имеет DrawCalls?

Сообщение VBProgr 26 окт 2011, 21:56

Всем привет!
Делаю миникарту в космосе по типу точки - корабли, линии от них - расстояние по высоте от корабля игрока.
Вопрос в том, как сделать это наиболее оптимально.

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

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

А вот линии, которые показывают расстояние по высоте относительно игрока можно генерировать
а) через GUI - затратно по DrawCall-ам - каждая линия +1
б) создавая меши-"линии" в пространстве - проще в реализации, затраты по DrawCall-ам вроде теже, но по фпс этот вариант должен проигрывать.
в) мб через партиклы? ведь одна система партиклов будет съедать 1 дравкол на все выпущенные частицы! Но как управлять длиной (растянотостью) каждого отдельного партикла? А если это и возможно, то как избавится от мерцания, когда снят флажок Simulate In World Space и Particle Emitter перемещается из кода в нужные позиции где вызываем Emit() ?

Есть и другой вариант миникарты: полностью сделать через GUI. Но это здорово увеличит DrawCalls Чтобы такого не было я пробовал создавать текстуру, ставить на ней точки (корабли) и выводить на экран одним Draw. Все вроде бы замечательно, но это не работает - появляются какие-то полосы и т.п.! До тех пор, пока я не стал заливать созданную текстуру прозрачными пикселями, а потом уже ставить на ней другие точки.

Здесь вызывает недоумение отсутствие таких функций, как копирование куска одной текстуры в другую того же формата и рисование на текстуре, к примеру, линий - одной функцией. Приходится каждый раз заново заполнять новую текстуру прозрачными пикселями. Это занимает кучу времени и фпс падает просто ужасно! Зато только 1 DrawCall)

Пробовал рисовать это на текстуру Plane, а оттуда на камеру, но это ничем не отличается от предыдущего варианта. Разве что немного меньше нагрузка - ведь это не нужно делать все в OnGUI, что меньше замедляет рендеринг одного кадра.

Попробовал использовать GL, пока просто создавал 500 квадратов в OnPostRender. DrawCall-ов 500, но фпс падает не сильно! Возникает вопрос, стоит ли бороться за количество дравколлов или лучше заниматься их "качеством"? Ведь судя по всему их может быть и 2000 при нормальном фпс около 60-и.

Кстати, радар из Islands я видел, там примерно та же схема, что в самом первом варианте, но с небольшими отличиями. Да, я видел, что там камера радара не висит над игроком, а перемещается над Plane-ом с текстурой ландшафта, но это все-равно напоминает мне первый вариант из тех, что я написал.

Посоветуйте мне как лучше делать такого рода миникарту...
Заранее спасибо!

Добавлено:
Может я что-то пропустил и текстуры можно копировать через Instantiate?
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Миникарта + насколько большое значение имеет DrawCalls?

Сообщение gnoblin 26 окт 2011, 22:25

текстуры (ассеты) можно копировать через Instantiate

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

предлагаю глянуть как сделана миникарта в буткемпе

для линий один из грамотных вариантов - взять vectrosity (или ragespline)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Миникарта + насколько большое значение имеет DrawCalls?

Сообщение VBProgr 27 окт 2011, 23:59

Спасибо, я и имел в виду, что видел как сделано в Bootcamp. Сделал все на GUI, проверил - при более чем 100 объектов на миникарте фпс падает с 300-370 до 250-280 при дравколлах около 250. Так что остановлюсь на этом варианте, если не посоветуете что-нибудь лучше.

Да, с копированием, это я уже разобрался, хотелось бы иметь возможность рисовать одну текстуру на другой в указанном месте и с нужным размером, ну как в Win API есть BitBlt вроде называется. Только ведь к текстурам кроме тех функций что есть у объектов Texture и Texture2D больше никак нельзя получить доступ?

А насчет рисования на текстурах можно поподробнее? Или вы имеете в виду использование GL? Дак я за пределы копирования примеров из мануала выходить не собираюсь) Хотя даже там уже нашел ошибку, из за которой у меня не хотели рисоваться квадраты... (пропущено end-begin)
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11


Вернуться в Оптимизация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3