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