Совет #1:
Используйте в скрипте/моде как можно меньше таймеров. Каждый таймер способствует постепенному нарастанию грыжи у сервера.
Совет #2:
Функции которые не используются в таймерах, помещайте в stock а не в public
Совет #3:
При создании массивов типа:
Подумайте заранее, какая самая большая строка может использоваться в массиве, и максимально уменьшите число в квадратных скобках.
Макс. знчение для SendClientMessage 144.
Совет #4:
Соблюдайте табуляцию/выравнивание кода (лесенка) и не используйте функций типо tabsize.
Совет #5:
В некоторых случаях лучше использовать функцию напрямую, чем заводить для неё переменную.
Пример:
Лучше сделать так:
Совет #6:
Если в переменной может быть значение только 0 или 1, используйте тип переменной bool.
Пример:
Совет #7:
Старайтесь меньше использовать такие константы как MAX_PLAYERS, MAX_VEHICLES и т.п.
Лучше сделать так:
#undef MAX_PLAYERS
#define MAX_PLAYERS 20
где 20 - новое значение константы
Совет #8:
Старайтесь использовать стандартные функции, в большинстве случаев они быстрее чем их аналоги написанные сторонними скриптерами.
Яркий пример: PlayerToPoint и IsPlayerRangeOfPoint
Совет #9:
В некоторых случаях лучше использовать switch нежели if/else
Пример:
Лучше записать так:
Совет #10:
Если возможно, лучше использовать имя клавиши, нежели её код.
Пример:
Клавиша Alt: KEY_WALK/1024
Лучше записать KEY_WALK.
Совет #11:
В большинстве случаев, использование паблика OnPlayerUpdate не оправдывает само себя, поэтому лучше с ним не злоупотреблятb.
Совет #12:
НИКОГДА не используйте цикл в цикле (последнее время частенько такое замечаю).
Пример:
Совет #13:
Если вы часто используете один и тот же код, лучше создать для него функцию.
Пользуясь этими советами, вы добьётесь большей эффективности скриптинга. Как в быстродействии, так и в визуальном восприятии кода.
А теперь пара приёмов "оптимизированного" кода.
1. Структура switch:
Лучше записать так:
2. Часто в функциях/командах используется:
"Функцию" return, можно использовать в составе с любой функцией которая возвращает 1 или 0 (истина или ложь).
В нашем примере можно сделать так:
2.1. Если функция возвращает true/else по условию:
Можно записать так:
3. Использование псевдодинамических массивов для оптимизации циклов типа:
==============================================================================================
Оптимизация циклов вида:
Не для кого не секрет, что MAX_PLAYERS определяется в a_samp.inc и равна 500.
Раньше я использовал вот такую манипуляцию:
Это конечно давало некоторый прирост, но я пошел еще дальше!
Первой идеей было использовать функцию GetMaxPlayers(), но это никак не помогло бы: на сервере могут быть всего 3 игрока, ид которых 0, 7 и 28, и циклу приходилось бы совершать 28 тактов.
К сожалению, в pawn нельзя создавать динамические массивы, поэтому я придумал использовать что-то вроде псевдодинамического массива для хранения идподключенных игроков. Создал глобальный масив:
Далее я ввел переменную содержащую количество игроков на сервере:
Теперь надо добавить в паблик OnPlayerConnect необходимые операции с глобальными переменными:
Все довольно просто - игрок подключается, и его ИД помещается в последнюю свободную ячейку массива PLIDs, ну а переменная MaxPlayers становится на единицу больше.
С пабликом OnPlayerDisconnect все немного сложнее. Игрок выходит, тоесть слот в PLIDs который занимала его ИД надо очистить. Но мне не нужен пустой слот, поэтому я присваиваю ему значение самого последнего слота PLIDs, и вот последний уже очищаю:
Все, теперь вы можете оптимизировать массивы.
Пример:
Пусть был массив:
После оптимизации:
Плюсы данного метода:
- отсутствуют лишние такты циклов
- не требуется проверять подключен ли игрок
Минусы:
- меняется порядок ИД игроков при выполнении циклов
==============================================================================================
4. Использование массива вместо функции GetPlayerName (либо ее аналога, GetPlayerNameEx) для узнавания никнейма игрока.
Для этого создаем глобальный двумерный массив:
Далее в OnPlayerConnect'e записываем никнейм игрока в массив:
При каждом изменении ника по сценарию мода также добавляем эту строку (например в команду /setname)
При выходе игрока нужно очистить его ячейку в массиве:
Пример использование:
Автор: eFFect aka YoYo
Уважаемый гость, если у Вас возникли проблемы с регистрацией, просьба обратиться в тех.поддержку или на почту admin@pawno-crmp.ru
Для полного доступа ко всем функциям форума, Вам необходимо зарегистрироваться и авторизоваться.
Для полного доступа ко всем функциям форума, Вам необходимо зарегистрироваться и авторизоваться.
#1
online
Отправлено 03 Июнь 2014 - 05:07
online
Темы с аналогичным тегами Урок, CRMP, PAWNO-CRMP
Мануал
Pawn скриптинг →
Готовые решения →
Приз для любого игрока по пикапуАвтор Pavel_Mafter , 06 мая 2017 |
|
|
||
Продажа
CR:MP →
Магазин →
Продажа →
продам маппинг спавна и некоторых фракцийАвтор алексей2281 , 06 мая 2017 |
|
|
||
CMD
Pawn скриптинг →
Разработки →
Команды →
/carinfo [Узнать ID авто]Автор Pavel_Mafter , 06 мая 2017 |
|
|
||
CMD
Pawn скриптинг →
Разработки →
Команды →
/aduty [Выход Админа на дежурство]Автор Pavel_Mafter , 06 мая 2017 |
|
|
||
CMD
Pawn скриптинг →
Разработки →
Команды →
/admins [Список Администрации в сети]Автор Pavel_Mafter , 06 мая 2017 |
|
|
Количество пользователей, читающих эту тему: 1
0 пользователей, 0 гостей, 0 анонимных
-
Alexa (1)



Сообщений: 1 037
Регистрация:
Skype: mike_richardson3