Právě je stř 23. kvě 2012 9:52:06
Hosting WEDOS.cz
SLEVA 25% (slevový kód:PAWNO25)

Nejnovější témata:
[HELP] realne zatykani od KillBill61
[HELP] Skrytie TextDrawu od Om3n
[Stránka] Hostingu SA-MP od Om3n
[ENG/SVK/CZ] mancraft.eu minecraft od ffredyk
[Hledam] Mod na koupeni .pwn od [Non]฿art*

Vyzkoušejte antivirus ESET Smart Security 5

Vyhledat témata bez odpovědí | Zobrazit aktivní témata Zobrazit nové příspěvky | Zobrazit vaše příspěvky


Všechny časy jsou v UTC + 1 hodina [ Letní čas ]





Odeslat nové téma Odpovědět na téma  [ Příspěvků: 9 ] 
Autor Zpráva
 Předmět příspěvku: [TuT] Optimalizace cyklu for
PříspěvekNapsal: ned 29. kvě 2011 18:49:07 
Moderátor
Moderátor
Uživatelský avatar
Registrován: čtv 11. čer 2009 12:47:03
Příspěvky: 2228

Zdravím, kdesi v tutoriálů jsem psal, jak je možné trochu zoptimalizovat cyklus na playerid.
Rozhodl jsem se, že z toho udělám i tut.

Budeme potřebovat:
* 1 proměnná
* Znalost funkce for
* Znalost práce s proměnnýma úroveň začátečník
________________________________________________
Určitě už jste někde viděli toto:
Kód:
for(new i=0; i<MAX_PLAYERS; i++)

Je to cyklus, který se vykoná od 0 do MAX_PLAYERS (500), celkem tedy 500x. No nezdá se Vám to zbytečné, když máte třeba 50 slotů?

Možná Vás napadne toto:
Kód:
for(new i=0; i<MAX_PLAYERS_EX; i++)

nebo
Kód:
for(new i=0; i<GetMaxPlayers(); i++)

Dobře, máte cyklus pro maximální hodnotu MAX_PLAYERS_EX nebo GetMaxPlayers();. Je to lepší, ale pořád to není ono. Máte na serveru 5 lidí a vy vyvoláváte cyklus pro 50 lidí, nevhodné.

Teď už se tedy dostáváme k tomu, o čem jsem chtěl mluvit.
1) Vytvoříme si proměnnou pro Maximální připojené ID na serveru
2) v OnPlayerConnect:
Kód:
if(playerid > VašeProměnná) VašeProměnná = playerid;

Vysvětlení: Když se připojí hráč a bude mít vyšší hodnotu playerid, než je hodnota proměnné, hodnota playerid se do ní zapíše, tímto docílíme toho, že v proměnné, bude zapsáno nejvyšší ID, které se připojilo na server.

3) Nesmíme ale zapomenout, že se i hráč s nejvyšším ID může odpojit. To vyřešíme takto:
v OnPlayerDisconnect:
Nejprve zjistíme, jestli hráč, kterej se odpojil, měl nejvyšší ID na serveru:
Kód:
if(playerid == VašeProměnná) {


Pokud ano, tak proměnnou nastavíme na 0...
Kód:
VašeProměnná = 0;

... a spustíme cyklus (POZOR: Zde sledujte, optimalizujeme a spouštíme cyklus s Maximální hodnotou = playerid = Bývalé maximální připojené ID
Kód:
for(new i=0; i<playerid; i++) {


Nesmíme hlavně zapomenou, že kontrolujeme pouze připojené hráče
Kód:
IsPlayerConnected(i)) {


A poté zapíšeme hráčovo ID do proměnné, nemusíme to něják ošetřovat, protože se nám hodnoty zapisují od nejmenší po největší (díky i++), proto jako výsledná hodnota zůstane maximální připojené ID. Nezapomeňte správně "dozávorkovat".

Tímto máme zajištěno, že VŽDY bude v proměnné zapsáno Maximální připojené ID.

No a teď využití:
Dá se říct vše, spíš napíšu, kde se toto použít nedá:
* Všechny cykly v OnGameModeInit/OnFilterScriptInit (vytváření TD, ...)

Dál mě nic nenapadá, prostě se to dá využít, tam, kde potřebujete zjistit ID online hráčů.
No a jak by to mělo vypadat?
Kód:
for(new i=0; i<=VašeProměnná; i++) {


______________________________________________________
2.Díl (Pouze pro ty, co nemají na serveru NPC || pro ty, kterří chtějí, aby se tento cyklus NPC netýkal)
Pozn.: Jak jsem psal, kdo má NPC, tak to pro něj nen, ti totiž dostávají při OnGameModeInit automaticky nejmenší ID (= 0,1,...)

Pro Vás jsem připravil další vychytávku, dá se to ještě trochu vylepšit. Ne vždy máte na serveru máte připojeného hráče s ID 0. Někdy se třeba stane, že hráči, kteří jsou na serveru mají ID např.: 10, 12, 6, 15. Druhá možnost je ta, že ty spodní ID zaberou NPC a hráči jako nejmenší ID dostanou třeba 6.
Co použijeme, abychom to ještě více zoptimalizovali:
* Další proměnná (můžete udělat v té první pole o velikosti 2)
* Jinak to samé, co nahoře

Tentokrát budeme zjišťovat Minimální připojené ID.
POZOR: Vy, co máte NPC na serveru, dodejte si do 1. části tohoto tutu při té podmínce v OnPlayerConnect dodatečnou podmínku "if(!IsPlayerNPC(playerid)) {" PŘED podmínku "if(playerid > VašeProměnná) {"

Je tedy zbytečné vyvolávat cyklus od 0. Upravíme si to.
Tentokrát budeme zjišťovat minimální připojené ID na serveru.
A) OnPlayerConnect
1) zjistíme, jestli není NPC
Kód:
if(!IsPlayerNPC(playerid)) {

2) zjistíme, jestli je hodnota playerid menší než Minimální připojené ID
Kód:
if(playerid < VašeDruhaPromenna) {

3) Zapsání hodnoty playerid do proměnné

B) OnPlayerDisconnect
1) podmínka, jestli není NPC
2) podmínka, jestli je playerid rovno Minimálnímu ID
3) cyklus
Kód:
for(new i=VašeProměnná/*MAX_ID*/; i>playerid; i--) {

Vypadá to složitě, ale není tomu tak, je to cyklus, který místo přičítání hodnot je bude odčítat. Výchozí hodnota je Maximální připojené ID, konečná hodnota je bývalé Minimální připojené ID + 1.
4) Podmínka na připojení hráče
5) Zápis do proměnné

No a je to hotovo.
Teď můžeme použít toto:
Kód:
for(new i=VašeDruháProměnná/*MIN*/; i<=VašeProměnná/*MAX*/; i++) {


Př.: Připojené ID: 14, 7, 12, 10, 8 | Počet slotů: 100
Neupravený cyklus: 100 cyklů » GetMaxPlayers();/ 500 cyklů » MAX_PLAYERS
Upravený cyklus podle první části: 14 cyklů
Upravený cyklus podle druhé části: 7 cyklů

Docela rozdíl ne?
Toť vše. Přeji pěkný den.

EDIT:
Viz spodní příspěvek.
Pokud použijete v druhé části cyklu i<MaxConnectedID, nebude počítán do cyklu hráč s ID = MaxConnectedID.

Řešení:
for(new i=MinConnectedID; i<=MaxConnectedID; i++) {

_________________
Obrázek


Naposledy upravil Petr dne sob 18. čer 2011 21:42:04, celkově upraveno 1

Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: pon 30. kvě 2011 7:25:20 
T - Bone Mendez
T - Bone Mendez
Uživatelský avatar
Registrován: úte 03. lis 2009 22:16:28
Příspěvky: 95

Nieco na tento sposob tu bolo sa mi zda od ATomasa...

_________________
[TuT]Anti-Godmode
[TuT]Tuning auta - All in one
[TuT]Jednoduche rozmiestnovanie aut
[TuT]ESC Pauza
[TuT]Premenovanie (vratane DUDB)
[TuT]Tag, untag, a ine hratky s SetPlayerChatBubble
[INC]Prehadzovanie zbrani v aute (Q+E)

Obrázek


Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: pon 30. kvě 2011 7:27:33 
Moderátor
Moderátor
Uživatelský avatar
Registrován: čtv 11. čer 2009 12:47:03
Příspěvky: 2228

Mmartin píše:
Nieco na tento sposob tu bolo sa mi zda od ATomasa...


Tak to najdi, já to hledal a nenašel. ;)

_________________
Obrázek


Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: pon 30. kvě 2011 9:49:41 
Barry Thorne "Big Bear"
Barry Thorne "Big Bear"
Uživatelský avatar
Registrován: pon 31. led 2011 22:41:49
Příspěvky: 242

nice tut :)

