Наилучшие пожелания всем.
Возник вопрос о команде !!UN:O (удаление объекта).
Как узнать, перерисовывает ли она экран, и можно ли как-то запретить перерисовку?
У меня есть основания предполагать, что перерисовывает (или пытается), и это сильно замедляет работу скриптов, в частности скрипта вогификации.
Для демонстрации того, что я имею в виду, я написал пару небольших тестовых скриптов.
Кроме всего прочего, они умеют фиксировать время выполнения.
Чтобы результаты были более показательными, я буду использовать самый тяжелый режим HD-мода (32-bit True (stretchable) GDI, стретч фильтр xBRZ+bicubic).
Карта XL с подземельем (144x144x2).
Все остальные скрипты, включая стандартные воговские, надо отключить (временно переместить куда-нибудь).
Скрипт #1. Заменим все ресурсы на карте на мифрил (для примера). Примерно так же работает стандартный воговский скрипт замены объектов.
Обратим внимание на последний параметр в команде !!UN:Iv952/v953/v954/79/7/79/7/-1/0;
Он означает перерисовку экрана (1-обновлять экран, 0-нет).
Попробуем заменить на 1: !!UN:Iv952/v953/v954/79/7/79/7/-1/1;
Результат:
Почти в 2 раза дольше.
Половина времени тратится только на перерисовку экрана при выполнении команды UN:I.
Начинаем задумываться - на что тратится вторая половина?
Попробуем отдельно оценить быстродействие команд !!UN:O и !!UN:I.
Для этого я изменил скрипт и разнес их по разным циклам.
!!UN:U для цикла по объектам одного типа использовать не получится (поскольку объекты уже будут удалены), придумаем другой способ.
Скрипт #2:
Неожиданно. Оказывается, почти все время тратится на удаление объектов, а новые на их место ставятся практически мгновенно, несмотря на то, что используется очень длинный цикл по всем 41472 клеткам карты (144x144x2).
Попробуем опять включить перерисовку: !!UN:Ix1/x2/x3/79/7/79/7/-1/1;
Результат:
Обе команды работают одинаково быстро (вернее, одинаково медленно).
Показательно также то, что оба скрипта #1 и #2, несмотря на очень разную реализацию, отрабатывают примерно за одинаковое время.
Отсюда и возникло предположение о перерисовке экрана командой UN:O, оно полностью объясняет такое поведение.
Теперь как бы заставить обе команды работать без перерисовки?
Единственное, что мне пришло в голову - сделать замену не в таймере, а в триггере !?PI, пока глобальная карта еще не выводится на экран.
Возникла трудность: в !?PI объекты нормально ставятся на карту командой !!UN:I, но при попытке удалить объект командой !!UN:O игра вылетает.
Но мне все равно удалось получить результат, чисто случайно.
Для этого нужно соблюдать точную последовательность действий:
Сворачиваем игру (но не закрываем), редактируем наш скрипт #2 и сохраняем под тем же именем (просто меняем !?TM19 на !?PI).
Если сохранить под новым именем, игра вылетит. Если перезапустить игру, игра вылетит - я не знаю, почему в одних случаях вылетает, в других нет.
Переходим в окно игры, жмем F12, чтобы перезагрузить скрипты. Начинаем игру заново или выходим в главное меню и начинаем новую игру - в обоих случаях должно сработать. Но может и вылететь, гарантировать не могу.
Результат:
Меня лично разница впечатляет.
Если мое предположение верное, то для ускорения вогификации карты в разы всего-то нужно, чтобы команда !!UN:O не обновляла картинку. Может можно еще один параметр к ней прицепить. У меня нет нужных знаний для этого, может кто-нибудь более знающий и опытный заинтересуется.
Для меня самого эти результаты были неожиданными. Я привык считать ERM тормознутым и медленным, оказывается, это не так - ERM может работать быстро. Если ничего не мешает.
HD-мод тоже вносит свои коррективы - время выполнения скрипта сильно зависит от выбора графических режимов.
Не удивлюсь, если и с ходом компьютера похожая ситуация. Какие-то команды обновляют экран, HD-мод перехватывает и применяет свои фильтры, в итоге получается долго. Может быть, есть шанс сделать ход AI быстрым, если отловить все такие команды.
Если я тут глупостей понаписывал, сильно не бейте. Буду рад узнать, в чем моя ошибка.
(This post was last modified: 06.09.2019 21:07 by Guru105.)