Page 1 of 1

Vienas kintamasis vietoje žaidėjų bool masyvo

Posted: 2012 Mar 27 12:07
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);

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

Posted: 2012 Mar 27 12:15
by psychical
Tik bool reikšmių kūrimas įmanomas? :hm:

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

Posted: 2012 Mar 27 12:25
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).

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

Posted: 2012 Mar 29 15:53
by Fly3r
Kodėl (1 << (%2 & 31)), o ne (1 << %2)?

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

Posted: 2012 Mar 29 16:38
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

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

Posted: 2012 Apr 04 21:38
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)}

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

Posted: 2012 Apr 04 21:40
by aaarnas
set bit - padaro true
get bit - patikrina true ar false
clear/reset bit - padaro false

Negi taip sudėtinga ?

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

Posted: 2012 Apr 04 21:56
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?

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

Posted: 2012 Apr 05 13:17
by aaarnas
Tas pats, tik skliaustai kvailai sudėlioti. Kam tau ieškoti, jei čia viskas parodyta ?

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

Posted: 2012 Apr 05 13:24
by xFrostas
Turėjau ten kažkokį pluginą ir jame radau, aptikau.