[Tutorial] Economizando memуria com rBits
#1

♥ Introduзгo
  • * Esse tutorial й destinado para quem jб possui conhecimentos bбsicos/intermediбrios em programaзгo.

    Em meus anos pelo SA-MP, jб vi diversos servidores com um problema grave de memуria. Esses servidores tinham um aumento exponencial de memуria RAM consumida quanto mais jogadores logavam. O problema era causado pq muitos desses gamemodes foram totalmente mal feitos e passados por muitas pessoas incapazes de fazer um cуdigo bem feito.

    Vocк pode economizar muita memуria se administra-la bem e rBits vai te ajudar nisso. Vocк nгo й obrigado economizar memуria, mas seria muito bom. Principalmente se o seu gamemode possuн um alto consumo de memуria.
♥ Quanto de memуria cada variбvel usa
  • Em outras linguagens de programaзгo, hб a possibilidade de vocк declarar certos tipos de variбveis que possuem tamanhos diferentes. Obviamente quanto mais curto o limite, menos memуria serб usada pelo computador.

    No pawn, cada variбvel declarada possuн 32bit (4 byte signed) de memуria e um tamanho de -2.147.483.648 a 2.147.483.647. Й um tamanho e tanto. Agora imagine que vocк estб declarando uma variavel bool. Uma variбvel bool utiliza apenas 2 valores, que sгo: true(1) ou false(0). Uma variбvel de 32bit seria totalmente desnecessбrio nesse e muitos outros casos. Olhem quanto espaзo tem ali vбzio que poderia ser bem economizado.

    Extendendo ainda mais o exemplo.
    PHP код:
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 100
    new bool:Spawn[MAX_PLAYERS]; 
    No cуdigo acima, й ainda mais memуria desperdiзada. Serб 32bit * 100 de memуria usada sendo que vocк nгo usa nem 1% da capacidade. Vocк vai armazenar apenas valores 0 e 1 de -2.147.483.648/2.147.483.647.
♥ Tamanhos
  • 1-Bit
    2-Bit
    4-Bit
    8-Bit
    16-Bit
    Limit1 ─ 0x13 ─ 0x315 ─ 0xF255 ─ 0xFF65535 ─ 0xFFFF
    (lista do tуpico oficial)

    A lista a cima mostra os tamanhos que podemos utilizar e irei explicar como vocк pode usar esses valores.
♥ rBits (link)
  • Vou procurar ser o mais claro possнvel sobre as funзхes, vou tentar explicar todas as funзхes essenciais para a administraзгo de sua memуria. Qualquer dъvida sera respondida, exceto perguntas extremamente idiotas.

    1° Incluindo: Antes de iniciar com o cуdigo, vocк deve baixar e importar o rBits ao seu projeto.
    PHP код:
    #include <rBits> 
    2° Declarando uma variбvel: As variбveis devem ser declaradas com prй-fixo 'Bit(tamanho de acordo com a tabela):' e devem possuir entre <> o tamanho da array. Exemplo: MAX_PLAYERS.
    PHP код:
    new Bit1:Variavel1<MAX_PLAYERS>; // variбvel de 1bit (Suporta o tamanho de 0 e 1)
    new Bit2:Variavel2<MAX_PLAYERS>; // variбvel de 2bit (Suporta o tamanho de atй 3)
    new Bit4:Variavel3<MAX_PLAYERS>; // variбvel de 4bit (Suporta o tamanho de atй 15)
    new Bit8:Variavel4<MAX_PLAYERS>; // variбvel de 8bit (Suporta o tamanho de atй 255)
    new Bit16:Variavel5<MAX_PLAYERS>; // variбvel de 16bit (Suporta o tamanho de atй 65535)
    // Para um tamanho maior, use a variбvel normalmente. Exemplo:
    new oi
    3є Alterando o valor: Essas variбveis possuem uma forma diferente para terem seus valores alterados. Uma variavel normal pode ter o valor dela setado usando o operador =. Mas essas variбveis usam a funзгo Bit(tamanho dessa array)_Set(Nome da Array, slot, valor);.
    PHP код:
    // Variбvel comum
    new Array[3]; // Declarei uma variбvel (padrгo: 32bit)
    Array[0] = 1// Alterou o valor do slot 0 da variбvel 'Array' para 1
    Array[1] = 2// Alterou o valor do slot 1 da variбvel 'Array' para 2
    Array[2] = 3// Alterou o valor do slot 2 da variбvel 'Array' para 3
    // Variбvel do rBits
    new Bit2:Array<3>; // Declarei uma variбvel de 3bit
    Bit2_Set(Array, 01); // Alterou o valor do slot 0 da variбvel 'Array' para 1
    Bit2_Set(Array, 12); // Alterou o valor do slot 1 da variбvel 'Array' para 2
    Bit2_Set(Array, 23); // Alterou o valor do slot 2 da variбvel 'Array' para 3 
    4є Extraindo o valor: Os valores dessas arrays tambйm sгo extraнdos de forma diferente das variбveis comuns. Sгo extraнdos atravйs da funзгo
    Bit(tamanho dessa array)_Get(Nome da Array, slot);
    PHP код:
    // Variбvel comum
    new Array[3]; // Declarei uma variбvel (padrгo: 32bit)
    Array[0] = 1// Alterou o valor do slot 0 da variбvel 'Array' para 1
    Array[1] = 2// Alterou o valor do slot 1 da variбvel 'Array' para 2
    Array[2] = 3// Alterou o valor do slot 2 da variбvel 'Array' para 3
    printf("%d", Array[0]); // Vai printar o valor 1 na tela
    printf("%d", Array[1]); // Vai printar o valor 2 na tela
    printf("%d", Array[2]); // Vai printar o valor 3 na tela
    // Variбvel do rBits
    new Bit2:Array<3>; // Declarei uma variбvel de 3bit
    Bit2_Set(Array, 01); // Alterou o valor do slot 0 da variбvel 'Array' para 1
    Bit2_Set(Array, 12); // Alterou o valor do slot 1 da variбvel 'Array' para 2
    Bit2_Set(Array, 23); // Alterou o valor do slot 2 da variбvel 'Array' para 3
    printf("%d"Bit2_Get(Array, 0)); // Vai printar o valor 1 na tela
    printf("%d"Bit2_Get(Array, 1)); // Vai printar o valor 2 na tela
    printf("%d"Bit2_Get(Array, 2)); // Vai printar o valor 3 na tela 
    Й bem comum que aconteзa de vocк usar um valor que nгo tem definido. Nesse caso, vocк deve usar a variбvel que chegue mais perto desse valor. Exemplo: "Quero armazenar o valor 21 em uma array, oque faзo ?"
    PHP код:
    new Bit8:Array<1>;
    Bit8_Set(Array, 021); 
    Usei 8bit pq й o valor minimo de bit que pode conter o valor 21. As arrays com bit menor nгo conseguem guardar o valor 21. Pode ver lб na tabela.
♥ Prбtica
  • Vou dar 2 exemplos de como usar rBits para que tudo fique mais claro.

    Ver se o jogador fez spawn:
    PHP код:
    // Normalmente (gastando mais memуria)
    #include <a_samp>
    new bool:Spawno[MAX_PLAYERS]; // Declarei a variбvel (padroгo 32bit)
    public OnPlayerConnect(playerid)
    {
        
    Spawno[playerid] = 0// Setei a variбvel do jogador para 0 (false) pq ele ainda nгo fez spawn
        
    return 1;
    }
    public 
    OnPlayerSpawn(playerid)
    {
        
    Spawno[playerid] = 1// Setei a variбvel do jogador para 1 (true) pq ele fez o spawn
        
    return 1;
    }
    // Com rBits (gastando menos memуria)
    #include <a_samp>
    #include <rBits>
    new Bit1:Spawno<MAX_PLAYERS>; // Usei 1bit pq ele armazena apenas valores de 0 e 1. Sгo exatamente os valores que preciso;
    public OnPlayerConnect(playerid)
    {
        
    Bit1_Set(Spawnoplayerid0); // Setei a variбvel de para 0 (false) pq ele ainda nгo fez spawn
        
    return 1;
    }
    public 
    OnPlayerSpawn(playerid)
    {
        
    Bit1_Set(Spawnoplayerid1); // Setei a variбvel de para 1 (true) pq ele fez o spawn
        
    return 1;

    Guardar o ID de veiculos na array:
    PHP код:
    // Normalmente (gastando mais memуria)
    #include <a_samp>
    new Veiculo[21];
    public 
    OnGameModeInit()
    {
        
    Veiculo[0] = CreateVehicle(5960.00.00.00.06630000);
        
    Veiculo[1] = CreateVehicle(5960.00.00.00.06630000);
        
    Veiculo[2] = CreateVehicle(5960.00.00.00.06630000);
        
    Veiculo[3] = CreateVehicle(5960.00.00.00.06630000);
        
    Veiculo[4] = CreateVehicle(5960.00.00.00.06630000);
        
    Veiculo[5] = CreateVehicle(5960.00.00.00.06630000);
        
    Veiculo[6] = CreateVehicle(5960.00.00.00.06630000);
        
    Veiculo[7] = CreateVehicle(5960.00.00.00.06630000);
        
    //...
        
    Veiculo[20] = CreateVehicle(5960.00.00.00.06630000);
        return 
    1;
    }
    // Com rBits (gastando menos memуria)
    #include <a_samp>
    #include <rBits>
    new Bit8:Veiculo<21>; // Declarei uma variбvel de 8bit pq й o valor minimo que suporta o nъmero 21
    public OnGameModeInit()
    {
        
    Bit16_Set(Veiculo0CreateVehicle(5960.00.00.00.06630000));
        
    Bit16_Set(Veiculo1CreateVehicle(5960.00.00.00.06630000));
        
    Bit16_Set(Veiculo2CreateVehicle(5960.00.00.00.06630000));
        
    Bit16_Set(Veiculo3CreateVehicle(5960.00.00.00.06630000));
        
    Bit16_Set(Veiculo4CreateVehicle(5960.00.00.00.06630000));
        
    Bit16_Set(Veiculo5CreateVehicle(5960.00.00.00.06630000));
        
    Bit16_Set(Veiculo6CreateVehicle(5960.00.00.00.06630000));
        
    Bit16_Set(Veiculo7CreateVehicle(5960.00.00.00.06630000));
        
    //...
        
    Bit16_Set(Veiculo20CreateVehicle(5960.00.00.00.06630000));
        return 
    1;

♥ Notas finais
  • ♪ Foi uma explicaзгo bem simples, mas procurei ser bem objetivo e claro.
    ♪ Nгo procurei escrever de forma muito formal e provavelmente haverб erros de escrita, mas os que forem reportados vou corrigir.
    ♪ Qualquer dъvida estarei respondendo
    ♪ Existem outras includes que vocк tambйm poderб economizar alguns bits de memуria, basta dar uma procuradinha pelo fуrum.

Reply
#2

Eu realmente nгo sei como tem gente que consegue ter problema de memуria no SA-MP mas ok
Reply
#3

Quote:
Originally Posted by CaioTJF
Посмотреть сообщение
Eu realmente nгo sei como tem gente que consegue ter problema de memуria no SA-MP mas ok
Pensei o mesmo.


Isso do y_bit, rbits, etc bits... Acho que so й bom em sistemas grandes que precisem mesmo de muita memoria...

Se nao acho desnecessario no sa-mp...
Reply
#4

Fala para vocк RiqueP, vocк deve ler mente, sу pode!
Fez dois tutorias, no assunto que eu queria muito aprender e sua maneira simples de explicar me deixa confortбvel para aprender mais rбpido. Parabйns mano!
Reply
#5

Quote:
Originally Posted by Glederson_dom
Посмотреть сообщение
Fala para vocк RiqueP, vocк deve ler mente, sу pode!
Fez dois tutorias, no assunto que eu queria muito aprender e sua maneira simples de explicar me deixa confortбvel para aprender mais rбpido. Parabйns mano!
Reply
#6

Muito bom!
Reply
#7

Quote:
Originally Posted by IlanZ
Посмотреть сообщение
Muito bom!
Obrigado

Quote:
Originally Posted by CaioTJF
Посмотреть сообщение
Eu realmente nгo sei como tem gente que consegue ter problema de memуria no SA-MP mas ok
Quote:
Originally Posted by PT
Посмотреть сообщение
Pensei o mesmo.


Isso do y_bit, rbits, etc bits... Acho que so й bom em sistemas grandes que precisem mesmo de muita memoria...

Se nao acho desnecessario no sa-mp...
Acho que se um cуdigo pode ficar mais econфmico ou melhorar de qualquer outra forma, mesmo que pouco. Deve ser melhorado.
Reply
#8

Mas й como eu disse, memуria no SA-MP й insignificante..
O que deve ser otimizado mesmo й o uso de CPU (loops, atualizaзхes a cada segundo, etc), isso sim tem que se preocupar.

Olha essa print aqui:
http://i.imgur.com/Kw9r7wN.png

O processo 978 usa apenas 2.3% de memуria com cerca de 300 players online.
Reply
#9

Muito ъtil! Jб dizia Tim Berners-Lee, "melhor que uma boa noite de sono й um sistema que economize memуria." Parabйns e sucesso no projeto.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)