Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 2 из 2«12
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Оптимизация кода (советы, помощь) (Как сделать лучше)
Оптимизация кода (советы, помощь)
_wS_ Дата: Четверг, 31.05.2012, 02:11:07 | Сообщение # 1
Задачу можно решить многими способами, но нужно уметь:

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

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

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

Code
// Так делать глупо:
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, то сервер может рухнуть - нужно быть уверенным, что в ней есть значение.

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

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

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

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

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

На счет if и else if:

Code
new x = 5;

// так плохо:

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

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

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

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

- если ипользуете переменные внутри цикла, то объявляйте их перед циклом, а не внутри
- обрывайте цикл с помощью команд break, return, если он уже не нужен
 
dases2003 Дата: Суббота, 27.02.2016, 15:20:11 | Сообщение # 16
Сообщений: 108
Репутация: 1 [ +/- ]
1. При создании INVALID_HANDLE ставится автоматически.
2. Означает, что хэндл ничего не хранит.
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Оптимизация кода (советы, помощь) (Как сделать лучше)
Страница 2 из 2«12
Поиск: