Сайт восстановлен из веб архива. Сейчас он доступен только для чтения, скачивание материалов также недоступно. Если у вас до сих пор есть какие-то вопросы по разработке серверов CRMP, вы можете перейти на актуальный портал: https://pawno-rus.com

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

Уважаемый гость, если у Вас возникли проблемы с регистрацией, просьба обратиться в тех.поддержку или на почту admin@pawno-crmp.ru

Для полного доступа ко всем функциям форума, Вам необходимо зарегистрироваться и авторизоваться.

Фотография
Урок

Оптимизация мода/скрипта

CRMP PAWNO-CRMP

  • Тема закрыта
В этой теме нет ответов

#1
online   cooper

cooper
  • 380
    • Сообщений: 1 037
    • Регистрация: 13.03.14
Совет #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
  • 7



Темы с аналогичным тегами Урок, CRMP, PAWNO-CRMP

Количество пользователей, читающих эту тему: 1

0 пользователей, 0 гостей, 0 анонимных


    Alexa (1)

Данную тему посетили 322 пользователей