Sobre otimizaзгo -
pWesley - 06.06.2016
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.
Re: Sobre otimizaзгo -
Ermanhaut - 06.06.2016
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".
Re: Sobre otimizaзгo -
F1N4L - 06.06.2016
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.
Re: Sobre otimizaзгo -
ZEDD666 - 06.06.2016
Quase todos os servidores que trabalhei sempre fiz em uma string global com valor de [300] nunca tive nenhum problema com isso
Re: Sobre otimizaзгo -
zSuYaNw - 06.06.2016
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!
Respuesta: Sobre otimizaзгo -
OverKiller - 06.06.2016
Acho que as locais sгo mais leves man, e fica mais organizado.
Re: Sobre otimizaзгo -
pWesley - 06.06.2016
Entendi. No caso aqui eu preciso me organizar com relaзгo ao tamanho da variбvel global. Obrigado pelas respostas.
Re: Sobre otimizaзгo -
zSuYaNw - 06.06.2016
Quote:
Originally Posted by OverKiller
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!
Re: Sobre otimizaзгo -
zPain - 06.06.2016
Quote:
Originally Posted by zSuYaNw
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(playerid, gString, 24);
printf("Nome: %s", gString);
GetPlayerIp(playerid, gString, 16);
printf("IP: %s", gString);
return 1;
}
Saнda:
Quote:
String inicial
Nome: zPain
IP: 127.0.0.1
|
Re: Sobre otimizaзгo -
zSuYaNw - 06.06.2016
Quote:
Originally Posted by zPain
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:
Saнda:
|
Realmente, fiz um pequeno equнvoco pelo fato de nгo testar o cуdigo. Obrigado pela correзгo
Re: Sobre otimizaзгo -
pWesley - 06.06.2016
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).
Re: Sobre otimizaзгo -
zSuYaNw - 06.06.2016
Quote:
Originally Posted by pWesley
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
Re: Sobre otimizaзгo -
pWesley - 06.06.2016
Quote:
Originally Posted by zSuYaNw
|
Obrigado. Se puder, tem como me auxiliar nesse problema?
https://sampforum.blast.hk/showthread.php?tid=608942