Доступ к архиву

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Оптимизация кода №1

Статус
В этой теме нельзя размещать новые ответы.

Den_Wilson

Изучающий
Пользователь
Регистрация
31 Дек 2010
Сообщения
174
Лучшие ответы
0
Репутация
138
Здравствуйте, вот подумал почему бы и не начать уроки по оптимизации кода в Pawno;
Некоторые начинающие скриптера задают вопросы что же такое оптимизация вот на него ответ:

Оптимизация - это изменения кода, так что бы размер его, объем занимаемой памяти и кол-во совершаемых действий компьютером довести до минимума, но при этом функциональность кода оставить без изменений.

Первый урок будет посвешен циклам;

В циклах, когда нужно выполнить его для всех игроков, обычно используют MAX_PLAYERS, тем самым выполняя действие 500 раз, но при этом мало у кого на сервере стоит реально 500 слотов.Поэтому я бы советовал использховать GetMaxPlayers(), тогда сервер будет получать кол-во реальных слотов и выполнять действие столько раз сколько у вас слотов, не нагружая его лишними действиями.

Кстати тоже самое можно сказать и про MAX_VEHICLES,ведь не у кого на севрере почти не стоит 2000 машин,а цикл будет выполнять 2000 действий,хотя реальных автомобилей может быть 100.


Сначала (после #include <a_samp>) пишем:

PHP:
#undef MAX_PLAYERS // Освобождаем ячейки
#define MAX_PLAYERS 500 // Максимальное количество игроков по слотам
#undef MAX_VEHICLES // Освобождаем ячейки
#define MAX_VEHICLES 500 // Максимальное количество машин
Это конечно давало некоторый прирост, но идем дальше!

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

К сожалению, в pawn нельзя создавать динамические массивы, поэтому я придумал использовать что-то вроде псевдодинамического массива для хранения ID подключенных игроков. Создаем глобальный масив:

new PlayersMAX[MAX_PLAYERS];

Далее вводим переменную содержащую количество игроков на сервере:

PHP:
new MaxPlayers = 0;
Очищаем весь массив PlayersMAX в OnGameModInit:

PHP:
for(new i=0;i<sizeof(PlayersMAX);i++){PlayersMAX[i] = -1;}
В паблик OnPlayerConnect добавляем действия:

PHP:
PlayersMAX[MaxPlayers] = playerid; 
MaxPlayers++;
Игрок подключается, и его ИД помещается в первый свободный слот массива PLIDs, ну а переменная MaxPlayers становится на единицу больше.

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Паблик OnPlayerDisconnect - тут все немного сложнее. Игрок выходит, а значит слот в PlayersMAX котором записан его ИД надо очистить. Но нам не нужен пустой слот в середине массива, поэтому присваем ему значение самого последнего занятого слота массиваPlayersMAX, а вот последний уже очищаем:

PHP:
for(new i=0;i<MaxPlayers;i++) 
{ 
    if(PlayersMAX[i] == playerid) 
    { 
        MaxPlayers--; 
        PlayersMAX[i] = PlayersMAX[MaxPlayers]; 
        PlayersMAX[MaxPlayers] = -1; 
        break; 
    } 
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Пусть был массив:

PHP:
for(new i=0;i<MAX_PLAYERS;i++) 
{ 
    if(!IsPlayerConnected(i)){continue;} 
    SendClientMessage(i, COLOR_WHITE, "Сообщение"); 
}
После оптимизации:

PHP:
for(new i=0;i<MaxPlayers;i++) 
{ 
    SendClientMessage(PlayersMAX[i], COLOR_WHITE, "Сообщение"); 
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Плюсы данного метода:
- отсутствуют лишние такты циклов
- не требуется проверять подключен ли игрок

Минусы:
- меняется порядок ИД игроков при выполнении циклов

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Очень интересно ваше мнение по поводу этого!
Если вам понравилось то + жду;:)
Конечно оптимизировать код тяжело но этого стоит.
Автор: Den_Wilson
Некоторые уроки брал с
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу