[Ajuda] Travamento com loop
#1

Boa noite!

Estou com um problema em um comando que estou a desenvolver para veнculos...
O que ocorre й que a define tem um mбximo de 250 veнculos, com isso, o loop busca em todas elas, assim, causando um delay durante essa procura.

Minha dъvida й se tem como amenizar isto, pois fica entre 10 segundos travado enquanto estб fazendo a verificaзгo.

Код:
#define MAX_VEICULOS 250

for(new i; i < MAX_VEICULOS; i++)
{
         format(fCarro, sizeof(fCarro), "Veiculos/%i.ini", i);
   	 if(DOF2_GetBool(fCarro, "Trancado") == true)
	 {
	     SCM(playerid, -1, "Macarena");
	 }
}
Grato desde jб!
Reply
#2

Quote:
Originally Posted by Ley
Посмотреть сообщение
Boa noite!

Estou com um problema em um comando que estou a desenvolver para veнculos...
O que ocorre й que a define tem um mбximo de 250 veнculos, com isso, o loop busca em todas elas, assim, causando um delay durante essa procura.

Minha dъvida й se tem como amenizar isto, pois fica entre 10 segundos travado enquanto estб fazendo a verificaзгo.

Код:
#define MAX_VEICULOS 250

for(new i; i < MAX_VEICULOS; i++)
{
         format(fCarro, sizeof(fCarro), "Veiculos/%i.ini", i);
   	 if(DOF2_GetBool(fCarro, "Trancado") == true)
	 {
	     SCM(playerid, -1, "Macarena");
	 }
}
Grato desde jб!
Toda funзгo causa um Delay, umas com um pequeno intervalo de tempo e outras com um grande intervalo de tempo.
Essa DOF2_GetBool й uma das que causa um bom delay. Para evitar usar ela em um looping (causando a leitura dessa funзгo 250 vezes, o que nгo й muito legal), vocк poderб utilizar uma variбvel onde vai armazenar essa informaзгo.
Por exemplo, toda vez que um veнculo for trancado, vocк pode utilizar:
Код:
vTrancado[vehicleid] = true;
Assim, em vez de utilizar esse seu cуdigo atual, vocк pode utilizar o seguinte:
Код:
for(new i; i <= GetVehiclePoolSize(); i++)
{
   	 if(vTrancado[i])
	 {
	     SCM(playerid, -1, "Macarena");
	 }
}
Espero que tenha entendido o cуdigo
Se hб dъvidas quanto а funзгo GetVehiclePoolSize (https://sampwiki.blast.hk/wiki/GetVehiclePoolSize), basicamente ela retorna o maior ID do veнculo conectado, o que otimiza o cуdigo para que ao invйs de fazer um looping de 250, dos quais alguns IDs de veнculo talvez nem tenha sido criados, o GetVehiclePoolSize vai retornar o ъltimo ID do veнculo conectado.

Outra soluзгo que vocк poderia utilizar (mas que nгo recomendo) seria continuar com aquele seu cуdigo e no inнcio do looping (antes do format), vocк colocaria a condicional
Код:
if(!IsValidVehicle(i)) continue;
Isso faria com que, se o veнculo nгo existisse, ele nгo prosseguiria com o cуdigo e pularia para o prуximo ID de veнculo, dando prosseguimento ao looping.

Caso tenha restado alguma dъvida, envie-me uma MP.
Reply
#3

Quote:
Originally Posted by JohnBlack
Посмотреть сообщение
Toda funзгo causa um Delay, umas com um pequeno intervalo de tempo e outras com um grande intervalo de tempo.
Essa DOF2_GetBool й uma das que causa um bom delay. Para evitar usar ela em um looping (causando a leitura dessa funзгo 250 vezes, o que nгo й muito legal), vocк poderб utilizar uma variбvel onde vai armazenar essa informaзгo.
Por exemplo, toda vez que um veнculo for trancado, vocк pode utilizar:
Код:
vTrancado[vehicleid] = true;
Assim, em vez de utilizar esse seu cуdigo atual, vocк pode utilizar o seguinte:
Код:
for(new i; i <= GetVehiclePoolSize(); i++)
{
   	 if(vTrancado[i])
	 {
	     SCM(playerid, -1, "Macarena");
	 }
}
Espero que tenha entendido o cуdigo
Se hб dъvidas quanto а funзгo GetVehiclePoolSize (https://sampwiki.blast.hk/wiki/GetVehiclePoolSize), basicamente ela retorna o maior ID do veнculo conectado, o que otimiza o cуdigo para que ao invйs de fazer um looping de 250, dos quais alguns IDs de veнculo talvez nem tenha sido criados, o GetVehiclePoolSize vai retornar o ъltimo ID do veнculo conectado.

Outra soluзгo que vocк poderia utilizar (mas que nгo recomendo) seria continuar com aquele seu cуdigo e no inнcio do looping (antes do format), vocк colocaria a condicional
Код:
if(!IsValidVehicle(i)) continue;
Isso faria com que, se o veнculo nгo existisse, ele nгo prosseguiria com o cуdigo e pularia para o prуximo ID de veнculo, dando prosseguimento ao looping.

Caso tenha restado alguma dъvida, envie-me uma MP.
Exato. Independente do sistema de salvamento, o certo й utilizar variбveis para se ter um mecanismo de aзгo mais бgil.

John, sу se esqueceu de um detalhe no seu loop, o id de veнculos inicia em 1, logo, new i = 1.

Alйm do que ele colocou, podes otimizar mais esse cуdigo definindo as strings. Irб diminuir um bom consumo, pois nгo serб necessбrio alocar memуria toda vez que o loop executar o escopo.

PHP код:
#define MAX_VEICULOS 250
#define vehicle_file "Veiculos/%i.ini"
#define key_vehicle_locked "Trancado"
for(new iMAX_VEICULOSi++)
{
         
format(fCarrosizeof(fCarro), vehicle_filei);
        if(
DOF2_GetBool(fCarrokey_vehicle_locked))
     {
         
SCM(playerid, -1"Macarena");
     }

Reply
#4

Quote:
Originally Posted by Mises
Посмотреть сообщение
Exato. Independente do sistema de salvamento, o certo й utilizar variбveis para se ter um mecanismo de aзгo mais бgil.

John, sу se esqueceu de um detalhe no seu loop, o id de veнculos inicia em 1, logo, new i = 1.

Alйm do que ele colocou, podes otimizar mais esse cуdigo definindo as strings. Irб diminuir um bom consumo, pois nгo serб necessбrio alocar memуria toda vez que o loop executar o escopo.

PHP код:
#define MAX_VEICULOS 250
#define vehicle_file "Veiculos/%i.ini"
#define key_vehicle_locked "Trancado"
for(new iMAX_VEICULOSi++)
{
         
format(fCarrosizeof(fCarro), vehicle_filei);
        if(
DOF2_GetBool(fCarrokey_vehicle_locked))
     {
         
SCM(playerid, -1"Macarena");
     }

Muito bem ao relembrar que os IDs dos veнculos comeзam em 1. Realmente, o cуdigo ficaria alguns microssegundos mais eficiente (nгo desmerecendo).
Quanto aos #define’s devo discordar, amigo
Nгo vejo porque “deixaria de alocar memуria”, sendo que as strings ao final das contas sгo as mesmas, afinal defines sгo maneiras mais fбceis de escrever algo (ignorando funзхes mais complexas, que nгo cabem aqui)
Como #define SCM SendClientMessage
Utilizar sempre SCM ao invйs de SendClientMessage alocarб a mesma quantia de memуria.
Algo que poderia sim otimizar o cуdigo e que ainda nгo disse seria estabelecer um nъmero mнnimo de cйlulas no momento em que se declara a variбvel ‘fCarro’ (que seria new fCarro[19])
Por ъltimo, nгo entendi porque escreveu esse cуdigo final jб que й discordante com quase tudo que foi dito e inclusive vocк concordou kk
Espero ter ajudado, qualquer dъvida envie-me uma MP!
Agradeзo a compreensгo, espero que nгo tenham me mal entendido
Reply
#5

Quote:
Originally Posted by JohnBlack
Посмотреть сообщение
Muito bem ao relembrar que os IDs dos veнculos comeзam em 1. Realmente, o cуdigo ficaria alguns microssegundos mais eficiente (nгo desmerecendo).
Quanto aos #define’s devo discordar, amigo
Nгo vejo porque “deixaria de alocar memуria”, sendo que as strings ao final das contas sгo as mesmas, afinal defines sгo maneiras mais fбceis de escrever algo (ignorando funзхes mais complexas, que nгo cabem aqui)
Como #define SCM SendClientMessage
Utilizar sempre SCM ao invйs de SendClientMessage alocarб a mesma quantia de memуria.
Algo que poderia sim otimizar o cуdigo e que ainda nгo disse seria estabelecer um nъmero mнnimo de cйlulas no momento em que se declara a variбvel ‘fCarro’ (que seria new fCarro[19])
Por ъltimo, nгo entendi porque escreveu esse cуdigo final jб que й discordante com quase tudo que foi dito e inclusive vocк concordou kk
Espero ter ajudado, qualquer dъvida envie-me uma MP!
Agradeзo a compreensгo, espero que nгo tenham me mal entendido
Apontei esse cуdigo para otimizar o carregamento dos arquivos nas variбveis caso o autor se dispuser a fazer.

E na verdade, sim, deixa de alocar memуria. Ao definir uma string pela keyword define, vocк estб fazendo a mesma coisa que declarar uma constante, a diferenзa й que a constante nгo possui diretivas que possibilitam redefini-la.

Entretanto, ao executar um cуdigo repentino, como mandar a mesma mensagem em uma funзгo que й chamada constantemente, hб diferenзas entre declarar uma cadeia de caracteres nessa funзгo - que irб alocar espaзo na memуria, o que nгo й o problema, e sim o tempo de alocaзгo - e utilizar uma cadeia jб declarada, pois ela nгo precisarб ser alocada novamente, apenas serб lida.

Abзs.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)