Vienas kintamasis vietoje žaidėjų bool masyvo
Posted: 2012 Mar 27 12:07
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ą
galime pakeisti į
Š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ą:
Galite prisikurti daugiau kintamųjų:
ir gauti/nustatyti/atstatyti reiškmes labai paprastai: [Set|Get|Reset]PlayerBit(<kintamasis>, <klientas>), pvz.:
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}
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}
Š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)))
Code: Select all
new Alive;new Vip;
Code: Select all
if (get_user_flags(client) & ADMIN_LEVEL_H) SetPlayerBit(Vip, client);
Code: Select all
user_kill(client);ResetPlayerBit(Alive, client);