Добро пожаловать Гость, Вы в разделе: Вход

Энциклопедия по редактору Arma, Arma 2, Arma 3 и Operation Flashpoint

VKRSSRSS
На главную

Навигация


Искать в энциклопедии:
»


Важная информация




Сайт управляется

Учебник по написанию скриптов
Изображение



Учебник по созданию роликов


Изображение



Наши партнеры



ArmA 3, ArmA 2 news Russian community, SARMAT community

Как это работает?

Нет необходимости беспокоиться о том, чтобы код оптимизации работал со скоростью света, даже в том случае если он не делает то, что обязан. Сосредоточьтесь в первую очередь на рабочем объекте.


Как сделать это быстро?

Оптимизация это все то, что запускается в большинстве случаев с небольшими задержками. Тем не менее, есть такая вещь, как преждевременная оптимизация. Тем не менее избегайте чрезмерного мастерства.


"Чрезмерное мастерство" - это действительно сделанное что-то искусным способом, хотя на самом деле, вы могли бы сделать тоже самое проще, но менее оптимальным образом. Вы, наверное, видели примеры людей, которые строят удивительные цепи макросов (в С) или причудливые модели перегрузки (в C + +), которые работают вполне хорошо, но когда вы смотрите на переход "Какого черта"? "Чрезмерное мастерство" является вариацией преждевременной оптимизации. Это так же что-то вроде высокомерия - программисты вместо того, чтобы просто выполнит ьсвою раюоту, лишь показывают насколько они умны.


Писать дважды? Поместите в функцию

Предварительная компиляция движком игры может сэкономить в 20 раз времени, отведенное на обработку, даже если в первые секунды игра немного тормозит. Если вы написали что-то дважды, или существует тип цикла, который составляется последовательно (возможно, скрипт вызывается execVM), превратить код в функцию (FUNCVAR = preprocessFileLineNumbers "filename.sqf").


Preprocessfilelinenumbers



Команда preprocessFileLineNumbers запоминает то, что было выполнено, следовательно файл будет загружаться в память, именно поэтому если вы хотите отказаться от использования глобальных переменных, к примеру, но в тоже время хотите использовать предварительно скомпилированную функцию, просто наберите:


call compile preprocessfilelinenumbers "file"

Единственное, помните что потеря производительности займет время компиляции возвращаемой строки, и только затем вызовет сам код.


Длина

Если какой-нибудь скрипт или функция состоит больше чем из 200-300 строк, то возможно ( не всегда) вам следует переделать структуру скрипта, поскольку данный аспект так же входит в сферу функциональных возможностей, т.е могли бы вы это сделать лучше, быстрее, яснее.


Условия

Движок игры Arma не проводит "ленивые" вычисления (при использовании функциональных языков программировани). К примеру:


if ( (group knowsAbout vehicle object > 0) && (alive object) && (canMove object) && (count (magazines object) > 0) ) then
{
   ...
};

Вы возможно полагаете, что игра прекратит чтения условия, после того, как группа не получит информации об объекте, но вы ошибаетесь.

if (group knowsAbout vehicle object > 0) then
{
   if ( (alive object) && (canMove object) && (count (magazines object) > 0) ) then
   {
      ...
   };
};

Теперь, игровой движок лишь продолжит чтение условия после того, как группа получила какую-то информацию об объекте.



Сделайте это красиво

Документирование, читабельность, и все такое прочее. В общем следуйте принципу ясный код - хороший код.


Структура If Else

Если вы не можете избежать повторения структуры if else, используйте контрольную конструкцию switch, затем попытайтесь переработать функционал. Особенно, если нужно подобрать только одну опцию.


Постоянные величины

Часто приьегаете к использованию жёстко закодированной константы (hard-coded)? Используйте директивы препроцессора, а не храните код в памяти или загромождая его числами. Например:


 a = _x + 1.053;
 b = _y + 1.053;

и:

 _buff er = 1 .053;< Br> a = _x + _buffer;
 b = _y + _buffer;

Начинайте:

 #define BUFFER 1.053

 _a = _x + BUFFER;
 _b = _y + BUFFER;

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


Циклы

Эти два первых цикла одинаковы по скорости (+/- 10%), и более чем в 3 раза быстрее процедуры циклов второго типа.

for "_y" from # to # step # do { ... }; 
{ ... } foreach [ ... ];

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


while { expression } do { code }; 
for [{ ... },{ ... },{ ... }] do { ... } 

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


waituntil {expression}; 

Согласно правилам, данная информация приобретяется при помощи CBA_fnc_benchmarkFunction,через приблизительно 10000 повторений. Результат не тестировался на различных стадиях, и *может* изменяться между ними:


 fA = {
 private "_i";
 _i = 0;
 while {_i < 1000} do {
 _i = _i + 1;
 private "_t";
 _t = "0";
 };
 };

 fB = {
 for "_i" from 0 to 1000 do {
 private "_t";
 _t = "0";
 };
 };

