Acest tutorial este pentru scripterii itermediari.
Inainte de toate, ce este un plugin eficient?
Un plugin eficient este un plugin care mananca foarte putina memorie dar in acelasi timp face ce trebuie sa faca.
Lasatima sa va dau un exemplu:
Sa incercam sa aflam ce player a fost omorit. Aceasta methoda poate fi facuta in 2 cai, una rea si una buna:
Cea buna ( chemam deathmsg ) :
- Cod:
-
register_event("DeathMsg", "event_death", "a")
public event_death()
{
new attacker = read_data(1)
new victim = read_data(2)
}
Si cea rea cand folosim PreThink ( avem nevoie de biblioteca engine ):
- Cod:
-
public client_PreThink(id)
{
if (!is_user_alive(id))
{
new attacker = get_user_attacker(id)
}
}
Care e problema cu PreThink
PreThink e chemat de 30 de ori pe secunda si va scana de 30 de ori attackatorul. Asta va cauza probleme in joc si in server
si mult lag
Sa va dau un exemplu mai bun despre ineficienta
Sa chemam functia DeathMsg si sa luam toate informatiile necesare:
Aceasta este cea mai buna metoda de lua toate informatiile, a 2 metoda va chema mai multe functii de odata, si nu este necesar.
- Cod:
-
register_event("DeathMsg", "event_death", "a")
public event_death()
{
new attacker = read_data(1)
new victim = read_data(2)
new weapon_name[33],weapon_id
// get the weapon name
read_data(4,weapon_name,32)
format(weapon_name,32,"weapon_%s",weapon_name)
weapon_id = get_weaponid(weapon_name)
}
- Cod:
-
register_event("DeathMsg", "event_death", "a")
public event_death()
{
new victim = read_data(2)
new attacker = get_user_attacker(victim)
new weapon = get_user_weapon(attacker)
}
Care este cel mai efficient modul?
Ei bine asta depinde de ce ai nevoie tu sa faci
Multa lume spuna ca FakeMeta este cel mai bun modul.
dar nu e cel mai bun modul, Foloseste o multime de memori din cauza functiilor care le are Pentru aceasta intrebare ,raspunsul este:
"Fiecare modul are lucruri bune de oferit, Trebuie sa folosim fiecare modul si ce ne ofera el."
Asta inseamna ca ar fi mai bine sa folosim fun/engine/ham decat fakemeta care mananca multa memorie.
Sa va dau un exemplu:
Daca folosim fm_is_in_viewcone, :
- Cod:
-
stock bool:fm_is_in_viewcone(index, const Float:point[3]) {
new Float:angles[3];
pev(index, pev_angles, angles); // COMUNICATION WITH MODULE
engfunc(EngFunc_MakeVectors, angles); // COMUNICATION WITH MODULE
global_get(glb_v_forward, angles); // COMUNICATION WITH MODULE
angles[2] = 0.0;
new Float:origin[3], Float:diff[3], Float:norm[3];
pev(index, pev_origin, origin); // COMUNICATION WITH MODULE
xs_vec_sub(point, origin, diff);
diff[2] = 0.0;
xs_vec_normalize(diff, norm);
new Float:dot, Float:fov;
dot = xs_vec_dot(norm, angles);
pev(index, pev_fov, fov); // COMUNICATION WITH MODULE
if (dot >= floatcos(fov * M_PI / 360))
return true;
return false;
}
Daca vedem folosete 5 functii si o multime de variabila o simpla functie.
Functia set_origin( fakemeta ) vs entity_set_origin( engine )
- Cod:
-
type | name | calls | time / min / max
-------------------------------------------------------------------
n | register_plugin | 1 | 0.000008 / 0.000008 / 0.000008
n | register_clcmd | 1 | 0.000017 / 0.000017 / 0.000017
n | random_float | 60000 | 0.134438 / 0.000001 / 0.000116
n | server_cmd | 1 | 0.000006 / 0.000006 / 0.000006
p | plugin_init | 1 | 0.000010 / 0.000010 / 0.000010
p | profile | 1 | 0.182920 / 0.182920 / 0.182920
n | entity_set_origin | 10000 | 0.035055 / 0.000002 / 0.000082
n | pev | 20000 | 0.044686 / 0.000001 / 0.000183
n | engfunc | 20000 | 0.052677 / 0.000002 / 0.000073
f | fm_entity_set_origin | 10000 | 0.113504 / 0.000008 / 0.000373
0 natives, 0 public callbacks, 2 function calls were not executed.
Fm_is_in_viewcone vs viewcone
- Cod:
-
type | name | calls | time / min / max
-------------------------------------------------------------------
n | server_cmd | 1 | 0.000008 / 0.000008 / 0.000008
p | plugin_init | 1 | 0.000007 / 0.000007 / 0.000007
p | profile | 1 | 0.112695 / 0.112695 / 0.112695
n | register_plugin | 1 | 0.000004 / 0.000004 / 0.000004
n | register_clcmd | 1 | 0.000016 / 0.000016 / 0.000016
n | floatsqroot | 10000 | 0.022363 / 0.000001 / 0.000038
n | floatdiv | 10000 | 0.022110 / 0.000001 / 0.000036
n | pev | 30000 | 0.067148 / 0.000001 / 0.000086
n | engfunc | 10000 | 0.025055 / 0.000001 / 0.000011
n | global_get | 10000 | 0.022244 / 0.000001 / 0.000031
n | floatcos | 10000 | 0.022657 / 0.000001 / 0.000209
n | random_float | 30000 | 0.066903 / 0.000001 / 0.000035
f | operator/(Float:,_:) | 10000 | 0.022434 / 0.000001 / 0.000077
f | operator>=(Float:,Float:) | 10000 | 0.021916 / 0.000001 / 0.000011
f | xs_rsqrt | 10000 | 0.067513 / 0.000004 / 0.000110
f | xs_vec_sub | 10000 | 0.021978 / 0.000001 / 0.000009
f | xs_vec_normalize | 10000 | 0.045749 / 0.000003 / 0.000073
f | xs_vec_dot | 10000 | 0.022200 / 0.000001 / 0.000047
f | fm_is_in_viewcone | 10000 | 0.271947 / 0.000022 / 0.000220
n | is_in_viewcone | 10000 | 0.025373 / 0.000002 / 0.000104
6 natives, 0 public callbacks, 2 function calls were not executed.
Acum despre "cache result"
Ce inseamna asta?
In loc sa folosim functia (exemplu) : is_user_bot( id ), non stop, putem stoca intrun boolean
- Cod:
-
new bool:cl_is_bot[33]
public client_putinserver(id)
{
if (is_user_bot(id))
cl_is_bot[id] = true;
}
//acum vom folosi cl_is_bot[id] in loc de is_user_bot(id)
In loc sa chemam un modul de mai multe ori am putea folosi o variabila cea ce mult mai rapid.
Dar trebuie sa tii minte ca e mult mai greu de facut.
Sursa: [Trebuie sa fiti inscris si conectat pentru a vedea acest link]