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:¹
--!yerliprint("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
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:
- 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:

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.

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:
- İstemci/sunucu geçişi düğmesi aracılığıyla Sunucu görünümünde olduğunuzdan emin olun.
- 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.

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.