На данный момент существует множество способов создания команд в 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.