Pawn. Создание команд разными способами

На данный момент существует множество способов создания команд в SA-MP’е. Самые известные из них: простое добавление команд в OnPlayerCommandText, zcmd и dcmd.

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

Каждая созданная команда создаёт паблик функцию.

#define COMMAND:%1(%2)          \
			forward cmd_%1(%2); \
			public cmd_%1(%2)

Всё, что написано в вашем OnPlayerCommandText игнорируется.

#define OnPlayerCommandText zcmd_OnPlayerCommandText
forward zcmd_OnPlayerCommandText(playerid, cmdtext[]);

В самом инклуде создаётся OnPlayerCommandText в котором написан обработчик команд.

if (zcmd_g_HasOPCS && !CallLocalFunction("OnPlayerCommandReceived", "is", playerid, cmdtext))
{
	return 1;
}
new pos, funcname[MAX_FUNC_NAME];
while (cmdtext[++pos] > ' ') 
{
	funcname[pos-1] = tolower(cmdtext[pos]); 
}
format(funcname, sizeof(funcname), "cmd_%s", funcname);
while (cmdtext[pos] == ' ') pos++;
if (!cmdtext[pos])
{
	if (zcmd_g_HasOPCE)
	{
		return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, "\1"));
	}
	return CallLocalFunction(funcname, "is", playerid, "\1");	
}
if (zcmd_g_HasOPCE)
{
	return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, cmdtext[pos]));
}
return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);

Очень много лишнего, что несомненно сказывается на скорости работы при небольшом количестве команд.

Тест скорости(с одной командой)

Исходник теста на Pastebin.com
В тесте участвовали обычные проверки(old), zcmd, dcmd и ncmd(new).

zcmd: 739
old: 399
new: 415
dcmd: 507
 
zcmd: 788
old: 413
new: 392
dcmd: 432
 
zcmd: 777
old: 422
new: 379
dcmd: 457

Вывод

Если в вашем моде большое количество команд, то команды следует перевести на систему zcmd. При небольшом количестве команд(< 10) следует использовать старый добрый метод с проверками или ncmd.

  • Jester

    ecmd (ekub) лучше :Р

    • Jester

      Результаты там меньше чем у old способа :О

  • Alex

    Выложи свой ncmd :)

    • ZiGGi

      ncmd есть в исходнике теста.

  • ZiGGi

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

  • DiSE

    Значит zcmd нужен для большого количества команд?

    • ZiGGi

      Да

  • aron

    большое количество, это примерно сколько?

    • anonim

      Что-то в районе 10-20.

  • Жаль нету тестов на ycmd…

    • Алексей

      на офф. сайте опубликовано же.

  • Алексей

    на офф. сайте опубликовано же

    ZiGGi так держать, спасибо

Перейти к верхней панели