Yerel kod oluşturma

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Yerel kod oluşturma için Luau desteği ile, deneyiminizdeki sunucu tarafı kodları, Luau VM'nin çalıştığı düzenli bytecode yerine doğrudan makine kodu talimatlarına derlenebilir.Bu özellik, sunucudaki bazı kodların yürütme hızını artırmak için kullanılabilir, özellikle çok fazla ağır Luau kütüphanesi veya Roblox API çağrısı kullanmadan çok fazla sayıda sayısal hesaplama yapanlar.

Yerel kod oluşturmayı etkinleştir

Bir Script için yerel kod oluşturmayı etkinleştirmek için, en üste --!native yorum ekleyin:¹


--!yerli
print("Hello from native code!")

Bu, senaryodaki tüm işlevler için yerel kod oluşturma ve üst düzey kapsama izni verir, eğer kârlı görülürse.Ek değişiklikler gerekmiyor; yerel olarak çalıştırılan kodların davranışı öncekiyle aynıdır ve sadece performans farklıdır.Luau dili ve tüm Roblox API'lerinin tüm özellikleri desteklenir.

Alternatif olarak, bir tek işlev için yerel kod oluşturma etkinleştirebilirsiniz, çünkü @native özniteliğini ekleyerek:


@native
local function f(x)
return (x + 1)
end
1 Gelecekte, bazı kodlar otomatik olarak kârlı olarak başlatılabilir, ancak manuel olarak yerleştirilen --!native yorumlar şu anda gerekli.

En iyi uygulamalar

Aşağıdaki ipuçları, yerel kod oluşturmadan en çok yararlanmanıza yardımcı olacaktır:

  • Bu özelliği doğrudan Luau içinde çok fazla hesaplama yapan senaryolarda etkinleştirmek en iyisidir.Masalarda ve özellikle buffer türlerinde çok sayıda matematiksel işlem varsa, senaryo iyi bir aday olabilir.

  • Sadece senaryonun fonksiyonları doğrudan derlenir.Üst dış alanındaki kod genellikle yalnızca bir kez yürütülür ve çok kez çağrılan işlevler kadar fayda sağlamaz, özellikle de her kare çağrılanlar.

  • Bir senaryonun veya işlevin yerel derleme ile veya olmadan ne kadar süre aldığını ölçmeniz, bunu kullanmanın en iyi zamanını yargılamak için önerilir.Kript Profilleyici aracı, bilgilendirilmiş kararlar vermek için işlevlerin performansını ölçebilir.

  • yorumunu herhangi birinde daha hızlı çalışması durumunda bazılarının yerine koyulması cezbedici olabilir, ancak yerel kod oluşturma bazı dezavantajlara sahiptir:

    • Kod derleme süresi gereklidir ve bu da sunucuların başlatma süresini artırabilir.
    • Doğrudan derlenmiş kodu depolamak için ekstra bellek kullanılır.
    • Deneyimde doğrudan derlenmiş kodun toplam izin verilen miktarına bir sınır var.

Bu sorunlar, @native özniteliğinin dikkatli bir şekilde kullanılmasıyla ele alınabilir.

Kaçınmak için kod

Tüm özellikler, yerli kod oluşturma etkinleştirilmiş veya etkisiz olsa da, bazıları yerel olarak çalışmayacak ve yorumlanmış yürütümün azaltılmasına veya geri dönüşüme neden olabilir.Bunlar şunları içerir:

  • Geçersiz getfenv() / setfenv() çağrılarının kullanımı.
  • Luau yerleşik işlevlerin çeşitli kullanımı, sayısal olmayan argümanlarla math.asin() gibi.
  • Yazılı fonksiyonlara yanlış yazılmış parametler geçmek, örneğin foo(true) , foo , function foo(arg: string) olarak ilan edildiğinde çağrılmak gibi, yazılı fonksiyonlara yanlış yazılmış parametler geçmekHer zaman doğru tip annotasyonları kullanmayı unutmayın.

Kript Profilleyici kullanırken, işlevin düzenli bir versiyonunun doğrudan derlenen versiyonla karşılaştırılan süresini karşılaştırabilirsiniz.Bir işlev içindeki çalıştırılıyor gibi görünmüyorsa, yukarıdaki listeden bir veya daha fazla faktör de- optimizasyonu tetikleyebilir.

Tip işaretlemelerini kullan

Yerel kod oluşturma girişimleri, kod yollarını optimize etmek için verilen değişken için en olası türü tahmin etmeye çalışır.Örneğin, a + b 'nin sayılara yapıldığı veya bir tablonun t.X 'a erişildiği varsayılır.Ancak, operatörün aşırı yüklenmesi nedeniyle, a ve b tablolar veya Vector3 türleri veya t Roblox veri türü olabilir.

Yerel kod oluşturma herhangi bir yazdesteklerken, yanlış tahminler gereksiz kontroller tetikleyebilir ve daha yavaş kod yürütmesine neden olabilir.

Bazı yaygın sorunları çözmek için, Luau, işlev argümanlarına anotasyon ekler, ancak özellikle Vector3 argümanlarına anotasyon yapılması önerilir:


--!yerli
-- v" bir tablo olduğu varsayılır; işlev, tablo kontrolleri nedeniyle daha yavaş çalışır
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- V" bir Vector3 olarak ilan edilir; vektörler için özelleştirilmiş kod üretilir
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end

Stüdyo araçları

Aşağıdaki Stüdyo araçları --!native senaryoları ve @native fonksiyonları için desteklenir.

Sorun giderme

