пятница, 5 марта 2010 г.

Препарирование StarCraft II.

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


Пост о том, как я препарировал SC2 тулзой, которая идёт в поставке DirectX SDK - PIX. Этот вот PIX умело рассказывает нам о количестве и качестве разных вызовов DirectX. Вот поэтому я взял PIX, взял StarCraft 2 и какой-то реплей с игрой четверых счастливых обладателей ключа от беты. Для первой части - немного тупой статистики.
Сцена с окружением, без юнитов и зданий, просто природа, стены, ландшафт, деревья.
Число вызовов DrawIndexedPrimitive - ~900-1000.
Сцена с отстроенной теранской базой и некоторой кучкой юнитов ~1800-2000 вызовов, здоровый бой протоссы vs тераны ~2500 вызовов. Все абсолютно вызовы - TriangleList'ы, никаких Triangle Strips нет и в помине. Абсолютно на каждый вызов DIP идёт установка VertexDeclaration. Причём почти всегда одного и того же. Число треугольников в каждом вызове как правило мало. Много вызовов с небольшим числом треугольников (100-200), меньше средних (500-700), больших - мало (1500-2000 треугольников).  На фрейм происходит очень много установок Render Targets - ~200 вызовов. Так же на фрейм приходится ~400 SetPixelShader и ~300 SetVertexShader.


Отдельного внимания заслуживает непонятки с отсечением невидимых объектов. Вышедшие из-за экрана и ушедшие через пару секунд в другую сторону ~25 протосовских юнитов не изменили число вызовов DIP, то есть, когда они были где-то за экраном, они всё равно отправлялись на отрисовку.


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


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

UPD: На дальнейшее препарирование меня не хватило, извиняйте, если кто хотел. (=