TawerGhetto1488
Ученик
Доброго времени суток уважаемые пользователи Pawno-Info.ru
Сейчас я предоставлю вам урок по тому, как оптимизировать ваш Pawn код.
Автор: Nixon West
Сейчас я предоставлю вам урок по тому, как оптимизировать ваш Pawn код.
Автор: Nixon West
[HR][/HR]
Для начала, немного советов.
Совет #1:
Используйте в скрипте/моде как можно меньше таймеров. Каждый таймер способствует постепенному нарастанию грыжи у сервера.
Совет #2:
Функции которые не используются в таймерах, помещайте в stock а не в public
Совет #3:
При создании массивов типа:
PHP:
new string[256];
Макс. значение для SendClientMessage 144.
Совет #4:
Соблюдайте табуляцию/выравнивание кода (лесенка) и не используйте функций типо tabsize.
Совет #5:
В некоторых случаях лучше использовать функцию напрямую, чем заводить для неё переменную.
Пример:
PHP:
new var1;
var1 = GetPlayerSkin(playerid);
if(var1 == 0) return SendClientMessage(playerid, 0xFF0000FF, "У вас скин CJ");
PHP:
if(GetPlayerSkin(playerid) == 0) return SendClientMessage(playerid, 0xFF0000FF, "У вас скин CJ");
Если в переменной может быть значение только 0 или 1, используйте тип переменной bool.
Пример:
PHP:
PlayerInfo[playerid][pDriving];
/* Права на машину, они либо есть, либо их нет.
Поэтому pDriving в enum'е лучше пометить типом bool:pDriving */
// С обычными переменными аналогично
Старайтесь меньше использовать такие константы как MAX_PLAYERS, MAX_VEHICLES и т.п.
Лучше сделать так:
#undef MAX_PLAYERS
#define MAX_PLAYERS 20
где 20 - новое значение константы
Совет #8:
Старайтесь использовать стандартные функции, в большинстве случаев они быстрее чем их аналоги написанные сторонними скриптерами.
Яркий пример: PlayerToPoint и IsPlayerRangeOfPoint
Совет #9:
В некоторых случаях лучше использовать switch нежели if/else
Пример:
PHP:
if(var1 == 1) print("1");
else if(var1 == 2) print("2");
else if(var1 == 3) print("3");
else print("4");
PHP:
switch(var1)
{
case 1: print("1");
case 2: print("2");
case 3: print("3");
default: print("4");
}
Если возможно, лучше использовать имя клавиши, нежели её код.
Пример:
Клавиша Alt: KEY_WALK/1024
Лучше записать KEY_WALK.
Совет #11:
В большинстве случаев, использование паблика OnPlayerUpdate не оправдывает само себя, поэтому лучше с ним не злоупотре***тb.
Совет #12:
НИКОГДА не используйте цикл в цикле (последнее время частенько такое замечаю).
Пример:
PHP:
for(new i = 0; i < MAX_PLAYERS; i++)
{
for(new z = 0; z < MAX_PLAYERS; z++) // Этот цикл выполнится 500 по 500 (т.е. 500 раз по 500)
{
}
}
Если вы часто используете один и тот же код, лучше создать для него функцию.
Пользуясь этими советами, вы добьётесь большей эффективности скриптинга. Как в быстродействии, так и в визуальном восприятии кода.
А теперь пара приёмов "оптимизированного" кода.
1. Структура switch:
PHP:
switch(var1)
{
case 0: var1 = 1;
case 1: var1 = 1;
case 2: var1 = 1;
case 3: var1 = 2;
case 4: var1 = 2;
...
}
PHP:
switch(var1)
{
case 0..2: var1 = 1;
case 3,4: var1 = 2;
}
PHP:
...
SendClientMessage(playerid, 0xFFFFFFFF, "Текст");
return 1;
В нашем примере можно сделать так:
PHP:
return SendClientMessage(playerid, 0xFFFFFFFF, "Текст");
PHP:
...
if(!strcmp("text", "text", true)) return 1;
else return 0;
PHP:
!strcmp("text", "text", true)?true:false;
PHP:
for(new i; i<MAX_PLAYERS; i++) { ... }
Для этого создаем глобальный двумерный массив:
PHP:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
PHP:
GetPlayerName(playerid, PlayerName[playerid], MAX_PLAYER_NAME);
При выходе игрока нужно очистить его ячейку в массиве:
PHP:
PlayerName[playerid][0] = 0;
PHP:
format(str, 128, "Ник игрока под идом 5 '%s'", PlayerName[5]);
Всем спасибо за просмотр, думаю новичкам это пригодится.