Genel kod yazımı denetimi desteklenir, ancak yerel/üst değerler için görüşler tamamlanmamış ve doğrudan çalıştırılan çağrı yığını karelerinden eksik değişkenler olabilir.

Ayrıca, yerel derleme için seçilen kodu depururken, bozma noktaları yerleştirmek, bu işlevler için yerel çalışmayı devre dışı bırakacaktır.

Senaryo Profilleyici

Kript Profili 'de, yerel olarak çalışan işlevler bunların yanında <native> görüntüler:

Example of native functions flagged in the Script Profiler

Eğer bir işlev işaretlendi veya bir içindeki çalışma kırma noktasına yerleştirildiğinde çalışma kırma noktasına yerleştirildiğinde, bu işlev doğrudan çalıştırılmıyor olabilir, çünkü kırılma noktasına yerleştirilmiş kod kullanılıyor, veya uyumsuz kod türü anlatımı kullanılıyor.

Luau yığını

Luau yığını profilinde, yerli işlevler tarafından alınan bellek grafikte [native] elemanları olarak görüntülenir.

Example of native memory usage flagged in the Luau Heap profiler

Boyut analizi

Her yerli olarak derlenmiş senaryo bellek tüketir.Derlenmiş kodun boyutu belirlenen bir sınıra ulaştığında, yerel derleme durur ve kalan kod yerel olarak çalıştırılmaz.Bu, yerel derleme için kodları dikkatlice seçmeniz gerektiğini gösterir.

Bireysel işlevlerin ve senaryoların yerel kod boyutunu izlemek için:

  1. İstemci/sunucu geçişi düğmesi aracılığıyla Sunucu görünümünde olduğunuzdan emin olun.
  2. debug.dumpcodesize() çağır > .

Çıktı penceresinde, çağrı noktasına kadar doğrudan derlenmiş olan tüm senaryo ve işlev sayısını, yerli kodlarının tüketilen belleğini ve yerli kod boyutu sınırını göreceksiniz.özetardından, kod büyüklüğü azalan sırayla her yerli olarak derlenmiş kript için bir tablo göreceksiniz.

Example of native code size displayed in the Output window.

Her senaryo için, çıktı derlenen işlev sayısını ve yerel kod hafıza tüketimini gösterir.Her işlev daha sonra yerel kod boyutuna göre azalan sırayla listelenir ve anonim işlevler [anonymous] ve tüm senaryolar [top level] olarak gösterilir.Son sütunda, yüzde doğrudan kod boyutu sınırına göre hesaplanır.Yerel işlev kodu boyutunun doğru bildirildiğini, ancak senaryo için bellek tüketimi en yakın sayfa boyutuna yuvarlandığını unutmayın.

Sınırlar ve sorun giderme

Belirli bir CPU için kodu talimatlara dönüştürmek, ekstra depolama belleği gerektirir.Ayrıca, karmaşık işlevler için optimizasyonların gerçekleşmesi çok fazla süre alabilir.Dahili bir sınıra vurmak, Studio'nun Çıkış penceresinde bir hata bildirir, içinde:

İşlev 'f' 20. satırda tek kod blok talimat sınırını aştı

Bu hata, işlev içindeki tek bir kod bloğunun 64K'dan fazla talimat kullandığını gösterir.Bu, işlevi basitleştirerek veya bunu daha küçük bireysel işlevlere bölerek önlenebilir.

İşlev 'f' 20. satırda işlev kodu blok sınırını aştı

Bu hata, tek bir işlevin 32K'dan fazla kod bloğu içerdiğini gösterir.Kodun iç blokları, senaryonuzdaki kontrol akışı bloklarına kesinlikle eşleşmiyor, ancak bu hata, işlevdeki kontrol akışını basitleştirerek veya bölerek önlenebilir.

İşlev 'f' 200. satırda toplam modül talimat sınırını aştı

Bu hata, toplam olarak, işlevin tüm senaryo için 1 milyon talimat sınırına ulaştığını gösterir.Bazı durumlarda, bildirilen işlevin kendisi çok fazla talim içerebilir veya sınır, senaryoda daha önce işlevler tarafından ulaşılmış olabilir.Bu sorundan kaçınmak için, özellikle büyük işlevleri ayrı bir yabancı kriptoya taşımak veya diğer işlevler üzerinde @native kullanmak önerilir.Ayrı kodu --!native ile işaretlemeyi deneyebilirsiniz, ancak 1 milyon talimat çok fazla bellek alır ve bellek sınırını aşabilirsiniz.

*İşlev 'f' 20. satırda bir iç düşürme başarısızlığı ile karşılaştı *(veya) İç hata: Yerel kod oluşturma başarısız oldu (montaj düşürmesi)

Bazen bir işlev yerel kod derleyicisinin şu anda ele alamayacağı karmaşık kod parçaları içerir.Bu hatayı önlemek için, koddaki karmaşık ifadeleri inceleyin ve bunun nedeniyle başarısız olan kod örnekleriyle bir hata raporu açmayı düşünün, ancak ayrıca bu nedenle başarısız olan kodun bir örneğiyle bir hata raporu açmayı da düşünün.

Yerel kod oluşturma için bellek atama sınırına ulaşıldı

Bu hata, yerli kod verileri için genel hafıza sınırına ulaşıldığını gösterir.Bunu önlemek için, daha fazla hafıza gerektiren kodlardan --!native kaldırmayı deneyin, böylece daha küçük kodlar sınırın altına sığabilir.Alternatif olarak, büyük veya sıkça çağrılmayan işlevleri ayrı bir yabancı modüle taşıyın.