[Ajuda] Loops mais leves
#1

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?
Reply
#2

Foreach da include y_iterate da YSI ajuda muito
Reply
#3

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!
Reply
#4

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.
Reply
#5

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.
Reply
#6

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)
{
    

Reply
#7

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....
Reply
#8

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++) 
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)