- Регистрация
- 31 Дек 2010
- Сообщения
- 174
- Лучшие ответы
- 0
- Репутация
- 138
Здравствуйте, вот подумал почему бы и не начать уроки по оптимизации кода в Pawno;
Некоторые начинающие скриптера задают вопросы что же такое оптимизация вот на него ответ:
Оптимизация - это изменения кода, так что бы размер его, объем занимаемой памяти и кол-во совершаемых действий компьютером довести до минимума, но при этом функциональность кода оставить без изменений.
Первый урок будет посвешен циклам;
В циклах, когда нужно выполнить его для всех игроков, обычно используют MAX_PLAYERS, тем самым выполняя действие 500 раз, но при этом мало у кого на сервере стоит реально 500 слотов.Поэтому я бы советовал использховать GetMaxPlayers(), тогда сервер будет получать кол-во реальных слотов и выполнять действие столько раз сколько у вас слотов, не нагружая его лишними действиями.
Кстати тоже самое можно сказать и про MAX_VEHICLES,ведь не у кого на севрере почти не стоит 2000 машин,а цикл будет выполнять 2000 действий,хотя реальных автомобилей может быть 100.
Сначала (после #include <a_samp>) пишем:
Это конечно давало некоторый прирост, но идем дальше!
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
К сожалению, в pawn нельзя создавать динамические массивы, поэтому я придумал использовать что-то вроде псевдодинамического массива для хранения ID подключенных игроков. Создаем глобальный масив:
new PlayersMAX[MAX_PLAYERS];
Далее вводим переменную содержащую количество игроков на сервере:
Очищаем весь массив PlayersMAX в OnGameModInit:
В паблик OnPlayerConnect добавляем действия:
Игрок подключается, и его ИД помещается в первый свободный слот массива PLIDs, ну а переменная MaxPlayers становится на единицу больше.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Паблик OnPlayerDisconnect - тут все немного сложнее. Игрок выходит, а значит слот в PlayersMAX котором записан его ИД надо очистить. Но нам не нужен пустой слот в середине массива, поэтому присваем ему значение самого последнего занятого слота массиваPlayersMAX, а вот последний уже очищаем:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Пусть был массив:
После оптимизации:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Плюсы данного метода:
- отсутствуют лишние такты циклов
- не требуется проверять подключен ли игрок
Минусы:
- меняется порядок ИД игроков при выполнении циклов
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Очень интересно ваше мнение по поводу этого!
Если вам понравилось то + жду;
Конечно оптимизировать код тяжело но этого стоит.
Автор: Den_Wilson
Некоторые уроки брал с
Некоторые начинающие скриптера задают вопросы что же такое оптимизация вот на него ответ:
Оптимизация - это изменения кода, так что бы размер его, объем занимаемой памяти и кол-во совершаемых действий компьютером довести до минимума, но при этом функциональность кода оставить без изменений.
Первый урок будет посвешен циклам;
В циклах, когда нужно выполнить его для всех игроков, обычно используют 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;
PHP:
for(new i=0;i<sizeof(PlayersMAX);i++){PlayersMAX[i] = -1;}
PHP:
PlayersMAX[MaxPlayers] = playerid;
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
Некоторые уроки брал с
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Последнее редактирование: