XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
[Заметка] Как уменьшить время загрузки карты?
Весь следующий текст - это не статья, а просто заметка, для тех, кто этого еще не знал.

***

Изучая внутренности инициализации карты, я понял, что варкрафт3 делает много лишних вещей.
Он делает предзагрузку (объявление) функций, которые СКОРЕЕ ВСЕГО не будут использоваться
в вашей карте. Например: функция InitBlizzard() и все ее внутренности (думаю их установка
занимает 40% времени загрузки карты). Для людей, которые считают каждый лишний
использованный байт или просто для тех, кто хочет значительно снизить длительность загрузки
своей карты, я советую открыть war3map.j своей карты и просмотреть функции, которые
вызываются в main() и config(). Ведь по сути, если человек программирует без использования
BJ (а такие, думаю - почти все, кто свободно делает карты на Jass), то ему эта функция,
да и все ее содержимое не нужно.

***

Вот простенький пример: раньше, когда мне нужно было найти minx,maxx,miny,maxy своей карты
для безопасного передвижения дамми или просто юнитов, то я использовал следующий код
для объявления:
»
Код:
set minx=GetRectMinX(bj_mapInitialPlayableArea)
set maxx=GetRectMaxX(bj_mapInitialPlayableArea)
set miny=GetRectMinY(bj_mapInitialPlayableArea) //я правильно написал название,да?
set maxy=GetRectMaxY(bj_mapInitialPlayableArea) //ибо с блокнота,не помню точно.
Но потом, когда понял что убрав все ненужное, кроме самого необходимого из функции main(),
моя карта загружается за полторы секунды, я вывел самую быстрый способ найти эти координаты
(вывел из BJ).
»
Код:
set minx=GetCameraBoundMinX()-512.
set maxx=GetCameraBoundMaxX()+512.
set miny=GetCameraBoundMinY()-256.
set maxy=GetCameraBoundMaxY()+256.

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

***

...и еще напоследок, я скажу пару слов об одной функции...
»
Код:
call DoNotSaveReplay()
Если вызвать эту функцию при инициализации, карта не будет записывать реплей, а это значительно снижает время загрузки. Может быть полезно, если вы тестируете какую-нибудь способность или просто алгоритм на карте, где сохранение реплея не понадобиться.

***

Надеюсь это простой рассказ кому-то помог и кто-нибудь узнал что-то новое. Успехов. :)

Отредактировано bee, 18.09.2012 в 08:12.
Старый 06.09.2012, 14:45
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Всего создается около 200 лишних глобальных объектов. Что не есть тру.
Так же еще что бы быстрее проект загружался, лучше использовать вместо разрушаемых - декорации:) впрочем я думаю это и так все знали.
Старый 06.09.2012, 14:50
ScorpioT1000
Работаем
offline
Опыт: отключен
Она не просто снижает время загрузки, а снижает потребление жесткого диска для захвата виртуальных пакетов во время игры, которые потом служат реплеем.
ScorpioT1000 добавил:
Может собрать все-все факты об оптимизации перфоманса карты, потестировать их на производительность в промышленном масштабе и написать норм статью с каждым пунктом ?
Старый 06.09.2012, 14:53
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Могу заняться. Хотя я даже не знаю с чего начать.
Старый 06.09.2012, 14:55
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ScorpioT1000, поддерживаю, очень актуальная тема.
Старый 06.09.2012, 14:57
ScorpioT1000
Работаем
offline
Опыт: отключен
bee, полазь тогда форум и сайтостатьи на тему оптимизации и вываливай сюда в кучу, будем разбирать, фиксить (фиксить там много надо), а тестить - недолго) и кстати можно много нового открыть
Старый 06.09.2012, 15:01
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
а ты имеешь в виду все? то есть там всякие оптимизации звуков, иконок, музыки, всяких integer'ов? можно заняться. будет интересно

bee добавил:
http://xgm.guru/p/wc3/import-optimization - я в этом не шарю, к сожалению
http://xgm.guru/p/wc3/triggers-and-jass-optimization - это кстати хоть и полезно, но баян, надо переписать с новыми советами/фичами

я даже и не знаю что можно добавить, разве что mpq?
нужно рассказать что карту можно редактировать без we.

http://xgm.guru/p/wc3/inside_w3m_files
Старый 06.09.2012, 15:13
adic3x

offline
Опыт: 107,539
Активность:
Намного больше ускоряет загрузку перенос объектов из *.w3* в таблицы, делает программой Widgetizer в пару кликов.
Старый 06.09.2012, 15:15
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
просто дело в том, что не все об этом знают, есть маза расписать в одной статье, как по-максимуму можно оптимизировать всю карту.
Старый 06.09.2012, 15:16
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ADOLF, напиши полноценную статью на тему правильных подходов к созданию алгоритмов на жасс, ну по типу этого и этого Будет в тему :)
Старый 06.09.2012, 15:23
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
bee, мб не отсановишся только на оптимизации jass кода а затронут тему в целом, с моделями, объектами и тд, тогда статья действительно будет полезной.
Старый 06.09.2012, 15:30
YellowStar
poon
offline
Опыт: 15,144
Активность:
внесу свою лепту... юзайте vJass функции

//! inject config
//! endinject

//! inject main
//! endinject

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

я делаю примерно так.

onUnitSold
GetSoldUnit() -> Init_SoldUnitTypeFunc
в общем то так.

По возможности подгружаю данные также паралельно размещая их на карте магазины, нейтралы и их данные.
юзаю RecycleTimer/Group/Unit функции, без их прелоада как такового (создаю лишь по одному объекту во время загрузки карты)

позволило сократить время загрузки карты с 25 секунд до 1.5 секунды, лагов не имеется.
Старый 06.09.2012, 15:52
ScorpioT1000
Работаем
offline
Опыт: отключен
Старый 06.09.2012, 15:54
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
YellowStar, я и винайзером до 3 сек загрузку сделал, и только юнитов создавал в игре, а всё остальное было как есть... но в сильно нагруженных картах походу не прокатит...
Старый 06.09.2012, 15:55
ScorpioT1000
Работаем
offline
Опыт: отключен
что касается прелоада триггеров... ну, допустим, спеллы мы будем грузить динамично: представь, на тебя напал враг, он начинает применять способность, ты начинаешь убегать и ВНЕЗАПНО ЛАГ, после которого ты видишь "вы умерли! сплясать на могиле?"
Старый 06.09.2012, 15:56
YellowStar
poon
offline
Опыт: 15,144
Активность:
Цитата:
Сообщение от quq_CCCP
но в сильно нагруженных картах походу не прокатит...

У меня 16 героев все спеллы у них полностью написаны тригерно. Widgetizer - сокращает время загрузки на много, Vexorian Optimizer еще больше, но все это грузится в течении 6 секунд на моём ноуте, что в принципе долго, для маленькой карты тестера, поэтому после еще махинаций, на старом ноуте 1.5 секунды, это стоящий результат в 4 раза.

Ну в итоге на мощных машинах, как я понял загрузку не видно почти совсем (ну тут в целом из-за отсутствия ландшафта как такового, если будет ландшафт на мощных машинах даю 1.5 сек загрузки, на слабых до 4-6)

YellowStar добавил:
Цитата:
Сообщение от ScorpioT1000
что касается прелоада триггеров... ну, допустим, спеллы мы будем грузить динамично: представь, на тебя напал враг, он начинает применять способность, ты начинаешь убегать и ВНЕЗАПНО ЛАГ, после которого ты видишь "вы умерли! сплясать на могиле?"

не совсем так, они подгружаются как только ты приобрёл героя
Старый 06.09.2012, 15:59
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
YellowStar:
не совсем так, они подгружаются как только ты приобрёл героя
Ненавижу инвокера (из доты) как кто пикнет, залаг, секунд на 5...
Ну конешно у кого длинный вступительный ролик в карте это +, так как пока все смотрят ролик, или чёрный экран, то происходит подгрузка всего необходимого....
Старый 06.09.2012, 16:02
ScorpioT1000
Работаем
offline
Опыт: отключен
Я бы предложил подождать пока все пикнут и потом создать для всех =)
Старый 06.09.2012, 16:08
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
такая предзагрузка делается не только для инвока, просто у него спелов оч много
у некоторых она просто не заметна или ее нет, ибо нет прелода
Старый 06.09.2012, 16:13
YellowStar
poon
offline
Опыт: 15,144
Активность:
Подгрузку инвока можно распределить, подгружая спеллы ему паралельно, то есть в течении 10 секунд. Все равно их не натыкать...
Старый 06.09.2012, 16:18
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 02:05.