Думаю, не нужно объяснять, что делает эта команда - она есть в 90% всех модов.
Для тех, кто думает, что обычный цикл for на 100 итераций никак не оптимизировать: вынужден вас огорчить...
В обычном виде на каждой итерации цикла функции SendClientMessageToAll передаются одни и те же параметры, поэтому с помощью #emit передача параметров вынесена за пределы цикла - в теле цикла оставлен только сам вызов функции.
И да, я смею называть это максимальной оптимизацией. Возможно, даже слишком.
PHP код:
CMD:cc(playerid, params[]) // by Daniel_Cortez \\ pro-pawn.ru
{
// проверка на админа (при необходимости замените на свою)
if(PlayerInfo[playerid][pAdmin] != 0)
{
// объявить строковую константу и счётчик цикла
static const str[] = "";
new i = 100;
// трюк, предотвращающий краш компилятора (баг sysreq.c)
// (баг исправлен в патчах от Zeex, в компиляторах версий 0x030A и новее
// обход бага не нужен, для чего и используется директива #if)
#if __Pawn < 0x030A
{ if(0 == i) SendClientMessageToAll(0, str); }
#endif
// передать параметры для SendClientMessageToAll
#emit push.c str
#emit push.c 0xFFFFFFFF
#emit push.c 8
// вызвать функцию 100 раз
do{
#emit sysreq.c SendClientMessageToAll
}while(--i);
// освободить стековое пространство, зарезервированное под параметры
#emit stack 12
}
return 1;
}
P.S.: Данная команда представляет собой всего лишь пример оптимизации с помощью #emit (в частности, пропуска передачи через стек одних и тех же аргументов функции при её многократном вызове). Этот приём, как и любой другой, связанный с #emit, имеет смысл только для оптимизации самых узких мест, влияющих на производительность сервера.
Автор: Daniel_Cortez
Копирование данной статьи на других ресурсах без разрешения автора запрещено!