Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Оптимизации Pawn Кода - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Оптимизации Pawn Кода
Оценка: ***** 4 Голосов

#1
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Несколько советов:

Совет #1:
Используйте в скрипте/моде как можно меньше таймеров или используйте их с умом. Каждый таймер способствует постепенному нарастанию грыжи у сервера.

Совет #2:
Если вы НЕ собираетесь использовать функцию в таймерах, CallLocalFunction или CallRemoteFunction, помещайте их в stock а не в public.

Совет #3:
При создании массивов типа:
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

Совет #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.

Совет #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. Использование псевдодинамических массивов для оптимизации циклов типа:
for(new i; i<MAX_PLAYERS; i++) { ... }

Прочитать об этом способе можно здесь.

4. Использование массива вместо функции GetPlayerName для узнавания никнейма игрока:
Для этого создаем глобальный двумерный массив:
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

20

Сказали спасибо 7:

#2
Пользователь офлайн   Yatakoi 

  • Местный
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Хороший урок
0

Сказали спасибо 1:

#3
Пользователь офлайн   OneLifeOneDream 

  • Знаток
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Кул урок лови +
0

#4
Пользователь офлайн   TikTak 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Спасибо +
0

#5
Пользователь офлайн   iProDeD 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Понравилось ;)
0

#6
Пользователь офлайн   Zverek 

  • Пользователь
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
У меня такой вопрос, насчёт использования "bool:переменная", как придавать значение переменной( bool:переменная ) при загрузки с БД, когда я пищу:
PLAYER[playerid][IMIGR] = strval(temp);

У меня вопрос по применению bool:переменная, как присвоить значение переменой при загрузке с БД? когда пищу:
PLAYER[playerid][IMIGR] 	= strval(temp);  // в ennum'e у меня bool:IMIGR

Мне пищет :
warning 213: tag mismatch

Заранее спасибо за ответ. :rolleyes:
0

#7
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Просмотр сообщенияZverek (14 Ноябрь 2014 - 19:52) писал:

...

В Pawn булевый тип равносилен обычному, целочисленному. То есть, такая переменная занимает так же 4 байта. Если и оптимизировать массивы, то использовать char
0

#8
Пользователь офлайн   Zverek 

  • Пользователь
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Просмотр сообщенияDeimoS (15 Ноябрь 2014 - 11:25) писал:

В Pawn булевый тип равносилен обычному, целочисленному. То есть, такая переменная занимает так же 4 байта. Если и оптимизировать массивы, то использовать char

Спасибо )
0

#9
Пользователь офлайн   sp1ke 

  • Пользователь
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Спасибо за урок.
0

#10
Пользователь офлайн   Adam_Creed 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Romzes,
Привет, прочитал советы по оптимизации кода pawn, все очень грамотно объяснил. Я хотел бы узнать не предоставляшь ли услуги по оптимизации модов?! У меня проблема при он-лайне 20+ крашит админов, просто выкидывает. Я сам в pawn самоучка, все через инет, все через видеоуроки мод скаченый, но я искал более чистый, чтобы вносить свои изменения. Напиши мне свой скайп договоримся что и как, забыл представится, меня зовут Александр. Скайп [удалено]
0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей