SA-MP Forums Archive
Оптимизация циклов MAX_PLAYERS - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Оптимизация циклов MAX_PLAYERS (/showthread.php?tid=240970)

Pages: 1 2


Оптимизация циклов 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
View Post
Лучше юзать foreach
лучше купить мозг и не пороть чущь!
Для того что только что описал автор, достаточно 1 массива и 1 доп функции.
Ничего нового для себя в этой теме не нашел.


Re: Оптимизация циклов MAX_PLAYERS - Romanius - 17.03.2011

степаха опять прогоняешь. foreach построен по примерно такому же принципу, но более "оптимизирован".


Re: Оптимизация циклов MAX_PLAYERS - OFFREAL - 17.03.2011

Quote:
Originally Posted by Johnny_Xayc
View Post
Вот этого вполне достаточно!
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
View Post
лучше купить мозг и не пороть чущь!
Для того что только что описал автор, достаточно 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
View Post
степаха опять прогоняешь. foreach построен по примерно такому же принципу, но более "оптимизирован".
в том-то и дело что он нифига не оптимизирован, там наоборот много лишнего.


Re: Оптимизация циклов MAX_PLAYERS - Johnny_Xayc - 17.03.2011

Quote:
Originally Posted by Stepashka
View Post
в том-то и дело что он нифига не оптимизирован, там наоборот много лишнего.
Согласен.


Re: Оптимизация циклов MAX_PLAYERS - Romanius - 17.03.2011

если ты смотрел его внимательно, то ты бы увидел сортировку, поэтому он работает немного дольше. НО сортировка отключаится, и скорость в выполнения уменьшается


Re: Оптимизация циклов MAX_PLAYERS - Stepashka - 17.03.2011

Quote:
Originally Posted by Romanius
View Post
если ты смотрел его внимательно, то ты бы увидел сортировку, поэтому он работает немного дольше. НО сортировка отключаится, и скорость в выполнения уменьшается
если бы ты смотрел его внимательно ты бы его не исользовал.


Re: Оптимизация циклов MAX_PLAYERS - Makar93 - 17.03.2011

Да бред, передефайнил MAX_PLAYERS и хватит... С учетом, что максимальное кол-во игроков - 500, даже можно и не оптимизировать.


Re: Оптимизация циклов MAX_PLAYERS - Wyu - 17.03.2011

Quote:
Originally Posted by Stepashka
View Post
в том-то и дело что он нифига не оптимизирован, там наоборот много лишнего.
Не оптимизирован? Это где это?

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
View Post
Не оптимизирован? Это где это?

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
View Post
судишь конфету по обертке
Надеюсь пояснения будут?


Re: Оптимизация циклов MAX_PLAYERS - MX_Master - 22.03.2011

мои 5 копеек, мобыть кому-то понравится

PHP Code:
stock playerMaxID 0;
public 
OnPlayerConnect playerid 
{
    if ( 
playerid playerMaxID playerMaxID playerid;
}
public 
OnPlayerDisconnect playeridreason )
{
    if ( 
playerid <= playerMaxID )
    {
        for ( new 
playerid 1>= 0; --)
        {
            if ( 
IsPlayerConnected(i) )
            {
                
playerMaxID i;
                break;
            }
        }
    }
}
// - как использовать? 
// - вот пример
for ( new i<= playerMaxID; ++)
{
    if ( 
IsPlayerConnected(i) )
    {
        
// какое-то действие над игроком с ИДом "i"
    
}

не проверял на ошибки, по старой памяти, должно быть правильно. 1 переменка, но какая полезная !! ((:


Re: Оптимизация циклов MAX_PLAYERS - Miller - 09.04.2011

MX_Master, мне... :D