Оптимизация циклов MAX_PLAYERS -
OFFREAL - 17.03.2011
Здравствуйте!
- - -
Появилась идея оптимизировать циклы вида:
PHP Code:
for(new i=0;i<MAX_PLAYERS;i++)
{ ... }
Сначала (после #inclide <a_samp>) писал:
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;
Очищаю весь массив
PLIDs в
OnGameModInit:
PHP Code:
for(new i=0;i<sizeof(PLIDs);i++){PLIDs[i] = -1;}
В паблик
OnPlayerConnect добавил необходимые действия:
PHP Code:
PLIDs[MaxPlayers] = playerid;
MaxPlayers++;
Игрок подключается, и его ИД помещается в первый свободный слот массива
PLIDs, ну а переменная
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");
}
- - -
Плюсы данного метода:
- отсутствуют лишние такты циклов
- не требуется проверять подключен ли игрок
Минусы:
- меняется порядок ИД игроков при выполнении циклов
- - -
Очень интересно ваше мнение по поводу этого!
Re: Оптимизация циклов MAX_PLAYERS -
CrunkBankS - 17.03.2011
Лучше юзать foreach
Re: Оптимизация циклов MAX_PLAYERS -
OKStyle - 17.03.2011
Поподробнее про эти динамические циклы рассказал бы кто-нибудь. Кстати, похожий код
http://forum.sa-mp.com/showpost.php?...postcount=1512
Re: Оптимизация циклов MAX_PLAYERS -
Johnny_Xayc - 17.03.2011
Вот этого вполне достаточно!
pawn Code:
#undef MAX_PLAYERS
#define MAX_PLAYERS 50 // кол-во нужных вам игроков!
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i))continue;
}
Re: Оптимизация циклов MAX_PLAYERS -
Stepashka - 17.03.2011
Quote:
Originally Posted by CrunkBankS
Лучше юзать foreach
|
лучше купить мозг и не пороть чущь!
Для того что только что описал автор, достаточно 1 массива и 1 доп функции.
Ничего нового для себя в этой теме не нашел.
Re: Оптимизация циклов MAX_PLAYERS -
Romanius - 17.03.2011
степаха опять прогоняешь. foreach построен по примерно такому же принципу, но более "оптимизирован".
Re: Оптимизация циклов MAX_PLAYERS -
OFFREAL - 17.03.2011
Quote:
Originally Posted by Johnny_Xayc
Вот этого вполне достаточно!
pawn Code:
#undef MAX_PLAYERS #define MAX_PLAYERS 50 // кол-во нужных вам игроков! for(new i = 0; i < MAX_PLAYERS; i++) { if(!IsPlayerConnected(i))continue; }
|
Я писал, что раньше пользовался этим методом, но у него явные минусы - каждый раз выполняется проверка IsPlayerConnected и используется много лишних тактов.
- - -
Quote:
Originally Posted by Stepashka
лучше купить мозг и не пороть чущь!
Для того что только что описал автор, достаточно 1 массива и 1 доп функции.
Ничего нового для себя в этой теме не нашел.
|
У меня и есть один массив

Можешь привести пример доп функции?
Re: Оптимизация циклов MAX_PLAYERS -
OFFREAL - 17.03.2011
Romanius, то-есть как-то так:
PHP Code:
foreach (new i in PLIDs)
{
SendClientMessage(i, -1, "Message");
}
Re: Оптимизация циклов MAX_PLAYERS -
OFFREAL - 17.03.2011
xD
в pawn же нет foreach ...
Re: Оптимизация циклов MAX_PLAYERS -
CrunkBankS - 17.03.2011
https://sampforum.blast.hk/showthread.php?tid=92679
Re: Оптимизация циклов MAX_PLAYERS -
Stepashka - 17.03.2011
Quote:
Originally Posted by Romanius
степаха опять прогоняешь. foreach построен по примерно такому же принципу, но более "оптимизирован".
|
в том-то и дело что он нифига не оптимизирован, там наоборот много лишнего.
Re: Оптимизация циклов MAX_PLAYERS -
Johnny_Xayc - 17.03.2011
Quote:
Originally Posted by Stepashka
в том-то и дело что он нифига не оптимизирован, там наоборот много лишнего.
|
Согласен.
Re: Оптимизация циклов MAX_PLAYERS -
Romanius - 17.03.2011
если ты смотрел его внимательно, то ты бы увидел сортировку, поэтому он работает немного дольше. НО сортировка отключаится, и скорость в выполнения уменьшается
Re: Оптимизация циклов MAX_PLAYERS -
Stepashka - 17.03.2011
Quote:
Originally Posted by Romanius
если ты смотрел его внимательно, то ты бы увидел сортировку, поэтому он работает немного дольше. НО сортировка отключаится, и скорость в выполнения уменьшается
|
если бы ты смотрел его внимательно ты бы его не исользовал.
Re: Оптимизация циклов MAX_PLAYERS -
Makar93 - 17.03.2011
Да бред, передефайнил MAX_PLAYERS и хватит... С учетом, что максимальное кол-во игроков - 500, даже можно и не оптимизировать.
Re: Оптимизация циклов MAX_PLAYERS -
Wyu - 17.03.2011
Quote:
Originally Posted by Stepashka
в том-то и дело что он нифига не оптимизирован, там наоборот много лишнего.
|
Не оптимизирован? Это где это?
pawn Code:
// foreach.inc
#define foreach(%1,%2) \
for (new %2 = YSI_gS%1; _:%2 != -1; %2 = YSI_gA%1[%2])
И чего тут лишнее?
Re: Оптимизация циклов MAX_PLAYERS -
Stepashka - 17.03.2011
Quote:
Originally Posted by Wyu
Не оптимизирован? Это где это?
pawn Code:
// foreach.inc #define foreach(%1,%2) \ for (new %2 = YSI_gS%1; _:%2 != -1; %2 = YSI_gA%1[%2])
И чего тут лишнее?
|
судишь конфету по обертке
Re: Оптимизация циклов MAX_PLAYERS -
Wyu - 17.03.2011
Если под "лишнее" имелся ввиду доп. функционал, то он вовсе не вносит никакого оверхеда, да и никто не заставляет им пользоваться
Quote:
Originally Posted by Stepashka
судишь конфету по обертке 
|
Надеюсь пояснения будут?
Re: Оптимизация циклов MAX_PLAYERS -
MX_Master - 22.03.2011
мои 5 копеек, мобыть кому-то понравится
PHP Code:
stock playerMaxID = 0;
public OnPlayerConnect ( playerid )
{
if ( playerid > playerMaxID ) playerMaxID = playerid;
}
public OnPlayerDisconnect ( playerid, reason )
{
if ( playerid <= playerMaxID )
{
for ( new i = playerid - 1; i >= 0; --i )
{
if ( IsPlayerConnected(i) )
{
playerMaxID = i;
break;
}
}
}
}
// - как использовать?
// - вот пример
for ( new i; i <= playerMaxID; ++i )
{
if ( IsPlayerConnected(i) )
{
// какое-то действие над игроком с ИДом "i"
}
}
не проверял на ошибки, по старой памяти, должно быть правильно. 1 переменка, но какая полезная !! ((:
Re: Оптимизация циклов MAX_PLAYERS -
Miller - 09.04.2011
MX_Master, мне... :D