GM fazendo o server reiniciar?
#1

O que pode ser?

E qual a diferenзa de:
for(new i = 0; i < MAX_PLAYERS; i++)
para
for(new i = 0; i < GetMaxPlayers(); i++)



Eu gostaria tambйm de dicas para diminuir o lag em um servidor, eu ultilizo Dini no mesmo.
Grato,
Reply
#2

o
pawn Код:
for(new i; i < GetMaxPlayers(); i++)
й executado mais lentamente que o *MAX_PLAYERS* pois ele chama uma funзгo dentro do loop, demorando alguns milissegundos a mais (nгo que alguem note ._.) do que simplesmente usar nъmeros (MAX_PLAYERS й so um define, ou seja o compiler vai encarar ele como se fosse um nъmero). #define MAX_PLAYERS GetMaxPlayers() da na mesma que simplesmente usar GetMaxPlayers
Reply
#3

MAX_PLAYERS Checa o loop em 500 Players.
GetMaxPlayers Checa com o mбximo de slots do seu servidor, isto й, se tiver configurado em 50 ele vai checar em 50.

Quando usa GetMaxPlayers/MAX_PLAYERS Niguйm nota,
Mais Cientificamente o Loop GetMaxPlayers checa mais rбpido porque ele tem que checar entre as pessoas do servidor, e o MAX_PLAYERS checa em 500, nгo importa o slots ele checa em 500.

Tendeu ?
Reply
#4

Posso falar a soluзгo para seus problemas ? #include <for>
E bem mais simples usa Ex:

foreach(Player,i) return DrakonGay[i] = 24;
Reply
#5

Quote:
Originally Posted by [Banido]HigorOliver
Посмотреть сообщение
Posso falar a soluзгo para seus problemas ? #include <for>
E bem mais simples usa Ex:

foreach(Player,i) return DrakonGay[i] = 24;
Mais fбcil ele saber como funga para saber qual melhor usa-lo.
Reply
#6

Й mais facil usa MAX_PLAYERS.
Mas no topo de seu GameMode coloque:

pawn Код:
#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#define MAX_PLAYERS 50           //Troque 50 pelo numero de slots!
#endif
Reply
#7

Nгo й apenas mais facil como й melhor e mais otimizado do que GetMaxPlayers. Como jб disse, GetMaxPlayers requer que o servidor chame uma funзгo ao executar o loop, fazendo com que ele demore um pouco mais, so que ninguem nota uma diferenзa de poucos milissegundos. Ainda assim o melhor a fazer й o que o Sub_Zero falou acima:

pawn Код:
#undef MAX_PLAYERS
#define MAX_PLAYERS 50 //troque pelo numero de slots
Reply
#8

Assim й o melhor de Todos,inclusive compete com Foreach:

pawn Код:
#define MAX_LP_FoReX (500)

#define FoReX(%0,%1) for(new %1 = 0, %0 = 0; Players[%1] != -1; (%0) = Players[%1], ++%1)

new Players[MAX_LP_FoReX];
new CountArray=0;
new criados=-1;

stock AddPlayer(pids)
{
    criados++;
    Players[ criados ]=pids;
    Players[ criados+1 ]=-1;
    return true;
}


stock MoveInt(index)
{
    for(new i=index;i<sizeof(Players);i++) {
        if(Players[ i ] != 0) {
            Players[ i ] = Players[i+1];
        }
    }
    return true;
}

stock ClearPlayers()
{
    for(new i=-1;i<sizeof(Players);i++){
    Players[i]=0;
    }
    return true;
}

stock DelPlayer(pids)
{
    criados--;
    for(new i = 0; i < sizeof Players; ++i) {
        if(Players[ i ] == pids) {
            Players[ i ] = Players[ i+1 ];
            if(Players[ i+1 ] != 0) MoveInt(i);
        }
    }
    return true;
}
Mude
MAX_LP_FoReX para o Nъmero de Players do server.

Ele й um Foreach /\ й uma simples lista encadeada,que na qual percorre internamente na array.

Explicando
Como todo Foreach ele percorre os itens internos de uma Array,assim ele nгo se farб como loop de executar 500x e sim simplesmente executarб 1x internamente na Array,assim tornando cуdigo mais simples de interpretar e ler.
Resumidamente ele faz uma operaзгo interna na array.
Assim nгo ocorre o OBOE
Leia melhor aqui
http://en.wikipedia.org/wiki/Foreach

#Resultados
1: Resultado
[08:46:13] FoReX 0
[08:46:13] Loop Normal 39
[08:46:13] Foreach 0

2: Resultado:
[08:28:38] FoReX 1049683
[08:28:38] Foreach 1049709

Sгo muitos pequenos a diferenзa,falei com ****** a um tempгo atrбs,ele disse que os dois sгo equivalentes.

Cуdigo
Criado por DraKiNs
Agradecimentos a Toribio e ******

Nota:
Use com cuidado,й versгo Beta.

pawn Код:
FoReX(i,d)
{
    SetPlayerHealth(i,1000.0);
}
Enquanto sua dъvida:
GetMaxPlayer causarб muitas verificaзхes,tornando cуdigo mais lento.
Use FoReX ou Foreach,ou FoReAchPlayer
Reply
#9

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Assim й o melhor de Todos,inclusive compete com Foreach:

pawn Код:
#define MAX_LP_FoReX (500)

#define FoReX(%0,%1) for(new %1 = 0, %0 = 0; Players[%1] != -1; (%0) = Players[%1], ++%1)

new Players[MAX_LP_FoReX];
new CountArray=0;
new criados=-1;

stock AddPlayer(pids)
{
    criados++;
    Players[ criados ]=pids;
    Players[ criados+1 ]=-1;
    return true;
}


stock MoveInt(index)
{
    for(new i=index;i<sizeof(Players);i++) {
        if(Players[ i ] != 0) {
            Players[ i ] = Players[i+1];
        }
    }
    return true;
}

stock ClearPlayers()
{
    for(new i=-1;i<sizeof(Players);i++){
    Players[i]=0;
    }
    return true;
}

stock DelPlayer(pids)
{
    criados--;
    for(new i = 0; i < sizeof Players; ++i) {
        if(Players[ i ] == pids) {
            Players[ i ] = Players[ i+1 ];
            if(Players[ i+1 ] != 0) MoveInt(i);
        }
    }
    return true;
}
Mude
MAX_LP_FoReX para o Nъmero de Players do server.

Ele й um Foreach /\ й uma simples lista encadeada,que na qual percorre internamente na array.

Explicando
Como todo Foreach ele percorre os itens internos de uma Array,assim ele nгo se farб como loop de executar 500x e sim simplesmente executarб 1x internamente na Array,assim tornando cуdigo mais simples de interpretar e ler.
Resumidamente ele faz uma operaзгo interna na array.
Assim nгo ocorre o OBOE
Leia melhor aqui
http://en.wikipedia.org/wiki/Foreach

#Resultados
1: Resultado
[08:46:13] FoReX 0
[08:46:13] Loop Normal 39
[08:46:13] Foreach 0

2: Resultado:
[08:28:38] FoReX 1049683
[08:28:38] Foreach 1049709

Sгo muitos pequenos a diferenзa,falei com ****** a um tempгo atrбs,ele disse que os dois sгo equivalentes.

Cуdigo
Criado por DraKiNs
Agradecimentos a Toribio e ******

Nota:
Use com cuidado,й versгo Beta.

pawn Код:
FoReX(i,d)
{
    SetPlayerHealth(i,1000.0);
}
Enquanto sua dъvida:
GetMaxPlayer causarб muitas verificaзхes,tornando cуdigo mais lento.
Use FoReX ou Foreach,ou FoReAchPlayer
Legal, isso no caso й uma Include ? e eu teria que modificar todos os MAX_PLAYERS do meu Gamemode para FoReX ?
TY
Reply
#10

Aqui Atualizei,talvez brevemente eu lance oficialmente:

pawn Код:
#include <a_samp>
#define iMaxPlayers (500)

#define FoReX(%0) for(new %0 = 0; zPlayers[iCount] != -1; (iCount) = zPlayers[iCount], ++iCount)

static
    zPlayers[iMaxPlayers],
    iCount = 0,
    zInterators = -1
;

public OnPlayerConnect(playerid)
{
    zInterators++;
    zPlayers[ (zInterators)] = playerid;
    zPlayers[ (zInterators + 1) ]= -1;
    return true;
}

public OnPlayerDisconnect(playerid,reason)
{
    zInterators --;
    for( new i = 0; i < sizeof zPlayers; ++i )
    {
        if( zPlayers[ i ] == playerid )
        {
            zPlayers[ i ] = zPlayers[ ( i + 1 ) ];
            if( zPlayers[ (i + 1) ] != 0 )
                for( new a = i; a < sizeof(zPlayers); a++ )
                    if( zPlayers[ a ] != 0 )
                        zPlayers[ a ] = zPlayers[ ( a + 1 ) ];
          }
    }
    return true;
}
Depois basta usar:

pawn Код:
FoReX(i)
{
     printf("O ID %d й Gay",i);
}
Basta mudar o (500) caso quiser otimizar ainda mais,isto й,mudar 500 para seus Slots!
Nota: Isto й o GMADDON.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)