Оптимизация циклов MAX_PLAYERS
#1

Здравствуйте!
- - -
Появилась идея оптимизировать циклы вида:
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");

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

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

- - -
Очень интересно ваше мнение по поводу этого!
Reply
#2

Лучше юзать foreach
Reply
#3

Поподробнее про эти динамические циклы рассказал бы кто-нибудь. Кстати, похожий код http://forum.sa-mp.com/showpost.php?...postcount=1512
Reply
#4

Вот этого вполне достаточно!
pawn Code:
#undef MAX_PLAYERS
#define MAX_PLAYERS 50 // кол-во нужных вам игроков!
for(new i = 0; i < MAX_PLAYERS; i++)
{
      if(!IsPlayerConnected(i))continue;
}
Reply
#5

Quote:
Originally Posted by CrunkBankS
View Post
Лучше юзать foreach
лучше купить мозг и не пороть чущь!
Для того что только что описал автор, достаточно 1 массива и 1 доп функции.
Ничего нового для себя в этой теме не нашел.
Reply
#6

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

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 доп функции.
Ничего нового для себя в этой теме не нашел.
У меня и есть один массив
Можешь привести пример доп функции?
Reply
#8

Romanius, то-есть как-то так:
PHP Code:
foreach (new i in PLIDs)

    
SendClientMessage(i, -1"Message"); 

Reply
#9

xD
в pawn же нет foreach ...
Reply
#10

https://sampforum.blast.hk/showthread.php?tid=92679
Reply
#11

Quote:
Originally Posted by Romanius
View Post
степаха опять прогоняешь. foreach построен по примерно такому же принципу, но более "оптимизирован".
в том-то и дело что он нифига не оптимизирован, там наоборот много лишнего.
Reply
#12

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

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

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

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

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])
И чего тут лишнее?
Reply
#17

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])
И чего тут лишнее?
судишь конфету по обертке
Reply
#18

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


Quote:
Originally Posted by Stepashka
View Post
судишь конфету по обертке
Надеюсь пояснения будут?
Reply
#19

мои 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 переменка, но какая полезная !! ((:
Reply
#20

MX_Master, мне... :D
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)