- Mesajlar
- 2,410
- En iyi cevaplar
- 98
- Beğeniler
- 2,461
- Puanları
- 10,250
- Ruh hali
Bugün size Skript'de edindiğim tecrübelerden yola çıkarak Skript'de lag, donma bug vb. sorunları nasıl çözeceğinizi anlatacağım.
1. LAG ÇÖZÜMÜ
Skript ve diğer eklentiler bana göre eğer son ve uygun versiyonlarını indirdiyseniz ve eğer yanlış bir düzenleme yapmadıysanız lag yapmaz. Yapsa bile bu farklar milisaniyeliktir ve gözle görülür bir lag olmayacaktır. Öncelikle şunu belirtmeliyim ki Skript timings'e fazla bir bilgi göndermiyor eğer sunucunuzda bilinmeyen bir lag sebebi var ise bu skriptlerinizden kaynaklı olabilir. Genelde eklenti yazarları bilgili kişiler olur fakat Skript basit olduğu için her önüne gelen yazabilir, siz de acemiyken kendi yaptığınız ya da başkalarından aldığınız yarım yamalak laglı skriptlerin kurbanı olabilirsiniz. Bu lag sorunundan kurtulmak için aşşağıdaki önerileri uygulayın.
1.1 Skript Neden Lag Yapar?
Skript'de genelde while, loop ve every lag yapar. Every (örn. every 1 seconds) tek başına lag yapmasada loop ve while ile birleşirse lag yapabilir. Sadece every değil çok fazla ve sürekli tetiklenen herhangi bir eventin altında bu kodları fazlaca kullanırsanız lag olur. Mesela bir demir spawner skriptini ele alalım. {spler::*} adında bir liste değişkeniniz mevcut. Her 5 saniyede bir bu listeyi looplayıp loop-value'ye demir düşürüyorsunuz, bu durumda eğer sp sayısı çok fazla olur ise sunucunuzda aşırı oranda donma ve lag olacaktır. Bunu çözmek için izleyebileceğiniz adımlar aşşağıdaki gibidir;
1. LAG ÇÖZÜMÜ
Skript ve diğer eklentiler bana göre eğer son ve uygun versiyonlarını indirdiyseniz ve eğer yanlış bir düzenleme yapmadıysanız lag yapmaz. Yapsa bile bu farklar milisaniyeliktir ve gözle görülür bir lag olmayacaktır. Öncelikle şunu belirtmeliyim ki Skript timings'e fazla bir bilgi göndermiyor eğer sunucunuzda bilinmeyen bir lag sebebi var ise bu skriptlerinizden kaynaklı olabilir. Genelde eklenti yazarları bilgili kişiler olur fakat Skript basit olduğu için her önüne gelen yazabilir, siz de acemiyken kendi yaptığınız ya da başkalarından aldığınız yarım yamalak laglı skriptlerin kurbanı olabilirsiniz. Bu lag sorunundan kurtulmak için aşşağıdaki önerileri uygulayın.
1.1 Skript Neden Lag Yapar?
Skript'de genelde while, loop ve every lag yapar. Every (örn. every 1 seconds) tek başına lag yapmasada loop ve while ile birleşirse lag yapabilir. Sadece every değil çok fazla ve sürekli tetiklenen herhangi bir eventin altında bu kodları fazlaca kullanırsanız lag olur. Mesela bir demir spawner skriptini ele alalım. {spler::*} adında bir liste değişkeniniz mevcut. Her 5 saniyede bir bu listeyi looplayıp loop-value'ye demir düşürüyorsunuz, bu durumda eğer sp sayısı çok fazla olur ise sunucunuzda aşırı oranda donma ve lag olacaktır. Bunu çözmek için izleyebileceğiniz adımlar aşşağıdaki gibidir;
- Sadece online olan oyuncuların sp lerini looplayıp sadece online olan kişilerin sp lerinin çalışmasını sağlayabilirsiniz. Tüm sp leri looplamak ciddi derecede lag yapabilir.
- Every 5 seconds'tan sonra bir değişkeni örneğin {looplanıyor} değişkenini true yapın, sp leri looplamadan önce bu değişken var ise "stop" kodu ile loop'u iptal edin. Event sonunda (tüm kodlardan sonra ya da looptan sonra) da bu değişkeni silin. Bölece içe içe girmiş eventleri engellemiş olursunuz, skript'in loop yapması 5 saniyeden uzun sürer ise event tekrar tetiklenir, içe içe girer.
- 5 Saniyede bir tane düşürmek yerine 10 saniyede 2 tane düşürme gibi bir mantık kullanabilirsiniz.
- Yada bu tür skriptlerden vaz geçip Minecraft'ın bize sunduğu, her ne kadar yanında durunca FPS düşsede en azından sunucuda fazla bir lag yapmayan, farmını yapması biraz zahmetli olan normal spawnerları kullanabilirsiniz.
- Loopa wait eklemek sistemi rahatlatır. Teker teker bekleyerek, yavaş yavaş işlem yaparsa donma ve lag olma şansı azalır.
1.2 Disk Tasarrufu ve Lag
Disk Tasarrufu dediğimiz olaya göre ne kadar az karakter ve satır yazarsanız, yani ne kadar çok dosya boyutunu küçültürseniz o kadar az lag olur(bunu ben demiyorum öle deniyor). JavaScript, CSS gibi dillerde kodları sıkıştırıp dosya boyutunu azaltmak websitenizin açılış hızını nasıl arttırıyorsa, Skript dosyalarının boyutunu küçük tutmakta sunucunuzun açılış hızını boyutu küçük olmayanın açılış hızına göre arttırır. Disk Tasarrufu denilen olayın bana göre Lag ile uzaktan yakından alakası yoktur.
1.3 Loop Lagı
Yukardaki demir spawner örneğine bir örnek daha eklemek istiyorum, mesela bir CommandLogger skripti yazacaksınız. Oyuncuların kullandıkları komutları yetkililere göndermek ve sunucuda neler döndüğünü bilmek istiyorsunuz diyelim. Her komut kullanıldığında tüm oyuncuları looplayıp permi olanlara komutu gönderiyorsunuz, Evet bu yanlıştır. Komut kullanma olayı fazlaca tetiklenen bir eventtir. Heleki birde spam korumanız yok ise sıkıntı çıkarabilir. Looplayıp permi olanlara mesaj göndermek yerine, değişkenlere yetkililerinizi OfflinePlayer olarak kaydedip, o değişkende bulunan oyuncu online ise ona komutu gönderebilirsiniz.
2. DONMA
2.1 Skript'de Donma Neden Olur? Nasıl Çözülür?
Skript'de donmalar loop, while ve zahmetli / uzun bir işlemi çok kez tekrarlatan her kod sayesinde olur. Konumuz Loop ve While. Bu ikili aşşağısına yazılan işlemlerin belirlendiği kadar yada sürekli olarak tekrar etmesini sağlar. While kullandıysanız kesinlikle sonuna wait ekleyin yoksa sürekli tetiklenir. Loopada aynı şekilde sonraki kez tekrarlamadan önce wait eklerseniz donma, lag gibi olaylar azalır. Genellikle bu donma olayı uzun listeleri looplarken oluşur. Loopun içinde yada loopun sonunda yapılan işlemin bana göre fazla bir önemi yoktur. Siz örneğin demir sp'nin lag yaptığını düşünüyorsunuzdur fakat bunu çözmek için gidipte düşen demir miktarını azaltır sonrada "yerdeki demirler ve huniler lag yapıyor bak düşürürsek çözülür" diye düşünebilirsiniz, ama aslında onun bir önemi yoktur. Minecraft'da zaten yerdeki itemler belli bir süre sonra silinmektedir. Kaldı ki bir de çoğumuz sunucularımızda ClearLagg tarzı eklentiler kullanmaktayız.
Ek olarak başka bir donmada Skript tarafından direk olmasada, eğer skQuery'in webden veri çekme kodunu kullanıyorsanız olur. Bu kodda loop, every, while vb. kullanıp kullanmamanız önemli değildir, sadece webden skQuery ile veri çekmeye çalışmanız sunucunuzun birkaç saniye donması için yeterlidir. Bunun çözümü için bu konuya bakabilirsiniz.
3. BUG
3.1 Skript'de Bug Neden Olur? Çözmek İçin Öneriler?
Skript'de bug çoğu zaman sizin kod hatanızdan yada mantık hatanızdan kaynaklı olarak oluşur. Bazı durumlarda Skript'in kendisinde olmasada Addonların da olan hatalardan kaynaklı olan hatalarda(buglarda) oluşabilir. Size tavsiyem uykuluyken yada yorgunken mantık gerektiren birşeyler yapmaya çalışmayın. Bu sadece skript için değil genel bir öneridir. Eğer yapıyorsanızda birşeye çok takılmayın dinlendikten ve zaman geçtikten sonra yeterli bilgiye sahipseniz illaki hatanızı farkedeceksiniz ve bu hata genelde küçük bir hata olacak; tüm gün uykulu uykulu, yorgun yorgun boşuna uğraşmışım diyeceksiniz.
4. OPTİMİZE, DİSK & VERİ TASARRUFU
Bunlar ise benim doğrudan lagla ilişkili olmayan diye tanımladığım kavramlar. Optimize kodunuzda yaptığınız algoritma ve mantık değişiklikleridir. Lagın azalmasına yardımcı olur, ana lagın sebebidir diyemeyiz ama lagı azaltabilir. Bu değişiklikler every ve diğer çok yada sürekli tetiklenen eventlerle birlikte kullanılan loop ve while kodları ile alakalı ise bunu bu bölüme değilde yukardaki Loop Lagı bölümüne alıyorum. Disk tasarrufuna gelecek olursak dediğim gibi dosya boyutunu küçültmek için yaptığınız kısmalardır, 2-3 harf siler dosya boyutunu olabilecek minimuma düşürmeye çalışırsınız, fakat bana göre skript'i nasıl daha hızlı ve nasıl daha kolay yazıyorsanız öyle yazmalısınız. Veri tasarrufuna gelecek olursak buda gereksiz değişkenler belirleyip variables.csv dosyasının boyutunu yüksek tutmamak anlamına geliyor. variables.csv dosyası Skript'de atadığınız değişkenlerin depolandığı dosyadır.
5. GENEL TAVSİYELER
Disk Tasarrufu dediğimiz olaya göre ne kadar az karakter ve satır yazarsanız, yani ne kadar çok dosya boyutunu küçültürseniz o kadar az lag olur(bunu ben demiyorum öle deniyor). JavaScript, CSS gibi dillerde kodları sıkıştırıp dosya boyutunu azaltmak websitenizin açılış hızını nasıl arttırıyorsa, Skript dosyalarının boyutunu küçük tutmakta sunucunuzun açılış hızını boyutu küçük olmayanın açılış hızına göre arttırır. Disk Tasarrufu denilen olayın bana göre Lag ile uzaktan yakından alakası yoktur.
1.3 Loop Lagı
Yukardaki demir spawner örneğine bir örnek daha eklemek istiyorum, mesela bir CommandLogger skripti yazacaksınız. Oyuncuların kullandıkları komutları yetkililere göndermek ve sunucuda neler döndüğünü bilmek istiyorsunuz diyelim. Her komut kullanıldığında tüm oyuncuları looplayıp permi olanlara komutu gönderiyorsunuz, Evet bu yanlıştır. Komut kullanma olayı fazlaca tetiklenen bir eventtir. Heleki birde spam korumanız yok ise sıkıntı çıkarabilir. Looplayıp permi olanlara mesaj göndermek yerine, değişkenlere yetkililerinizi OfflinePlayer olarak kaydedip, o değişkende bulunan oyuncu online ise ona komutu gönderebilirsiniz.
2. DONMA
2.1 Skript'de Donma Neden Olur? Nasıl Çözülür?
Skript'de donmalar loop, while ve zahmetli / uzun bir işlemi çok kez tekrarlatan her kod sayesinde olur. Konumuz Loop ve While. Bu ikili aşşağısına yazılan işlemlerin belirlendiği kadar yada sürekli olarak tekrar etmesini sağlar. While kullandıysanız kesinlikle sonuna wait ekleyin yoksa sürekli tetiklenir. Loopada aynı şekilde sonraki kez tekrarlamadan önce wait eklerseniz donma, lag gibi olaylar azalır. Genellikle bu donma olayı uzun listeleri looplarken oluşur. Loopun içinde yada loopun sonunda yapılan işlemin bana göre fazla bir önemi yoktur. Siz örneğin demir sp'nin lag yaptığını düşünüyorsunuzdur fakat bunu çözmek için gidipte düşen demir miktarını azaltır sonrada "yerdeki demirler ve huniler lag yapıyor bak düşürürsek çözülür" diye düşünebilirsiniz, ama aslında onun bir önemi yoktur. Minecraft'da zaten yerdeki itemler belli bir süre sonra silinmektedir. Kaldı ki bir de çoğumuz sunucularımızda ClearLagg tarzı eklentiler kullanmaktayız.
Ek olarak başka bir donmada Skript tarafından direk olmasada, eğer skQuery'in webden veri çekme kodunu kullanıyorsanız olur. Bu kodda loop, every, while vb. kullanıp kullanmamanız önemli değildir, sadece webden skQuery ile veri çekmeye çalışmanız sunucunuzun birkaç saniye donması için yeterlidir. Bunun çözümü için bu konuya bakabilirsiniz.
3. BUG
3.1 Skript'de Bug Neden Olur? Çözmek İçin Öneriler?
Skript'de bug çoğu zaman sizin kod hatanızdan yada mantık hatanızdan kaynaklı olarak oluşur. Bazı durumlarda Skript'in kendisinde olmasada Addonların da olan hatalardan kaynaklı olan hatalarda(buglarda) oluşabilir. Size tavsiyem uykuluyken yada yorgunken mantık gerektiren birşeyler yapmaya çalışmayın. Bu sadece skript için değil genel bir öneridir. Eğer yapıyorsanızda birşeye çok takılmayın dinlendikten ve zaman geçtikten sonra yeterli bilgiye sahipseniz illaki hatanızı farkedeceksiniz ve bu hata genelde küçük bir hata olacak; tüm gün uykulu uykulu, yorgun yorgun boşuna uğraşmışım diyeceksiniz.
4. OPTİMİZE, DİSK & VERİ TASARRUFU
Bunlar ise benim doğrudan lagla ilişkili olmayan diye tanımladığım kavramlar. Optimize kodunuzda yaptığınız algoritma ve mantık değişiklikleridir. Lagın azalmasına yardımcı olur, ana lagın sebebidir diyemeyiz ama lagı azaltabilir. Bu değişiklikler every ve diğer çok yada sürekli tetiklenen eventlerle birlikte kullanılan loop ve while kodları ile alakalı ise bunu bu bölüme değilde yukardaki Loop Lagı bölümüne alıyorum. Disk tasarrufuna gelecek olursak dediğim gibi dosya boyutunu küçültmek için yaptığınız kısmalardır, 2-3 harf siler dosya boyutunu olabilecek minimuma düşürmeye çalışırsınız, fakat bana göre skript'i nasıl daha hızlı ve nasıl daha kolay yazıyorsanız öyle yazmalısınız. Veri tasarrufuna gelecek olursak buda gereksiz değişkenler belirleyip variables.csv dosyasının boyutunu yüksek tutmamak anlamına geliyor. variables.csv dosyası Skript'de atadığınız değişkenlerin depolandığı dosyadır.
5. GENEL TAVSİYELER
- Normal değişkenler yerine liste değişkenleri kullanmaya çalışın.
- Değişkenlerin başına kesinlikle değişiklik gösterebilen öğeler koymaktan kaçının, örneğin {%player%.kiriktassayisi} yerine {kiriktassayisi::%player%} kullanın.
- Eğer lag yapan looplarınız var ise sonlarına wait ekleyin. Örnek için 6. KARŞILAŞTIRMALAR bölümündeki ilk Skript'e bakabilirsiniz.
- Eğer lag yapan while kodlarınız var ise wait süresini arttırın.
- Eğer sunucunuz çok geç açılıyorsa Disk Tasarrufu yapma yoluna girebilirsiniz.
- Eğer değişkenleriniz yavaş kaydediliyor, kaydedilmiyor, yavaş siliniyor ya da konsolda "cannot save variables to ..." gibi hatalar alıyorsanız Veri Tasarrufu yapma yoluna girebilirsiniz.
- Java ile yapabileceğiniz şeyleri Skript ile yapmamanız tavsiye edilir. Skript küçük şeyler için var olabilir fakat bana göre aslında küçük şeyleri Skript ile yapmak gereksizdir. Yani Büyük bir şey'i java ile yapacak kadar bilginiz yok ise Skript ile yapabilirsiniz.
- Herkese açık paylaşmadığınız skriptlerinizde ayar kısımları yada configler kullanmayın. Gereksizdir.
6. KARŞILAŞTIRMALAR
6.1 Loop Lagı
6.1 Loop Lagı
PHP:
# kullanma
every 5 seconds:
loop {spler::*}:
drop 1 iron ingot at loop-value
# kullan
every 5 seconds:
if {alreadyLooping} is not set: # değişken true değil ise (daha doğrusu yok ise) koda devam eder
set {alreadyLooping} to true # loop başlamadan önce değişkeni true yapar
loop {spler::*}:
drop 1 iron ingot at loop-value
wait 0.3 ticks # 0.3 tick beklemek bile sistemin biraz rahatlamasına sebep olacaktır. Hem loopta yaptığınız işlem fazla gecikmez hemde lag oranı azalır.
delete {alreadyLooping} # loop bittiğinde değişkeni siler
6.2 While Lagı
PHP:
# kullanma
on join:
while player is online:
set player's fly speed to 0.1 # Yüksek ihtimal Timed Out yada Zaman Aşımı hatası verecektir.
# kullan
on join:
while player is online:
if player's fly speed is not 0.1: # eğer oyuncunun uçma hızı zaten 0.1 değilse
set player's fly speed to 0.1
wait 1 ticks # Oyuncu oyuna girdikten sonra her 1 tickte bir uçma hızını 0.1 yapar.
# ek: bugüne kadar hiç while kullanma ihtiyacı duymadım, loop işimi gördü, yeterli oldu.
6.3 Kombo Lag (Every + Loop yada While)
Bu başlığa örneği Loop Lagında vermiştik bu Kombo Lag dediğimiz olay Loop yada While kodlarını Every yada diğer çok fazla tetiklenen eventler altında kullanınca oluyor.
6.4 Optimize
PHP:
# amaç: online olan kişilere ait olan splere demir düşürmek.
# mantık & algoritma 1: tüm sp leri looplayıp online olan oyunculara ait olan sp'lere demir düşür.
every 5 seconds:
loop {spler::*}:
if {sahipler::%loop-value%} is online:
drop 1 iron ingot at loop-value
# mantık & algoritma 2: online olan oyunculara ait sp leri looplayıp demir düşür ve wait kullanarak lagı azalt.
every 5 seconds:
loop all players:
loop {spler::%loop-player%::*}:
drop 1 iron ingot at loop-value
wait 0.3 ticks
wait 0.1 ticks
6.5 Disk Tasarrufu
Evet burda size if kullanmayın on kullanmayın 2 harf tasarruf edin demicem tabiiki.
PHP:
# kullanma
on command "bukkit:me":
cancel event
on command "bukkit:help":
cancel event
on command "bukkit:?":
cancel event
# kullan
on command:
if command is "bukkit:me", "bukkit:help" or "bukkit:?":
cancel event
6.6 Veri Tasarrufu
PHP:
# kullanma
on join:
if {%player%.level} is not set:
set {%player%.level} to 0
on break of cobblestone:
add 1 to {%player%.level}
command /lvl:
trigger:
send "&cLevelin&f: &a%{%player%.level}%"
# kullan
on break of cobblestone:
add 1 to {level::%player%}
command /lvl:
trigger:
if {level::%player%} is not set:
set {_lvl} to 0 # geçici değişkenler event bittikten sonra silinir.
else:
set {_lvl} to {level::%player%}
send "&cLevelin&f: &a%{_lvl}%"
Evet konumuz bu kadar. Sorularınızı yorum olarak atabilirsiniz. Değiştirilmesini, iyileştirilmesini istediğiniz bir şey var ise yazabilirsiniz.
Son düzenleme: