Генерируем функции инициализации

» Раздел: Примеры использования
Одна из проблем при работе с большими картами - первичное заполнение базы данных занимает достаточно много времени и может не уложиться в лимит операций на один поток jass кода. Для решения этой проблемы обычно разбивают заполнение базы данных на несколько функций и вызывают каждую из них в новом потоке. Именно это помогает сделать данный пример.
Коллекция перебирается директивой <list> и каждые n итераций создается новая функция. Коллекция для перебора, имя генерируемой функции и количество итераций на одну функцию регулируются шаблонными переменными collection, function_name и items_per_function, соответственно. Имена генерируемых функций формируются добавлением числового индекса к базовому имени.
<compress>

<assign collection = units>
<assign items_per_function = 10>
<assign function_name = "SomeFunction">

<assign counter = 0>
<list collection as i>
    <if (i_index)%items_per_function == 0>
        <if i_has_next || i_index==0>
            function ${function_name}${counter} takes nothing returns nothing;
            <assign counter = counter+1>
        </if>

        /*сюда помещаем работу с элементами коллекции, каждую строку jass кода заканчиваем ; */

        <if !i_has_next >
            endfunction;
        </if>
    </if>
</list>
</compress>
Примечание: В данном примере используется директива <compress>, устраняющая все переносы строк и скопления пробелов. Для того чтобы не нарушать валидность jass-кода используется cJass, а именно, возможность делать переносы строк с помощью ;. Если нет возможности использовать cJass или любой другой препроцессор, поддерживающий дополнительный способ переноса строк, то нужно убрать директиву <compress> и все ; из шаблона.
Примечание: Этот шаблон рассчитан на полное использование коллекции, без пропуска большого количества элементов. Если обработка элементов подразумевает пропуск некоторых из них на этапе препроцессинга, то сгенерированный код будет неравномерно распределен по функциям, вплоть до того что некоторые функции могут оказаться пустыми. Чтобы избежать такой ситуации можно предварительно отобрать все подлежащие обработке элементы или использовать шаблон, генерирующий новые функции на основе количества использованных элементов, а не на основе счетчика итераций.


Views: 1 903

Shown only a small set of comments around the pointed one. Go to actual.

ScorpioT1000 #1 - 9 years ago 0
Голосов: +0 / -0
В данном примере используется директива <compress>, устраняющая все переносы строк и скопления пробелов.
Это не надо - это сделает vJass/cJass оптимизатор.
И выложи что в результате получится ) я немного не понимаю
prog #2 - 9 years ago 0
Голосов: +0 / -0
А вот фиг там, не делает он этого, у меня по крайней мере, но это не критично, так что я даже не включил эту директиву в спецификацию - с ней слишком много проблем. Проблема с переносами строк в том, что их генерируется слишком много практически для любого шаблона - библиотека изначально на html рассчитана.
В результате работы этого шаблона будет сгенерировано много функций, отличающихся друг от друга только индексом в имени.
Например, если в качестве тела для этого шаблона вместо комментария поставить ${i}; и ничего больше не менять, то получится несколько функций, в каждой из которых в столбик записаны равкоды не больше чем десяти юнитов (конечно это не валидный jass-код, но зато просто для понимания). На практике, естественно, тело шаблона будет более сложным.

Shown only a small set of comments around the pointed one. Go to actual.