Skript Lag, Bug ve Donma Çözümü; Skript'den Kaynaklı Sorunları Çözün!

LifeMCServer

Nether Yerlisi
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;

  • 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

  • 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ı

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:

ByCenk

Taş Madencisi
Mesajlar
93
En iyi cevaplar
0
Beğeniler
38
Puanları
110
Umarım Gelişmeye Ve Geliştirmeye Devam Edersiniz Başarılar.
 

VictoryAndGlory

Kızıltaş Madencisi
Mesajlar
502
En iyi cevaplar
0
Beğeniler
271
Puanları
790
Disk Tasarrufu denilen şey bana göre tamamen uydurma bir olay. CSS, Javascript gibi dillerin kullanıldığı dosyalar client sided olduğu için gereksiz boşluklar silinir çünkü siteye bağlanan her kullanıcıya bu dosyalar gönderilir (ki küçük dosyalarsa gözle görülür, hissedilir hiçbir farkı olmaz). Ancak skript dosyaları sadece sunucu açılırken yüklenir ve kullanıcının clientine bu dosyaların içeriği gönderilmez. Sadece sunucu açılırken veya sk reload çekilirken kullanılacak dosyayı nanosaniyelik bir load hızı farkı için kısaltmaya uğraşmanın mantığı nedir?
 

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
Disk Tasarrufu denilen şey bana göre tamamen uydurma bir olay. CSS, Javascript gibi dillerin kullanıldığı dosyalar client sided olduğu için gereksiz boşluklar silinir çünkü siteye bağlanan her kullanıcıya bu dosyalar gönderilir (ki küçük dosyalarsa gözle görülür, hissedilir hiçbir farkı olmaz). Ancak skript dosyaları sadece sunucu açılırken yüklenir ve kullanıcının clientine bu dosyaların içeriği gönderilmez. Sadece sunucu açılırken veya sk reload çekilirken kullanılacak dosyayı nanosaniyelik bir load hızı farkı için kısaltmaya uğraşmanın mantığı nedir?

Disk Tasarrufu olayını ben çıkartmadım. Bende karşıyım zaten(Okunurluğu bozuyor, yenilerin kafalarını karıştırıyor ve ortalıkta bu daha lagsız diye skriptlerin "Disk Tasarruflu" halleri paylaşılıyor; konuda lagla uzaktan yakından alakası olmadığını belirttim). Fakat yinede sunucu açılışında ve reload atarken etki ediyor. Çok fazla Skript'in yoksa hiçbir gerekliliği yok, fakat bi ara test sunucumdaki skriptler 2dk'da yükleniyordu (ciddi) Bunu bahsettiğin dillerdeki sitenin açılışıyla benzetmiştim fakat haklısın. Clientle(kullanıcı ve onun web tarayıcısı) alakalı bir durum yok ortada. Bu sorun büyük ihtimal Skript'in dosyaları yavaş okumasından yada kullanılan diskten kaynaklıdır. Süreler sunucudan sunucuya değişiklik göstersede çoğu sistemini Skript ile yapan biriyseniz bir süre sonra açılış hızının Skript sayesinde ek +1,2,3 dk sonra açıldığını göreceksiniz. Bahsettiğin dilleri küçültmek site açılışını hızlandırır çünkü client dosyaları daha hızlı indirir. Fakat burada client'in internetinin yavaşlığından dolayı da site yavaş açılabilir. Bu ise tamamen sunucuyla alakalı.


Paralı skript yapıyormusunuz?

Skype: mustafaoncel92 adresinden ulaşıp isteğinizi gönderin. Sonrasında zorluğuna ve alacağı vakte göre gerek ücretsiz gerek ücretli yapmaya çalışırım.
 

aroSas

Zombi Katili
Mesajlar
236
En iyi cevaplar
0
Beğeniler
29
Puanları
200
Ruh hali
Okumaya üşendim yazmaya üşenmedinmi ? :) Başarıların devamını dilerim..
 

Blueyescat

Bedrock Kaşifi
Mesajlar
1,656
En iyi cevaplar
0
Beğeniler
1,177
Puanları
3,120
Ruh hali
Doğru birkaç kısım olsa da konunun çok büyük bir kısmı bilgisizce yazılmış, bence bu konuyu kapatmalısın çünkü tek yapacağı insanları yanlış yönlendirmek olur. Veya kendin düzgün testler yapıp sadece emin olduğun bilgileri yazabilirsin.
 
Son düzenleme:

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
Doğru birkaç kısım olsa da konunun çok büyük bir kısmı bilgisizce yazılmış, bence bu konuyu kapatmalısın çünkü tek yapacağı insanları yanlış yönlendirmek olur. Veya kendin düzgün testler yapıp sadece emin olduğun bilgileri yazabilirsin.

Öncelikle yorumun için teşekkürler,

Bu konuyu hazırlarken bilinmeyen nedenlerden dolayı sunucumda çok yoğun lag mevcuttu ve timings lagı Skript'de gösteriyordu. Bende birçok test yaptım ve bu sonuçlara ulaştım. Konunun büyük bir kısmını da gece hazırladım ve aklıma gelenleri yazdım. Sunucum skript yüzünden 3 dakikada açılıyordu. birçok Skript mevcuttu. Daha sonrasında birçok şey denedim, skriptlerin çoğunu javaya geçirmeye çalıştım. En son bir makine değişikliği yaptım ve sorunumun çoğu çözüldü. Belki yazdıklarım yeni Skript versiyonlarında vs. geçerli olmayabilir fakat bana göre çoğu doğru. Sunucumu veri kaybı olmaması için üst sürümlere geçirmiyorum, 2 yıldır açık sunucum ve bir sürü kişinin emeği mevcut. Konuyu kaldırma gibi bir planım yok. Tekrardan teşekkürler..
 

Üst