Acasa
Pagina de start!
Faq
Intrebari puse frecvent!
Membri
Vezi lista membrilor!
Cautare
Gasesti ce vrei,repede!
Conectare
Intra in contul tau!
Inregistrare
Fi alaturi de noi!

Distribuiţi|

[Tutorial] Pluginuri Eficiente

Vezi subiectul anterior Vezi subiectul urmator In jos
AutorMesaj
FloRyN.
Supervisor
avatar

Joined : 29/09/2011
Posts : 1220
CS Status : Buna
Age : 21
MesajSubiect: [Tutorial] Pluginuri Eficiente Dum Ian 03, 2016 2:22 am

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]

-------SIGNATURE OFFICIAL @ K.A-------

- Contacteaza-ma pentru orice problema legata de Forum / Server
- Nu imi trimite PM pentru a cere grade sau up NU voi raspunde
- Nu ma contacta pe mess sau e-mail Pentru a cere ceva Nu voi raspunde eventual IGNORE
- Tine minte , Secretul vietii nu este sa ai tot ceea ce iti doresti, ci sa-ti doresti tot ceea ce ai.
Sus In jos

[Tutorial] Pluginuri Eficiente

Vezi subiectul anterior Vezi subiectul urmator Sus

Subiecte similare

-
t [Tutorial] Cum sa faci un sistem de logare/inregistrare!
Pagina 1 din 1

Permisiunile acestui forum:Nu puteti raspunde la subiectele acestui forum
Kill-AreNa :: » KILL-ARENA - COUNTER-STRIKE 1.6 :: Programarea CS-ului :: Scripting-
Social Media Buttons