Mängumoodi optimeerimine.
#1
Taastasin teema. Kuidas teie saaksite taastada? http://sa-mp.planet.ee/thread-743.html

---

Kuna suurem osa Eesti SA-MP arendajatest ei mõtle eriti enda mängumoodi optimeerituse peale, mis võib lõpuks valusalt kätte maksta, otsustasin teha ühe õpetuse selle kohta, kuidas mängumoodi paremini optimeerida. See õpetus näitab teile ainult kõige põhilisemat, lisaks pole selgitused väga head. Tulevikus lisan kindlasti mõned punktid.


1. Loopid, funktsioonid ja muutujad.
Esiteks, uusi muutujaid ei tohiks teha loopi sees, kuna sel juhul te tekitate sama muutujat mitu korda, kuigi teile piisab ühest korras. Lisaks, kui kasutate loopis funktsiooni, mille väärtus ei olene loopi väärtusest (Minu näites "i"), tuleks teha nendest muutuja.

Koostasin kiiresti testiskripti:
    PAWN Programming
  1. #include <a_samp>
  2.  
  3. stock Funktsioon()
  4. {
  5. new a;
  6. for (new i; i < 100; i++) a = IsPlayerConnected(342);
  7. return a;
  8. }
  9.  
  10. {
  11. new tick;
  12.  
  13. tick = GetTickCount();
  14. new a;
  15. new b = Funktsioon();
  16. for (new i; i < 1000000; i++) if (a == b) SendClientMessageToAll(0xFFFFFFFF, "Mängija 342 pole mängus!");
  17. printf("Optimeeritud tegevus võttis aega %ims.", GetTickCount() - tick);
  18.  
  19. tick = GetTickCount();
  20. for (new i; i < 1000000; i++)
  21. {
  22. new c;
  23. if (c == Funktsioon()) SendClientMessageToAll(0xFFFFFFFF, "Mängija 342 pole mängus!");
  24. }
  25. printf("Optimeerimata tegevus võttis aega %ims.", GetTickCount() - tick);
  26. return 1;
  27. }




Tulemused on järgmised:
Quote:[17:57:18] Optimeeritud tegevus võttis aega 1159ms.
[17:57:23] Optimeerimata tegevus võttis aega 5601ms.

Tulemused võivad erineda olenevalt funktsioonist, mida vastavalt kas üks või miljon korda kasutada.


2. Stringide suurused.

Kui teie stringi sisu on kõigest "Käivitasid mootori!", siis milleks on vaja teha 128 või 256 celline (Kui keegi leiab normaalse tõlke, öelge mulle) string? "Käivitasid mootori!" pikkus on 19 tähemärki, millele tuleb lisada veel üks tähemärk, mis tähistab stringi lõppu, seega on sellele stringile sobivaks suuruseks 20 celli. Kasutades liiga suuri stringe, kasutate te palju rohkem mälu, kui vaja ning lõpuks ületab selle mälu hulk lubatu (Ka compiler annab sellest märku).

Täpsemalt saate lugeda siit: http://forum.sa-mp.com/showthread.php?t=55261 - See õpetab seda osa teile täpsemalt, lisaks on seal juttu kokkupakitud stringidest, mis vähendavad stringide suurust mitmekordselt.


3. Targad loopid.

Enamik arendajaid kasutavad foreachi (http://forum.sa-mp.com/showthread.php?t=92679) vaid mängijate loopimiseks, kuna see näeb ilusam välja ning selles ei pea kasutaja IsPlayerConnected'it. Tegelikult on foreachi kasutusvõimalused kordades suuremad.

Kirjalik näide, kuidas töötab foreach juhul, kui teil on majasüsteem:
Maja laetakse - Iter_Add(majad, id);
Maja eemaldatakse - Iter_Remove(majad, id);
Loopimine läbi majade: foreach (majad, i)

Pisike märkus foreachi kohta: Kui te ei kasuta muid YSI komponente, otsige foreachi versioon, mis ei kasutaks YSId.

Kui te mingil põhjusel ei soovi foreachi kasutada, loopige targalt: Te ei pea kontrollima, kas mängija on maja juures, kui maja ei eksisteeri. Näide, kuidas praakida loopist välja puuduvad majad:

    PAWN Programming
  1. if (!floatcmp(MajaInfo[i][mExtPos][0], 0)) continue;




4. MySQL.

Kui te kasutate vanemat MySQL pluginat koos suuremate querytega või kui teie MySQL server asub SA:MP serverist kaugel, võib esineda, et query ajal hangub teie server mõneks sekundiks, halvimal juhul minutiteks. Selle vastu aitab uuemate MySQL pluginate (BlueG, Dan.., ka StrickenKid, kuid seda ma ei soovita) kasutamine koos threaded querytega. Üldjuhul peate te ka enda MySQL süsteemid suuremas osas ümber kirjutama.
Ka MySQL süsteeme tasub kirjutada mõistlikult. Ma olen uurinud PlayONi laadimisi ning see on lihtsalt õudne. Kui serveris on 250 maja, viiakse läbi 251 queryt: Üks majade arvu loendamiseks ning üks iga maja andmete laadimise jaoks. Mina saaksin hakkama ühega.


5. Commandid.

Suurem osa arendajatest kasutab ZCMDi ning kirub strcmpi selle aegluse pärast. Mõni arendaja kasutab veelgi parema kiiruse pärast YCMDi, kuigi reaalsuses pole YCMDi ja ZCMDi kiiruste vahet tunda. Küll aga on ZCMD strcmpist ligi kümme korda kiirem.
Kõige kiirem command processor on tegelikult DC_CMD (http://forum.sa-mp.com/showthread.php?t=432330, benchmark siin: http://i.imgur.com/zXu4xJx.png), mis on kirjutatud assembleris. Samas on see kiirus saavutatud sellega, et seal puuduvad igasugused lisavõimalused. ZCMD sisaldab kahte väga kasulikku callbacki, YCMD aga ligi kahtekümmet funktsiooni, millega saab commande hallata.
Üks võimalus on veel rCMD, millele on sisseehitatud sscanf, kuid seda ei kasutata laialt. Ka rCMD on ZCMDist kergelt kiirem, kuid nende vahe pole märgatav ning kui oled harjunud ZCMDiga, pole mõtet seda kiiruse/aegluse tõttu välja vahetada.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)