GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

Foreach - Iterator Kullanımı

Başlatan Kraus, 21 Temmuz 2018, 21:08:48

« önceki - sonraki »

0 Üye ve 2 Ziyaretçi konuyu incelemekte.

Kraus

Merhaba Arkadaşlar. Bu kullanımı, sistemlerimdeki döngülerdeki yavaşlıktan ve çökmelerden ötürü öğrenmiştim. Bu nedenle bu tür şeyler yaşıyorsanız ya da performansa fazla önem veriyorsanız çok işinize yarayabilecek bir kullanımdır. Genel bir anlatım yapacağım, siz mantığını anladıktan sonra kullanacağınız yeri bilirsiniz. İyi forumlar.




Foreach ne işe yarıyor?

Foreach, mantık olarak "for/while" döngüleri ile benzer mantıkta çalışır. Ancak ekstra bir özelliği vardır. Döngülerinizde gereksiz veriler dönmez. Böylelikle performans açısından çok büyük bir avantaj sağlar.




For ile Foreach arasındaki fark nedir?

Bu farkı bir örnek yoluyla anlatmak istersem;

for(new i; i < MAX_PLAYERS; i++) döngüsünde döngü MAX_PLAYERS tanımınız 500 ise 500 kere dönecektir. Bu da performans açısından kötüdür. Foreach da ise böyle değildir.

foreach(Player, i) döngüsünde Include'nin kendi içindeki Iterator sistemiyle birlikte döngü sadece oyundaki oyuncu sayısı kadar döner. Böylelikle performans açısından çok büyük katkı sağlar.





Foreach ile Iterator sistemini nasıl kullanırım?

Kendiniz bu şekilde performanslı döngüler kullanmak istiyorsanız aşağıdaki örneği inceleyin.

Örneğin 500 adetle sınırlı bir değişkeniniz var, siz sadece işinize gelenleri döngüde kullanmak istiyorsunuz.



new
Iterator:Kraus<500>; // iterator'ün tanımını yapıyoruz. Kraus yazan yere herhangi bir değişken ismi yazın. (500 adetle sınırlı bir veri için)
Iter_Add(Kraus, 50);
Iter_Add(Kraus, 425);
Iter_Add(Kraus, 125);
Iter_Add(Kraus, 245);  // işimize gelen verileri iterator'e ekliyoruz.
foreach (new i : Kraus) // İşimize gelen verileri döngü içinde kullanıyoruz (Burada i yazan yer döngüde geçen verinin değişkene tanımıdır. Kraus yazan yer ise kullandığımız iterator'un değişken ismidir.
{
printf("%d", i);
}


Bu şekilde kullandığımızda konsoldaki çıktı aşağıdaki gibi olacaktır.


50
125
245
425


Eğerki işimize gelen bir veri sonradan işimize gelmemeye ve döngüde kalabalık yapmaya başlarıysa bu veriyi aşağıdaki kod ile silebiliriz.

Iter_Remove(Kraus, 125);




Çok Boyutlu Tanımlarda Iterator Kullanımı

Çok boyutlu tanımlamalarda kastedilen şey iterator'un dizi şeklinde olmasıdır. Örneğin her bir oyuncunun sahip olduğu araçları iterator olarak kullanmak isterseniz çok boyutlu bir tanımlama gerekir.


new
     Iterator:KisininAraclari[MAX_PLAYERS]<MAX_VEHICLES>; // Her bir kişi için ayrı bir iterator kullanılacağı için bu şekilde çok boyutlu bir tanım yapıyoruz. Buradaki MAX_PLAYERS kaç tane iterator olacağı. MAX_VEHICLES ise bir iteratorde kullanılacak maksimum veri sayısı.
Iter_Init(KisininAraclari); // Bunu çok boyutlu tanımlamalarda Array tanımı için kullanmanız gerekmektedir. Geniş kapsamlı bir sistem için OnGameModeInit ya da OnFilterScriptInit publici altında kullanılmalıdır.
Iter_Add(KisininAraclari[playerid], 125); // Bu şekilde playerid'deki kişiye belirtilen ID'deki araçları ekliyoruz.
Iter_Add(KisininAraclari[playerid], 128);
foreach (new aracID : KisininAraclari[playerid]) // playerid'deki kişinin araç ID'lerini döngüde kullanıyoruz.
{
printf("Oyuncu: %d Arac ID'si: %d", playerid, aracID).
}





Önemli Bir Detay:

Iterator sisteminde negatif değerler kullanamazsınız. Bu yüzden bu sistemi Iter_Add(Kraus, -5); tarzı kodlarla kullanmayınız, çalışmayacaktır.




Bu konuda Türkçe bir kaynağın olmayışı nedeniyle başlangıç olarak yetecek kadar anlatmaya çalıştım. Umarım bu anlatımın size yararı olur.

Saygılarımla, Kraus


Konuya yardımcı sayfalar: #1 

Safari Gaming © sɪɴᴄᴇ 2014
www.sf-gaming.net

LanceX


pag

Faydalı bir anlatım olmuş, teşekkürler.


Zoxy

Iterator ile başka şeyler de yapılabilir. Örneğin Iter_Random fonksiyonu ile rastgele sunucuda bulunan bir kişinin id'sini çekmek. Ben ilk başladığımda genellikle MAX_PLAYERS kullanırdım, sonra GetPlayerPoolSize'a geçtim şimdi Foreach kullanıyoruz. Anlatım için teşekkürler.


Kraus

Alıntı yapılan: SelimBasKaN - 21 Temmuz 2018, 21:19:57

Anlatım için teşekkürler.

Alıntı yapılan: ReDDooM - 21 Temmuz 2018, 21:27:15

Faydalı bir anlatım olmuş, teşekkürler.

Yorumlarınız için teşekkürler.




Alıntı yapılan: Zoxy - 21 Temmuz 2018, 21:29:40

Iterator ile başka şeyler de yapılabilir. Örneğin Iter_Random fonksiyonu ile rastgele sunucuda bulunan bir kişinin id'sini çekmek. Ben ilk başladığımda genellikle MAX_PLAYERS kullanırdım, sonra GetPlayerPoolSize'a geçtim şimdi Foreach kullanıyoruz. Anlatım için teşekkürler.

Konuda belirttim. Foreach-Iterator sistemi için Türkçe bir kaynağın olmayışı nedeniyle temelden bir anlatım yaptım. Tabiki anlatılabilecek çok şey var. Yorumun için teşekkürler.

Safari Gaming © sɪɴᴄᴇ 2014
www.sf-gaming.net

NikolaiS

Performans açısından işe yarar, anlatım iyi.


ManoFire

Gayet açıklayıcı ve yararlı bir anlatım olmuş, teşekkürler.  :helal:


_Code

Anlatım için teşekkürler, herkese tavsiye ederim.  :helal:





SA:MP Turkiye CnR IP: server.sampturkiyecnr.com:7777

Kraus

Alıntı yapılan: NikolaiS - 21 Temmuz 2018, 21:45:33

Performans açısından işe yarar, anlatım iyi.



Alıntı yapılan: ManoFire - 21 Temmuz 2018, 22:06:19

Gayet açıklayıcı ve yararlı bir anlatım olmuş, teşekkürler.  :helal:


Alıntı yapılan: RECEP - 22 Temmuz 2018, 13:18:53

Anlatım için teşekkürler, herkese tavsiye ederim.  :helal:


Yorumlar için teşekkürler.

Safari Gaming © sɪɴᴄᴇ 2014
www.sf-gaming.net

FelleR