SA-MP Forums Archive
[Ajuda] Loops mais leves - 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: Português/Portuguese (https://sampforum.blast.hk/forumdisplay.php?fid=34)
+---- Thread: [Ajuda] Loops mais leves (/showthread.php?tid=643256)



Loops mais leves - gmstrikker - 16.10.2017

Eu tenho um timer de 1 segundo que tem varias funзхes para todos os players e lб varias coisas acontecem para todos os players

PHP код:
SetTimer("AtualizarPlayerALL"1000,1);
forward AtualizarPlayerALL(); public AtualizarPlayerALL() {
    for(new 
0MAX_PLAYERSi++) {
        
// funcs
    
}

Qual seria a melhor forma de deixar essa funзгo mais leve?
PHP код:
forward AtualizarPlayerALL(); public AtualizarPlayerALL() {
    for(new 
0MAX_PLAYERSi++) {
        if(
IsPlayerConnected(i)) {
            
// funcs
        
}
    }

ou

PHP код:
forward AtualizarPlayerALL(); public AtualizarPlayerALL() {
    for(new 
0MAX_PLAYERSi++) {
        if(
!= INVALID_PLAYER_ID) {
            
// funcs
        
}
    }

Ou tem algum jeito melhor?


Re: Loops mais leves - PT - 16.10.2017

Foreach da include y_iterate da YSI ajuda muito


Re: Loops mais leves - De4gle - 16.10.2017

Como o PT disse, utilize foreach > clique aqui!

O looping ficarб assim:

Quote:

foreach(new i : Player)
{

}

Ele irб passar apenas pelos players online, sendo o mais rбpido!


Re: Loops mais leves - binnyl - 17.10.2017

Por que essa foreach й tгo melhor assim?
Tem outros parametros como veiculos?
Pesquisando na net eu achei outras alйm da do Kar, a dele й a melhor?

E em casos especificos como esse:
while(i < MAX_PLAYERS && targetid == -1) {

Alguйm sabe me dizer como fazer funзхes como essa para fazer loops especificos para meu servidor?
Tipo:
PHP код:
LoopHouses() {
    for(new 
houseid 1houseid MAX_HOUSEShouseid++) {
        if(
HouseInfo[houseid][hType] == 0) {
            
entranafunc
        
}    
    }

Pra substituir somente
for(new houseid = 1; houseid < MAX_HOUSES; houseid++) {


Pq o MAX_HOUSES em meu servidor й 2000 por exemplo, mas sу tem 1000 casas, pq as casas sгo criadas pelos ADMs ingame entao eu deixo um valor aproximado e folgado.


Re: Loops mais leves - C4rtm4n - 17.10.2017

Quote:
Originally Posted by binnyl
Посмотреть сообщение
Por que essa foreach й tгo melhor assim?
Tem outros parametros como veiculos?
Pesquisando na net eu achei outras alйm da do Kar, a dele й a melhor?

E em casos especificos como esse:
while(i < MAX_PLAYERS && targetid == -1) {

Alguйm sabe me dizer como fazer funзхes como essa para fazer loops especificos para meu servidor?
Tipo:
PHP код:
LoopHouses() {
    for(new 
houseid 1houseid MAX_HOUSEShouseid++) {
        if(
HouseInfo[houseid][hType] == 0) {
            
entranafunc
        
}    
    }

Pra substituir somente
for(new houseid = 1; houseid < MAX_HOUSES; houseid++) {


Pq o MAX_HOUSES em meu servidor й 2000 por exemplo, mas sу tem 1000 casas, pq as casas sгo criadas pelos ADMs ingame entao eu deixo um valor aproximado e folgado.
Os looping normal vai percorrer o limite de players sendo assim se tiver 10 players ele vai percorrer durante 1000

Jб o foreach vai percorrer sу pros 10.


Re: Loops mais leves - Dayvison_ - 17.10.2017

Quote:
Originally Posted by binnyl
Посмотреть сообщение
Por que essa foreach й tгo melhor assim?
Tem outros parametros como veiculos?
Pesquisando na net eu achei outras alйm da do Kar, a dele й a melhor?
Depende das funзхes que vocк necessita, no seu caso que nem conhece a "versгo do kar" seria suficiente.

foreach percorre apenas нndices existentes, entгo quando existem muitos нndices nгo existentes se torna melhor

Quote:
Originally Posted by binnyl
Посмотреть сообщение
E em casos especificos como esse:
Alguйm sabe me dizer como fazer funзхes como essa para fazer loops especificos para meu servidor?
Tipo:
PHP код:
LoopHouses() {
    for(new 
houseid 1houseid MAX_HOUSEShouseid++) {
        if(
HouseInfo[houseid][hType] == 0) {
            
entranafunc
        
}    
    }

Pra substituir somente
for(new houseid = 1; houseid < MAX_HOUSES; houseid++) {


Pq o MAX_HOUSES em meu servidor й 2000 por exemplo, mas sу tem 1000 casas, pq as casas sгo criadas pelos ADMs ingame entao eu deixo um valor aproximado e folgado.
Usa macro neste caso
Код:
#define LoopHouses(%0) for(new %0 = 1; %0 < MAX_HOUSES; ++%0) if(HouseInfo[%0][hType] == 0)
foreach version:

PHP код:
// global
new Iterator:Houses<MAX_HOUSES>;
// on create house
Iter_Add(Houseshouseid);
// on delete house
Iter_Remove(Houseshouseid);
// loop
foreach(new houseidHouses)
{
    




Re: Loops mais leves - binnyl - 20.10.2017

Quote:
Originally Posted by Dayvison_
Посмотреть сообщение
Depende das funзхes que vocк necessita, no seu caso que nem conhece a "versгo do kar" seria suficiente.

foreach percorre apenas нndices existentes, entгo quando existem muitos нndices nгo existentes se torna melhor


Usa macro neste caso
Код:
#define LoopHouses(%0) for(new %0 = 1; %0 < MAX_HOUSES; ++%0) if(HouseInfo[%0][hType] == 0)
foreach version:

PHP код:
// global
new Iterator:Houses<MAX_HOUSES>;
// on create house
Iter_Add(Houseshouseid);
// on delete house
Iter_Remove(Houseshouseid);
// loop
foreach(new houseidHouses)
{
    

Teria algum jeito de fazer esse macro pra rodar na estrutura do for normal?
Tipo
PHP код:
for_houses(new houseid 1houseid MAX_HOUSEShouseid++) { 
Aн jб entrar embutido a comparaзгo?

a foreach version eu nгo entendi, foi mal....


Re: Loops mais leves - Bruno13 - 20.10.2017

Sem utilizar aplicaзхes externas, podes usar a prуpria funзгo do sa-mp 0.3.7 para obter o menor ID de jogador online, o que jб й um grande salto.

PHP код:
new players GetPlayerPoolSize(),
    
i;
for(
0<= playersi++)