17.03.2011, 00:38
Здравствуйте!
- - -
Появилась идея оптимизировать циклы вида:
Сначала (после #inclide <a_samp>) писал:
Это конечно давало некоторый прирост, но я пошел еще дальше!
- - -
К сожалению, в pawn нельзя создавать динамические массивы, поэтому я придумал использовать что-то вроде псевдодинамического массива для хранения ид подключенных игроков. Создал глобальный масив:
Далее я ввел переменную содержащую количество игроков на сервере:
Очищаю весь массив PLIDs в OnGameModInit:
В паблик OnPlayerConnect добавил необходимые действия:
Игрок подключается, и его ИД помещается в первый свободный слот массива PLIDs, ну а переменная MaxPlayers становится на единицу больше.
- - -
Паблик OnPlayerDisconnect - тут все немного сложнее. Игрок выходит, а значит слот в PLIDs котором записан его ИД надо очистить. Но мне не нужен пустой слот в середине массива, поэтому я присваиваю ему значение самого последнего занятого слота массиваPLIDs, а вот последний уже очищаю:
- - -
Использую как-то так:
Пусть был массив:
После оптимизации:
- - -
Плюсы данного метода:
- отсутствуют лишние такты циклов
- не требуется проверять подключен ли игрок
Минусы:
- меняется порядок ИД игроков при выполнении циклов
- - -
Очень интересно ваше мнение по поводу этого!
- - -
Появилась идея оптимизировать циклы вида:
PHP Code:
for(new i=0;i<MAX_PLAYERS;i++)
{ ... }
PHP Code:
#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#define MAX_PLAYERS 100
#else
#define MAX_PLAYERS 100
#endif
- - -
К сожалению, в pawn нельзя создавать динамические массивы, поэтому я придумал использовать что-то вроде псевдодинамического массива для хранения ид подключенных игроков. Создал глобальный масив:
PHP Code:
new PLIDs[MAX_PLAYERS];
PHP Code:
new MaxPlayers = 0;
PHP Code:
for(new i=0;i<sizeof(PLIDs);i++){PLIDs[i] = -1;}
PHP Code:
PLIDs[MaxPlayers] = playerid;
MaxPlayers++;
- - -
Паблик OnPlayerDisconnect - тут все немного сложнее. Игрок выходит, а значит слот в PLIDs котором записан его ИД надо очистить. Но мне не нужен пустой слот в середине массива, поэтому я присваиваю ему значение самого последнего занятого слота массиваPLIDs, а вот последний уже очищаю:
PHP Code:
for(new i=0;i<MaxPlayers;i++)
{
if(PLIDs[i] == playerid)
{
MaxPlayers--;
PLIDs[i] = PLIDs[MaxPlayers];
PLIDs[MaxPlayers] = -1;
break;
}
}
Использую как-то так:
Пусть был массив:
PHP Code:
for(new i=0;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(i)){continue;}
SendClientMessage(i, -1, "Message");
}
PHP Code:
for(new i=0;i<MaxPlayers;i++)
{
SendClientMessage(PLIDs[i], -1, "Message");
}
Плюсы данного метода:
- отсутствуют лишние такты циклов
- не требуется проверять подключен ли игрок
Минусы:
- меняется порядок ИД игроков при выполнении циклов
- - -
Очень интересно ваше мнение по поводу этого!