[Ajuda] Sobre otimizaзгo
#1

Queria que alguйm me respondesse uma pergunta. Se eu definir uma string global para poder formatar diversos textos, farб com que meu gamemode fique mais lento e prejudique a jogabilidade?

Por exemplo, eu tenho a variбvel global new String[128];

Aн eu uso ela em OnPlayerConnected, OnPlayerRequestSpawn, OnPlayerDeath ... queria saber se isso de algum modo poderia influenciar em perda de desempenho do servidor, para saber se ela farб mъltiplas leituras usando apenas uma variбvel de formataзгo.
Reply
#2

Vocк sу formatar seu texto й muito mais rбpido e prбtico do que declarar e depois formatar.
Eu faзo isso desde que comecei a programar e sу vejo vantagens.

Nгo vai interferir em outras callbacks porque vocк vai formatar a string e usar ela logo apуs.
Depois outra callback formatarб e usarб, sem prejudicar a outra e assim por diante.
Lembre-se que raros sгo os casos em que vocк chama mъltiplas callbacks ao mesmo tempo, entгo tente definir umas trкs strings globais e usa-as "aleatoriamente".
Reply
#3

A questгo nгo й interferкncia, claro que nгo, vc sу deve ter em mente que vai ocupar mais memуria, pois, ela nunca serб destruнda, diferente da local.
Reply
#4

Quase todos os servidores que trabalhei sempre fiz em uma string global com valor de [300] nunca tive nenhum problema com isso
Reply
#5

O SAMP Trabalha com um processamento para todas as as funзхes (one thread) veja um exemplo:

pawn Code:
SetPlayerHealth(playerid, 123); // quando essa funзгo terminar a prуxima й chamda
gPlayerHealth[playerod] = 123); // quando essa funзгo terminarб chamarб a prуxima

for(new i; i != 5000; ++i) printf(#); // quando o loop terminar, a prуxima funзгo й chamada.
apуs o servidor modificar a vida do jogador com a funзгo SetPlayerHealth, ela irб chamar a prуxima variбvel gPlayerHealth, quando ela terminar de ser modificada, chamarб a prуxima o demorado loop.


Quando se utiliza uma variбvel/array global, vocк pode usar a "lуgica de programaзгo", veja:

Lembrando que temos a array "new string[30];"

pawn Code:
format(string, 128, "Hello World");
print(string);

format(string, 128, "Olб mundo");
print(string);

format(string, 128, "Estamos em 2016");
print(string);
Agora vamos entender:

pawn Code:
// vamos formatar a string colocando "Helo World"
format(string, 128, "Hello World");
// exibimos noconsole.
print(string);


format(string, 128, "asdiuhaskjdnaksgdkayusgdkashg");
// ----> Esse momento, a string jб foi modificada e jб foi exibida! Pensando na lуgica, podemos fazer oque quisermos com a string e no console ainda exibirб "Hello World"
pawn Code:
format(string, 128, "Hello World");
print(string);

format(string, 128, "Olб mundo");
format(string, 128, "Estamos em 2016");

Nota-se que se vocк executar esse cуdigo, sу serб exibido "Hello World", e "Olб mundo" e "Estamos em 2016" nгo irб fazer diferenзa.

Mas se vocк usar assim, irб dar problema..


Imaginamos que vocк use a string em uma callback ou funзгo assim:
pawn Code:
GetPlayerName(playerid, string, 24); // armazenamos o nome do jogador na string
printf("Nome do jogador й: %s", string);
Saida: Nome do jogador й: zSuYaNW

Aн, vocк irб usar novamente a array string em OUTRA callback/funзгo:
pawn Code:
GetPlayerIp(playerid, string, 16);
printf("Ip do jogador й %s", string);
Saida: Nome do jogador й: zSuYaNWIp do jogador й 192.168.0.1

Este fenфmeno acontece porque vocк utilizou a string e nгo limpou ela apуs a utilizaзгo.


Bom projecto!
Reply
#6

Acho que as locais sгo mais leves man, e fica mais organizado.
Reply
#7

Entendi. No caso aqui eu preciso me organizar com relaзгo ao tamanho da variбvel global. Obrigado pelas respostas.
Reply
#8

Quote:
Originally Posted by OverKiller
View Post
Acho que as locais sгo mais leves man, e fica mais organizado.
Й Relativo, se souber utilizar as variбveis globais serгo mais bem vindas. As locais й um caso complicado de se trabalhar, pois toda vez que vocк cria uma variбvel local em uma funзгo por exemplo, ela permanece lб.. nгo й deletada. porйm quando criamos uma variбvel dinвmica ela й deletada ao fim do escopo.

Neste exemplo abaixo estou criando uma variбvel simples, exemplificando oque geralmente eu encontro em alguns scripts.
PHP Code:
stock func(){
    new var;
    
    
printf("Antes: %d", var);
    
    var = 
20;
    
    
printf("depois %d", var);
    return 
1;

Logo que esse comando for finalizado, a variбvel var serб deletada. Entгo toda vez que chamares a funзгo a variбvel var serб criada.

Saida:
Code:
Antes: 0
depois: 20
-


Agora vou criar uma variбvel dinвmica:
PHP Code:
stock func(){
    static var;
    
    
printf("Antes: %d", var);
    
    var += 
10;
    
    
printf("depois %d", var);
    return 
1;

Se vocк compilar este exemplo, perceberб que algo estarб diferente. A Variбvel dinвmica var, nгo serб deletada! Isso mesmo ela nгo serб deletada ao fim do escopo! Assim nгo criando uma nova e permanecendo o valor antigo.

Saida:
Code:
Antes: 20
depois: 30



Bons estudos!
Reply
#9

Quote:
Originally Posted by zSuYaNw
View Post
Mas se vocк usar assim, irб dar problema..


Imaginamos que vocк use a string em uma callback ou funзгo assim:
pawn Code:
GetPlayerName(playerid, string, 24); // armazenamos o nome do jogador na string
printf("Nome do jogador й: %s", string);
Saida: Nome do jogador й: zSuYaNW

Aн, vocк irб usar novamente a array string em OUTRA callback/funзгo:
pawn Code:
GetPlayerIp(playerid, string, 16);
printf("Ip do jogador й %s", string);
Saida: Nome do jogador й: zSuYaNWIp do jogador й 192.168.0.1

Este fenфmeno acontece porque vocк utilizou a string e nгo limpou ela apуs a utilizaзгo.
zSuYaNw, a limpeza em strings globais (ou estбticas locais) deve ser feita antes do uso de funзхes que modificam as mesmas, como strmid e strcat (especialmente strcat).

Eu entendi seu exemplo, mas houve um equнvoco da sua parte ao escolher GetPlayerName e GetPlayerIp, visto que essas funзхes jб fazem a limpeza da string antes de passar o retorno. Veja:

PHP Code:
new gString[128];
public 
OnGameModeInit()
{
    
gString "String inicial";
    return 
1;
}
public 
OnPlayerConnect(playerid)
{
    print(
gString);
    
GetPlayerName(playeridgString24);
    
printf("Nome: %s"gString);
    
GetPlayerIp(playeridgString16);
    
printf("IP: %s"gString);
    return 
1;

Saнda:
Quote:

String inicial
Nome: zPain
IP: 127.0.0.1

Reply
#10

Quote:
Originally Posted by zPain
View Post
zSuYaNw, a limpeza em strings globais (ou estбticas locais) deve ser feita antes do uso de funзхes que modificam as mesmas, como strmid e strcat (especialmente strcat).

Eu entendi seu exemplo, mas houve um equнvoco da sua parte ao escolher GetPlayerName e GetPlayerIp, visto que essas funзхes jб fazem a limpeza da string antes de passar o retorno. Veja:

PHP Code:
 ... 
Saнda:

Realmente, fiz um pequeno equнvoco pelo fato de nгo testar o cуdigo. Obrigado pela correзгo
Reply
#11

Mas no caso de ser apenas formataзгo de texto, no caso SendClientMessage, a string global irб ser direcionada para ela e depois zerarб?

@zSuYaNw: Teria como me dar uma ajuda e conselhos para melhor otimizar minha gamemode? Como por exemplo no uso de timers, variбveis utilizando [0] = EOS (dialogs).
Reply
#12

Quote:
Originally Posted by pWesley
View Post
Mas no caso de ser apenas formataзгo de texto, no caso SendClientMessage, a string global irб ser direcionada para ela e depois zerarб?
A funзгo format jб limpa a array.


Quote:

@zSuYaNw: Teria como me dar uma ajuda e conselhos para melhor otimizar minha gamemode? Como por exemplo no uso de timers, variбveis utilizando [0] = EOS (dialogs).

Tem alguns tutoriais:

- Pequenas otimizaзхes: https://sampforum.blast.hk/showthread.php?tid=208427
- Dicas e Truques: https://sampforum.blast.hk/showthread.php?tid=365996
Reply
#13

Quote:
Originally Posted by zSuYaNw
View Post
Obrigado. Se puder, tem como me auxiliar nesse problema? https://sampforum.blast.hk/showthread.php?tid=608942
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)