01.01.2017, 15:15
(
Последний раз редактировалось RiqueP; 10.08.2017 в 20:37.
)
♥ 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.
- 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];
(lista do tуpico oficial)1-Bit2-Bit4-Bit8-Bit16-BitLimit 1 ─ 0x1 3 ─ 0x3 15 ─ 0xF 255 ─ 0xFF 65535 ─ 0xFFFF
A lista a cima mostra os tamanhos que podemos utilizar e irei explicar como vocк pode usar esses valores.
- 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>
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;
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, 0, 1); // Alterou o valor do slot 0 da variбvel 'Array' para 1
Bit2_Set(Array, 1, 2); // Alterou o valor do slot 1 da variбvel 'Array' para 2
Bit2_Set(Array, 2, 3); // Alterou o valor do slot 2 da variбvel 'Array' para 3
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, 0, 1); // Alterou o valor do slot 0 da variбvel 'Array' para 1
Bit2_Set(Array, 1, 2); // Alterou o valor do slot 1 da variбvel 'Array' para 2
Bit2_Set(Array, 2, 3); // 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
PHP код:new Bit8:Array<1>;
Bit8_Set(Array, 0, 21);
- 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(Spawno, playerid, 0); // Setei a variбvel de para 0 (false) pq ele ainda nгo fez spawn
return 1;
}
public OnPlayerSpawn(playerid)
{
Bit1_Set(Spawno, playerid, 1); // Setei a variбvel de para 1 (true) pq ele fez o spawn
return 1;
}
PHP код:// Normalmente (gastando mais memуria)
#include <a_samp>
new Veiculo[21];
public OnGameModeInit()
{
Veiculo[0] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
Veiculo[1] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
Veiculo[2] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
Veiculo[3] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
Veiculo[4] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
Veiculo[5] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
Veiculo[6] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
Veiculo[7] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
//...
Veiculo[20] = CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000);
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(Veiculo, 0, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
Bit16_Set(Veiculo, 1, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
Bit16_Set(Veiculo, 2, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
Bit16_Set(Veiculo, 3, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
Bit16_Set(Veiculo, 4, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
Bit16_Set(Veiculo, 5, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
Bit16_Set(Veiculo, 6, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
Bit16_Set(Veiculo, 7, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
//...
Bit16_Set(Veiculo, 20, CreateVehicle(596, 0.0, 0.0, 0.0, 0.0, 6, 6, 30000));
return 1;
}
-
♪ 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.