_________________
Obrázek

Prison Sector 47:
rsgame.cz:4747

[GM] Prison Sector 47 v3.0
[GM] StreeT Life
[FS] LYRIcS ATTACH OBJECT STUDIO
[FS] LYRIcS's Alcatraz
[FS] Lyrics Free Camera Mode
[FS] Animation Reader (pwn)
[FS/MAP] Alcatraz (887 objektov!!!)
[INC] Lyrics Text Pointer
[SCREENY] Obrázky + ID všetkých SAMP 0.3e objektov

Môj skype: alphamew98


Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: sob 18. čer 2011 21:40:18 
Moderátor
Moderátor
Uživatelský avatar
Registrován: čtv 11. čer 2009 12:47:03
Příspěvky: 2228

Update, mohlo se stát, že se Vám vyskytnula chyba při ingame cyklu. Dopsáno dole v prvním příspěvku.

_________________
Obrázek


Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: sob 18. čer 2011 23:59:01 
Carl Johnson "CJ"
Carl Johnson "CJ"
Uživatelský avatar
Registrován: čtv 29. led 2009 20:03:51
Příspěvky: 4548
Bydliště: Blava ne ?

takto to používam už dlhšie... dosť... btw spôsob foreach ale Y_Less je ako z marsu :D

_________________
Moja tvorba http://pastebin.com/u/PatchwerkQWER
Ak chceš byť lepší ako ja, a budeš sa snažiť budeš lepší ! Už len pri pomyslení na to, že si lepší než ja, ťa posunie dopredu. Ale nezabudni ! Musíš sa snažiť. A potom zistíš to, čo vie pár ľudí - že som lama a moje scripty sú nič oproti tomu, čo môžeš vytvoriť ty. Tak sa prekonaj ako kedysi ja, a natri to všetkým ! Uprav budúcnosť pre svoj prospech


Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: ned 19. čer 2011 0:00:20 
Moderátor
Moderátor
Uživatelský avatar
Registrován: čtv 11. čer 2009 12:47:03
Příspěvky: 2228

QWER píše:
takto to používam už dlhšie... dosť... btw spôsob foreach ale Y_Less je ako z marsu :D


Y_Less, kdyby jsme měli vše co je tady prirovnávat k němu, tak se tu to rovnou může smazat :D

Trochu ti to ten server odlehčí, ale určitě ne na max. :D

_________________
Obrázek


Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: ned 19. čer 2011 0:04:05 
Carl Johnson "CJ"
Carl Johnson "CJ"
Uživatelský avatar
Registrován: čtv 29. led 2009 20:03:51
Příspěvky: 4548
Bydliště: Blava ne ?

mohol si rovno dať aj premeny s "char" :)

_________________
Moja tvorba http://pastebin.com/u/PatchwerkQWER
Ak chceš byť lepší ako ja, a budeš sa snažiť budeš lepší ! Už len pri pomyslení na to, že si lepší než ja, ťa posunie dopredu. Ale nezabudni ! Musíš sa snažiť. A potom zistíš to, čo vie pár ľudí - že som lama a moje scripty sú nič oproti tomu, čo môžeš vytvoriť ty. Tak sa prekonaj ako kedysi ja, a natri to všetkým ! Uprav budúcnosť pre svoj prospech


Offline
 Profil  
 Předmět příspěvku: Re: [TuT] Optimalizace cyklu for
PříspěvekNapsal: ned 19. čer 2011 0:07:26 
Moderátor
Moderátor
Uživatelský avatar
Registrován: čtv 11. čer 2009 12:47:03
Příspěvky: 2228

QWER píše:
mohol si rovno dať aj premeny s "char" :)


Třeba příště :D

_________________
Obrázek


Offline
 Profil  
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 9 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


 Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na: