[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Оптимизация кода (советы, помощь) ((Как сделать лучше)Взято с world-source.ru)
Оптимизация кода (советы, помощь)
rootДата: Среда, 30.01.2013, 23:14 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
Задачу можно решить многими способами, но нужно уметь:

Код
- Укорачивать и оптимизировать код  
- Не использовать лишнее (например, зачем создавать переменную, если она может не понадобиться)  
- Не использовать часто одинаковый код (создавайте функции)  
- Не злоупотреблять такими циклами, как OnGameFrame, OnPlayerRunCmd (даже избегать их)  
- Не создавать "утечку памяти" (закрывать все ненужные Handle и т.д.)  
- Понимать порядок выполнения команд и событий  
- Делать нужные проверки (например, перед выдачей оружия игроку: он точно на сервере? жив? и т.д.)  
- Не делать ненужные/лишние/повторные проверки в условиях  
- Указывать массивам правильный размер (не создавать много лишних ячеек)  
- И др.. (скажите, если я что-то упустил)


Если вы не уверены в коде или сомневаетесь, как что-то лучше сделать, можете писать в этой теме. 

Некоторые Советы:

Код
// Так делать глупо:  
if (GetClientTeam(client) == 2) ...  
else if (GetClientTeam(client) == 3) ...  

// Зачем повторно получать команду игрока, если мы уже сделали это?  
// Сохраните её в переменной и уже с ней работайте:  
new team = GetClientTeam(client);  
if (team == 2) ...  
else if (team == 3) ...  

// Если вам нужно сделать только одно сравнение, то создавать переменную нет смысла:  
if (GetClientTeam(client) == 2) ...


На счет массивов: 

Если вы создаёте массив внутри функции и пока не знаете, что в нём будет, то используйте приставку decl, а не new, тем более если это делается в циклах. Приставка decl лишь готовит переменную, которая пока что содержит хлам, т.к. в ней нет никакого значения. Если вы попробуете вывести значение такой переменной, например, в PrintToServer, то сервер может рухнуть - нужно быть уверенным, что в ней есть значение. 

На счет строк:

Код
// Готовим переменную для хранения строки  
decl String:name[45];  

// Вот так можно обезопасить строку.  
// Это полезно, если хотим работать с переменной, но не уверены, есть ли в ней значение.  
name[0] = '\0';    

// Команда для примера:  
GetEntPropString(index, Prop_Data, "m_iName", name, 45);  

// И ниже уже можно работать с этой переменной, не беспокоясь  
if (name[0] == '\0') .. // строка пустая


На счет if и else if

Код
new x = 5;  

// так плохо:  

if (x == 2)  
{  
      // код  
}  
if (x == 5)  
{  
      // код  
}  

// так хорошо:  

if (x == 2)  
{  
      // код  
}  
else if (x == 5)  
{  
      // код  
}  
else if (x == 7)  
{  
      // код  
}  
else  
{  
      // код  
}


Если вы используете цикл forwhile и тд, то: 

- если ипользуете переменные внутри цикла, то объявляйте их перед циклом, а не внутри 
- обрывайте цикл с помощью команд breakreturn, если он уже не нужен

Код
public OnGameFrame()  
{  
      static x = 0;  
      PrintToServer("%d", ++x);  
}
Событие вызывается 66 раз в сек или 33/100 - зависит от tickrate.
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Оптимизация кода (советы, помощь) ((Как сделать лучше)Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: