Оптимизация кода (советы, помощь)
|
_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, если он уже не нужен
|
|
| | |
Sunday
|
Дата: Суббота, 14.07.2012, 03:05:09 | Сообщение # 2 |
 |
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
спасибо! Ваши знания на вес золота!
|
|
| | |
scorpion2904
|
Дата: Суббота, 24.11.2012, 13:41:55 | Сообщение # 3 |
 |
Сообщений: 69
Репутация: 5 [ +/- ]
|
|
Что делает цикл OnGameFrame?
|
|
| | |
_wS_
|
Дата: Суббота, 24.11.2012, 18:56:24 | Сообщение # 4 |
|
Code public OnGameFrame() { static x = 0; PrintToServer("%d", ++x); } Событие вызывается 66 раз в сек или 33/100 - зависит от tickrate.
|
|
| | |
TEIN
|
Дата: Суббота, 13.04.2013, 15:33:19 | Сообщение # 5 |
 |
Сообщений: 551
Репутация: 73 [ +/- ]
|
|
Тот же пример с командой игрока можно сделать так Код switch (GetClientTeam(client)) { case 1: { // Код для наблюдателей } case 2: { // Код для Террористов } case 3: { // Код для Спецназовцев } }
Сообщение отредактировал DoK_1997 - Суббота, 13.04.2013, 15:35:14 |
|
| | |
Naykon
|
Дата: Четверг, 08.05.2014, 13:19:11 | Сообщение # 6 |
 |
Сообщений: 439
Репутация: -5 [ +/- ]
|
|
wS подскажи как избавиться от этого глупого предупреждения на этапе компиляции.. "warning 217: loose indentation" можно ли застявить компилятор не обращать внимания на эту ошибку (эта ошибка отвечает за табуляцию...) просто мешает рассмотреть реальные ошибки...
|
|
| | |
king(rus)
|
Дата: Суббота, 14.06.2014, 06:52:29 | Сообщение # 7 |
 |
Сообщений: 109
Репутация: 2 [ +/- ]
|
|
Цитата Naykon (  ) wS подскажи как избавиться от этого глупого предупреждения на этапе компиляции.. "warning 217: loose indentation" можно ли застявить компилятор не обращать внимания на эту ошибку (эта ошибка отвечает за табуляцию...) просто мешает рассмотреть реальные ошибки...
Можно, прописав:
|
|
| | |
Valeriks
|
Дата: Пятница, 20.06.2014, 15:14:53 | Сообщение # 8 |
 |
Сообщений: 101
Репутация: 3 [ +/- ]
|
|
_wS_ поясни пожалуйста одну вещь вот такой расклад Код if (x == 2) { // код } else if (x == 5) { // код } else if (x == 7) { // код } else { // код } выполняется поочередно? т.е. если в первом if (x == 2) ничего не сходится то дальше выполняется else if (x == 5) так? И если во всех параметрах ничего не сошлось то просто выполняется else {} Правильно?
Сообщение отредактировал Valeriks - Пятница, 20.06.2014, 15:16:04 |
|
| | |
_wS_
|
Дата: Пятница, 20.06.2014, 15:41:21 | Сообщение # 9 |
|
Да, по порядку.
|
|
| | |
serm
|
Дата: Среда, 10.09.2014, 14:29:15 | Сообщение # 10 |
 |
Сообщений: 138
Репутация: 7 [ +/- ]
|
|
Появились вопросы . Если я объявляю переменную так #define stroka "lol" - и использую 1 раз, стоит ли ее убирать ? (Использую для быстрого редактирования квара ...) Если плагин из 1000 ... более строк (но функции выполняющиеся внутри короткие) имеет смысл его укорачивать (Типа чем меньше размер файла тем меньше нагрузки он дает)? Как лучше объявлять переменную внутри плагина new или decl или ( static - вдруг он меньше нагрузки даст )? Если я создам Например OnGameFrame, OnPlayerRunCmd и тут же сделаю return Код public OnGameFrame() return; Будет ли от этого нагрузка ?Добавлено (10.09.2014, 14:24:57) --------------------------------------------- Почему если сделать так то вылезет warning Код TeleportEntity(id, NULL_VECTOR, NULL_VECTOR, {0.0, 0.0, 0.0}); а так нет Код new Float:f_Pos[3]; TeleportEntity(id, NULL_VECTOR, NULL_VECTOR, f_Pos); Добавлено (10.09.2014, 14:29:15) --------------------------------------------- Почему при вот таких функциях выходит warning Код public MyFunc(id, Float:f_Pos[3]){ TeleportEntity(id, NULL_VECTOR, NULL_VECTOR, f_Pos); // warning 213 AnyFunction(f_Pos); // warning 213 }
public AnyFunc(Float:f_Pos[3]){ // code ... }
|
|
| | |
BarD
|
Дата: Среда, 10.09.2014, 16:08:22 | Сообщение # 11 |
 |
Сообщений: 944
Репутация: 132 [ +/- ]
|
|
Цитата serm (  ) TeleportEntity(id, NULL_VECTOR, NULL_VECTOR, {0.0, 0.0, 0.0}); Возможно, массив последний у тебя не Float. Надо так: TeleportEntity(id, NULL_VECTOR, NULL_VECTOR, Float:{0.0, 0.0, 0.0});
|
|
| | |
serm
|
Дата: Среда, 10.09.2014, 16:28:16 | Сообщение # 12 |
 |
Сообщений: 138
Репутация: 7 [ +/- ]
|
|
Цитата BarD (  ) Возможно, массив последний у тебя не Float. Надо так: TeleportEntity(id, NULL_VECTOR, NULL_VECTOR, Float:{0.0, 0.0, 0.0}); Это уже исправил, а вот остальное пока что нет . Есть идеи ?
|
|
| | |
_wS_
|
Дата: Среда, 10.09.2014, 17:39:23 | Сообщение # 13 |
|
Цитата serm (  ) Если я объявляю переменную так #define stroka "lol" - и использую 1 раз, стоит ли ее убирать ? (Использую для быстрого редактирования квара ...) Если кода мало, то можно не беспокоиться, а так, это глоб переменная, видна во всех функциях/подключаемых файлах, поэтому, если используется 1 раз, то наверно лучше так не делать.
Цитата serm (  ) Если плагин из 1000 ... более строк (но функции выполняющиеся внутри короткие) имеет смысл его укорачивать (Типа чем меньше размер файла тем меньше нагрузки он дает)? Нет смысла, меньше кода - это просто оптимизация, для удобства. Груз же дает не кол-во кода, а сами функции/события, как много команд в них и как часто они выполняются.
Цитата _wS_ (  ) Как лучше объявлять переменную внутри плагина new или decl или ( static - вдруг он меньше нагрузки даст )? Если функция выполняется не слишком часто, то неважно. В OnGameFrame и подобных - new не стоит использовать, лучше static или глобал. Я в посл врем стал использовать static - чтобы переменная была видна лишь в одном файле (.sp, .inc) и тд - и если надо ее узнать или изменить, то делаю это через stock функцию.
Цитата serm (  ) Если я создам Например OnGameFrame, OnPlayerRunCmd и тут же сделаю return Будет ли от этого нагрузка ? Думаю нет, но и смысла нет так делать, лучше убрать тогда подобный код. Может в чем и ошибаюсь, просто мое мнение.
|
|
| | |
serm
|
Дата: Среда, 10.09.2014, 18:32:25 | Сообщение # 14 |
 |
Сообщений: 138
Репутация: 7 [ +/- ]
|
|
Цитата _wS_ (  ) Думаю нет, но и смысла нет так делать, лучше убрать тогда подобный код. Может в чем и ошибаюсь, просто мое мнение. Спасибо .
|
|
| | |
kaput11111
|
Дата: Суббота, 27.02.2016, 13:40:57 | Сообщение # 15 |
 |
Сообщений: 1
Репутация: 0 [ +/- ]
|
|
Объясните что это значит new Handle:hOnAdminMenuReady = INVALID_HANDLE; не могу понять и если не трудно привести пример
Сообщение отредактировал kaput11111 - Суббота, 27.02.2016, 13:55:20 |
|
| |
|