Vienas kintamasis vietoje žaidėjų bool masyvo

Šiame forume galima rasti pamokas, patarimus, skriptus ir kitą naudingą informciją.
Post Reply
User avatar
hleV
AMX Mod X ekspertai
Posts: 875
Joined: 2011 Apr 02 11:23
Skype: hlev.lt
Location: Šiauliai

Vienas kintamasis vietoje žaidėjų bool masyvo

Post by hleV »

Jeigu kuriate bool tipo masyvą žaidėjams, gera idėja yra sutaupyti atminties sukuriant tik vieną kintamajį ir bool reikšmę žaidėjams tikrinti bitų operacijomis.

Pvz. tokį kodą

Code: Select all

new bool:Alive[33]; OnSpawn(client)    Alive[client] = bool:is_user_alive(client); OnKilled(client)    Alive[client] = bool:is_user_alive(client); OnPreThink(client){    if (!Alive[client])        return;     // Do stuff}
galime pakeisti į

Code: Select all

#define SetPlayerBit(%1,%2) (%1 |= (1 << (%2 & 31)))#define ResetPlayerBit(%1,%2) (%1 &= ~(1 << (%2 & 31)))#define GetPlayerBit(%1,%2) (%1 & (1 << (%2 & 31))) new Alive; OnSpawn(client)    is_user_alive(client) ? SetPlayerBit(Alive, client) : ResetPlayerBit(Alive, client); OnKilled(client)    is_user_alive(client) ? SetPlayerBit(Alive, client) : ResetPlayerBit(Alive, client); OnPreThink(client){    if (!GetPlayerBit(Alive, client))        return;     // Do stuff}
Šiame konkrečiame pavyzdyje sutaupėme kažkiek atminties sukurdami vieną kintamajį vietoje 33 kartus daugiau RAM'ų ryjančio masyvo. Be to OnPreThink() funkcijoje (kuri iškviečiama tiek kartų per sekundę, kiek žaidėjas turi FPS) išvengėme „indeksavimo“, t.y. papildomos procesoriaus užduoties atrinkti indeksą, kuris pirmame pavyzdyje būtų lygus client - bitų operacijos greitesnės už „indeksavimą“.

Šias „funkcijas“ patarčiau nusikopijuoti į savo plugin'us arba įsidėti į naują include failą:

Code: Select all

#define SetPlayerBit(%1,%2) (%1 |= (1 << (%2 & 31)))#define ResetPlayerBit(%1,%2) (%1 &= ~(1 << (%2 & 31)))#define GetPlayerBit(%1,%2) (%1 & (1 << (%2 & 31)))
Galite prisikurti daugiau kintamųjų:

Code: Select all

new Alive;new Vip;
ir gauti/nustatyti/atstatyti reiškmes labai paprastai: [Set|Get|Reset]PlayerBit(<kintamasis>, <klientas>), pvz.:

Code: Select all

if (get_user_flags(client) & ADMIN_LEVEL_H)    SetPlayerBit(Vip, client);

Code: Select all

user_kill(client);ResetPlayerBit(Alive, client);
Image ← RIP best userbar
DISKUSIJA: KIETAS PLUGIN'O UŽSAKOVAS
Privačios pagalbos neteikiu!


User avatar
hleV
AMX Mod X ekspertai
Posts: 875
Joined: 2011 Apr 02 11:23
Skype: hlev.lt
Location: Šiauliai

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by hleV »

Taip. Nes čia tu netikrini, ar reikšmė žaidėjui yra true ar false, bet ar žaidėjo ID yra kintamąjame (bitų sumoje).
Image ← RIP best userbar
DISKUSIJA: KIETAS PLUGIN'O UŽSAKOVAS
Privačios pagalbos neteikiu!

Fly3r
Jau po truputį tampa savu
Posts: 138
Joined: 2011 Nov 06 11:35

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by Fly3r »

Kodėl (1 << (%2 & 31)), o ne (1 << %2)?

newb
Pluginų patvirtintojas
Posts: 1047
Joined: 2010 Sep 23 21:43
Location: Wonderland
Contact:

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by newb »

Code: Select all

//If you are storing a player index or anything that has an index up to 32.//Example: SetPlayerBit( BitFieldVar , # )#define SetPlayerBit(%1,%2)      (%1 |= (1<<(%2&31)))#define ClearPlayerBit(%1,%2)    (%1 &= ~(1 <<(%2&31)))#define CheckPlayerBit(%1,%2)    (%1 & (1<<(%2&31))) //Safe for using values 0-31.//Example: SetBit( BitFieldVar , # )#define SetBit(%1,%2)      (%1 |= (1<<%2))#define ClearBit(%1,%2)    (%1 &= ~(1<<%2))#define CheckBit(%1,%2)    (%1 & (1<<%2))  
[TUT] Bits, Bit-fields, and Bit-wise Operators

User avatar
xFrostas
Flooderis arba specialistas
Posts: 660
Joined: 2010 Sep 02 15:47
Skype: frost.lt

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by xFrostas »

Aš nelabai suprantu man rodos, bet ar čia gerai? man reikia, kad FirstJoin būtų true

Code: Select all

public client_putinserver(id){    GetBit(FirstJoin, id)}

User avatar
aaarnas
Vyr. diskusijų administratorius
Posts: 3891
Joined: 2010 Aug 31 13:21
Skype: fiarno
Contact:

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by aaarnas »

set bit - padaro true
get bit - patikrina true ar false
clear/reset bit - padaro false

Negi taip sudėtinga ?
Palikau CS pasaulį ;/ . Nebepasiekiamas.

User avatar
xFrostas
Flooderis arba specialistas
Posts: 660
Joined: 2010 Sep 02 15:47
Skype: frost.lt

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by xFrostas »

dar kažkur radau

Code: Select all

 #define GetBit(%1,%2) (%1 & 1 << (%2 & 31))#define SetBit(%1,%2) %1 |= (1 << (%2 & 31))#define ResetBit(%1,%2) %1 &= ~(1 << (%2 & 31))
Jie kažkuo skiriasi?

User avatar
aaarnas
Vyr. diskusijų administratorius
Posts: 3891
Joined: 2010 Aug 31 13:21
Skype: fiarno
Contact:

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by aaarnas »

Tas pats, tik skliaustai kvailai sudėlioti. Kam tau ieškoti, jei čia viskas parodyta ?
Palikau CS pasaulį ;/ . Nebepasiekiamas.

User avatar
xFrostas
Flooderis arba specialistas
Posts: 660
Joined: 2010 Sep 02 15:47
Skype: frost.lt

Re: Vienas kintamasis vietoje žaidėjų bool masyvo

Post by xFrostas »

Turėjau ten kažkokį pluginą ir jame radau, aptikau.

Post Reply

Who is online

Users browsing this forum: No registered users and 4 guests