Этот код выполняет 10,0000 тестов и выводит среднее время принятое функцией, измеренное при помощи diag_ticktime:


 [fA,[],10000] call CBA_fnc_benchmarkFunction;
 [fB,[],10000] call CBA_fnc_benchmarkFunction;

Циклы ограниченны 10,000 повторами

Подобное не существует в плановой среде, только в не плановой (только где нет задержки 0.3ms).

Треды

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

В зависимости от того, где проходят рамки, определяется, как будет выполняться код. Запланированные код характеризуется задержками между чтениями скриптов, которые выполняются через игровой движок, и время выполнения может зависеть от нагрузки на систему.


Некоторые основные примеры:


  • Триггеры находящиеся внутри игры называются "не соответствующие" среде
  • Все предварительные -init коды выполняются без предварительной планировки;
  • FSM без предварительной планировки;
  • Обработчик событий (для юнитов и графического интерфейса пользователя) без предварительной планировки;
  • Sqf код который запускается через sqs-код без предварительной планировки.

Задержка 0.3ms (не 3ms)



0.3ms задержка - это задержка, которая была введена с выходом ArmA2 для запланированных сред с целью предотвращения перегрузки скрипта во время игры.0.3ms обычно встречается между утверждениями и по окончанию утверждений,и она будет продолжаться до тех пор пока не вернется к началу, чтобы пройти через цикл снова. Как я всегда, кажется, был в состоянии объяснить многие вещи в коде, поведение, насколько я могу это объяснить заключается в следующем:


 while (true) {
 {
 execute1Statement(_x);
 sleep 0.3ms;
 } foreach SCRIPTS;
 }

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


Когда я создаю новые треды?

Использование spawn / execVM / EXEC команд позволяет создать небольшие треды внутри планировщика для ArmA2, и, так как планировщик работает по каждому из них в отдельности, задержка может быть очень высокой между возвращением к началу планировщика и перехода к следующей строке кода в случаях большой нагрузки, задержки случаются даже вплоть до одной минуты!).
Очевидно, что эта проблема является единственным случаем, когда ваши запросы ( =вызовы) длятся дольше, чем время их выполнения, то есть spawn циклы с sleeps, никогда не кончатся, или кончатся спустя длительное время.


Устаревшие/Медлительные команды

Добавление элементов к массиву

set будет работать в 2 раза быстрее, чем бинарное сложение


 _a set [count _a,_v]

Вместо:


 _a = _a + [_v]


Удаление элементов из массива

Когда FIFO удаляет элемент из массива, set -работает наилучшим способом, даже если он делает копию нового массива.


 ARRAYX set [0, objnull];
 ARRAYX = ARRAYX - [objnull];

Массив CreateVehicle

Настоятельно рекомендуется использовать стандартный массив CreateVehicle, а не (устаревший вариант) CreateVehicle. Это до 500x быстрее, чем в предшествующей версии.


Измерение скалярной скорости (Velocity Scalar)

Конечно, мы можем просто использовать теорему Пифагора для вычисления величины от вектора скорости, но команда игрового движка работает гораздо быстрее (более чем в 10 раз быстрее), чем математика.


 VECTOR distance [0,0,0] 

С таким же успехом работает для 2D векторов.


Получение координат объекта

getPosASL/getPosATL быстрее на 2.11x чем в обычной getPos


AGL решение (идентично getPos):


 private "_pos"

_pos = getposATL player;
 if(surfaceIsWater _pos) then {
 _pos = getposASL player;
 };

Быстрее на 25% , чем в подобной команде getPos.

Избегайте O(n^2)!!

Обычно вы можете настроить командой foreach команду foreach. К примеру:

 {
 { ...} foreach [0,0,0]; 
 } foreach [0,0,0];

Примерный порядок (n^2) (3^2 = 9 повторов). Массивы которые в 2 раза в больше, будут запускаться в 4 раза медленнее, а массивы, которые в 3 раза больше вы будут запускаться в 9 раз медленее!! Конечно,не всегда есть возможность выбирать, если один из массивов (или оба) будут точно небольшими, но на деле, все может быть иначе.


Как проверить и получить данную информацию самостоятельно?

Существует несколько способов как измерить информацию и временной интервал внутри Arma 2 - главным образом дифференцированием самого времени.

CBA пакет включает в себя такие функции для пользователя , которые помогут проверить себя , однако, если вы оставили аддон в открытом доступе или не можете воспользоваться им, следующий код установки является таким же эффективным; и содержит различные способы по возвращению информации (текстовый чат, RPT файл, буфер обмена).



 _fnc_dump = {
 player globalchat str _this;
 diag_log str _this;
 //copytoclipboard str _this;
 };

 _t1 = diag_tickTime;
 // ... код для проверки
 (diag_tickTime - _t1) call _fnc_dump;
Две колонки
О нас
SunHorizon Wiki версия 1.0.2.17.
© 2013-2014 SUNHORIZON.INFO.Все права сохранены.
В проекте использованы изображения FamFamFam
Связь с нами
Изображение
Правила сайта
Изображение

Авторские права
Изображение