Yerel kod üretimi

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

Luau'nun yerel kod üretimi desteği ile oyununuzdaki sunucu tarafı betikleri, Luau VM'nin çalıştığı normal bayt kodu yerine, CPU'ların yürüttüğü makine kodu talimatlarına doğrudan derlenebilir. Bu özellik, özellikle çok sayıda sayısal hesaplama yapan ve çok fazla ağır Luau kütüphanesi veya Roblox API çağrısı kullanmayan betikler için sunucudaki yürütme hızını artırmak amacıyla kullanılabilir.

Yerel kod üretimini etkinleştirme

Bir Script için yerel kod üretimini etkinleştirmek için, en üstte --!native yorumunu ekleyin:¹

--!native
print("Yerel koddan merhaba!")

Bu, betikteki tüm işlevler için ve kârlı görülürse en üst düzey kapsam için yerel kod üretimini etkinleştirir. Ek bir değişiklik gerekmemektedir; yerel olarak yürütülen betiklerin davranışı tam olarak önceki gibi kalır ve yalnızca performans farklıdır. Luau dilinin tüm özellikleri ve tüm Roblox API'leri desteklenmeye devam etmektedir.

Alternatif olarak, @native niteliğini ekleyerek bireysel bir işlev için yerel kod üretimini etkinleştirebilirsiniz:

@native
local function f(x)
return (x + 1)
end
1 Gelecekte, bazı betikler kârlı olduğu tespit edilirse otomatik olarak yerel olarak çalışmaya başlayabilir, ancak şu anda manuel olarak yerleştirilen --!native yorumları gereklidir.

En iyi uygulamalar

Aşağıdaki ipuçları, yerel kod üretiminden en iyi şekilde yararlanmanıza yardımcı olacaktır:

  • Bu özelliği, Luau içinde çok sayıda hesaplama yapan betikler içinde etkinleştirmek en iyisidir. Eğer tablolar üzerinde çok sayıda matematiksel işlem yapıyorsanız ve özellikle buffer türleri ile çalışıyorsanız, betik iyi bir aday olabilir.

  • Sadece betiğin işlevleri yerel olarak derlenir. En üst dış kapsamdaki kod genellikle yalnızca bir kez yürütülür ve çok sayıda kez çağrılan işlevler kadar fayda sağlamaz, özellikle her çerçevede çağrılanlar.

  • Bir betiğin veya işlevin yerel derleme ile ne kadar zaman aldığını ölçmeniz önerilir. Betik Profili aracı, bilinçli kararlar almak için işlevlerin performansını ölçebilir.

  • Bazı betiklerin daha hızlı çalışması için her betikte --!native yorumunu yerleştirmek cazip gelebilir, ancak yerel kod üretiminin bazı dezavantajları vardır:

    • Kod derleme süresi gereklidir, bu da sunucuların başlangıç süresini artırabilir.
    • Yerel olarak derlenmiş kodu depolamak için ekstra bellek kullanılır.
    • Bir oyunda yerel olarak derlenmiş kod için toplam izin verilen miktar sınırlıdır.

Bu sorunlar, @native niteliğinin dikkatli kullanımı ile ele alınabilir.

Kaçınılması gereken kod

Tüm özellikler, yerel kod üretimi etkinleştirildiğinde veya etkinleştirilmediğinde aynı şekilde davranacak olsa da, bazıları yerel olarak çalışmayabilir ve de-optimizasyon veya yorumlanmış yürütmeye geri dönüşe neden olabilir. Bunlar arasında:

  • Kullanımdan kaldırılmış getfenv()/setfenv() çağrıları.
  • math.asin() gibi çeşitli Luau yerleşik işlevlerinin sayısal olmayan argümanlarla kullanımı.
  • Tipli işlevlere yanlış türde parametreler geçişi, örneğin foo function foo(arg: string) olarak tanımlandığında foo(true) çağrısı yapmak. Her zaman doğru tip açıklamalarını kullanmayı unutmayın.

Betik Profili kullanırken, bir işlevin normal versiyonu ile yerel olarak derlenmiş versiyonu arasındaki zaman farkını karşılaştırabilirsiniz. Bir --!native betiği içindeki veya @native ile işaretlenmiş bir işlevin yerel olarak çalışmadığını görüyorsanız, yukarıdaki listeden bir veya daha fazla faktör de-optimizasyonu tetikliyor olabilir.

Tip açıklamalarını kullanın

Yerel kod üretimi, belirli bir değişken için en olası türü çıkarmaya çalışır ve bu sayede kod yollarını optimize eder. Örneğin, a + b işleminin sayılar üzerinde yapıldığı varsayılır veya bir tablonun t.X içinde erişildiği düşünülür. Ancak, operatör aşırı yüklemesi nedeniyle, a ve b tablolar veya Vector3 türleri olabilir veya t bir Roblox veri türü olabilir.

Yerel kod üretimi her türü desteklese de, yanlış tahminler gereksiz kontrolleri tetikleyebilir ve bu da daha yavaş kod yürütmesine neden olabilir.

Bazı yaygın sorunları çözmek için, işlev argümanlarındaki Luau tip açıklamaları kontrol edilir, ancak özellikle Vector3 argümanlarını açıklamanız önerilir:

--!native
-- "v" bir tablo olarak varsayılır; tablo kontrolleri nedeniyle işlev daha yavaş çalışır
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- "v" bir Vector3 olarak tanımlanır; vektörler için özel kod üretilir
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end

Studio araçları

Aşağıdaki Studio araçları, --!native betikleri ve @native işlevleri için desteklenmektedir.

Hata ayıklama

Betiklerin genel hata ayıklaması desteklenmektedir, ancak yerel olarak yürütülen çerçevelerden çağrı yığını değişkenleri eksik olabilir.

Ayrıca, yerel derleme için seçilen kodu hata ayıklarken, kesme noktaları yerleştirmenin bu işlevler için yerel yürütmeyi devre dışı bırakacağını unutmayın.

Betik Profili

Betik Profili içinde, yerel olarak yürütülen işlevler yanında <native> gösterir:

Betik Profili'nde işaretlenmiş yerel işlevlerin örneği

@native ile işaretlenmiş veya --!native betiği içinde bulunan bir işlev <native> notasyonunu göstermiyorsa, bu işlev yerel olarak yürütülmüyor olabilir; bu, kesme noktası yerleştirilmesi, kaçınılması gereken kod kullanımı veya uyumsuz tip açıklamaları nedeniyle olabilir.

Luau yığını

Luau yığını profili içinde, yerel işlevler tarafından kullanılan bellek, grafikte [native] öğeleri olarak gösterilir.

Luau Yığın profili'nde işaretlenmiş yerel bellek kullanımının örneği

Boyut analizi

Her yerel olarak derlenmiş betik bellek tüketir. Derlenmiş kodun boyutu önceden tanımlanmış bir sınıra ulaştığında, yerel derleme durur ve kalan kod yorumlanmış olarak çalıştırılır. Bu, yerel derleme için betikleri dikkatlice seçmeyi gerekli kılar.

Bireysel işlevlerin ve betiklerin yerel kod boyutunu izlemek için:

  1. istemci/sunucu geçişi düğmesi aracılığıyla Sunucu görünümünde olduğunuzdan emin olun.
  2. Komut Çubuğu üzerinden debug.dumpcodesize() çağrısını yapın.

Çıktı penceresinde, çağrının yapıldığı noktaya kadar yerel olarak derlenmiş toplam betik ve işlev sayısını, yerel kodlarının tükettiği belleği ve yerel kod boyut sınırını göreceksiniz. Özeti takiben, her yerel olarak derlenmiş betik için kod boyutuna göre azalan sırada bir tablo göreceksiniz.

Çıktı penceresinde gösterilen yerel kod boyutunun örneği.

Her betik için, derlenen işlev sayısı ve yerel kod bellek tüketimi görüntülenir. Her işlev, yerel kod boyutuna göre azalan sırada listelenir; anonim işlevler [anonymous] olarak ve tüm betikler [top level] olarak gösterilir. Son sütunda, yerel kod boyut sınırına göre yüzde hesaplanır. İşlevlerin yerel kod boyutu kesin olarak rapor edilir, ancak betiklerin bellek tüketimi en yakın sayfa boyutuna yuvarlanır.

Sınırlamalar ve sorun giderme

Kodun belirli bir CPU için talimatlara derlenmesi ek depolama belleği gerektirir. Ayrıca, karmaşık işlevler için optimizasyonlar gerçekleştirmek çok fazla zaman alabilir. Bir iç sınır aşıldığında, Studio'nun Çıktı penceresinde bir hata rapor edilir, bu hata mesajları şunları içerebilir:

Fonksiyon 'f' 20. satırda tek kod bloğu talimat sınırını aştı

Bu hata, bir işlev içindeki tek bir kod bloğunun 64K talimattan fazla kullanıldığı anlamına gelir. Bu, işlevi basitleştirerek veya onu daha küçük bireysel işlevlere bölerek önlenebilir.

Fonksiyon 'f' 20. satırda işlev kod bloğu sınırını aştı

Bu hata, tek bir işlevin 32K iç kod bloğundan fazla içerdiği anlamına gelir. İç kod blokları, betiğinizdeki kontrol akışı bloklarıyla tam olarak eşleşmez, ancak bu hata, işlevdeki kontrol akışını basitleştirerek veya onu daha küçük bireysel işlevlere bölerek önlenebilir.

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

Bu hata, toplamda işlevin tüm betik için 1 milyon talimata ulaştığı anlamına gelir. Bazı durumlarda, bildirilen işlevin kendisi çok sayıda talimata sahip olabilir veya sınır, betikteki daha önceki işlevler tarafından aşılmış olabilir. Bu sorunu önlemek için, özellikle büyük işlevleri ayrı bir yerel olmayan betiğe taşımak veya diğer işlevlerde @native kullanmak önerilir. Ayrıca, o ayrı betiği --!native ile işaretlemeyi deneyebilirsiniz, ancak 1 milyon talimat çok fazla bellek kaplar ve bellek sınırını aşabilirsiniz.

Fonksiyon 'f' 20. satırda iç düşürme hatasıyla karşılaştı (veya)
Iç hata: Yerel kod üretimi başarısız oldu (montaj düşürme)

Bazen bir işlev, yerel kod derleyicisinin şu anda işleyemediği karmaşık kod parçaları içerir. Bu hatayı önlemek için, koddaki karmaşık ifadeleri inceleyin ve bunları bölün veya basitleştirin, ayrıca bu nedenle başarısız olan kod örneği ile bir hata raporu açmayı da düşünün.

Yerel kod üretimi için bellek tahsis sınırı aşıldı

Bu hata, yerel kod verileri için genel bellek sınırının aşıldığı anlamına gelir. Bunu önlemek için, daha fazla bellek tüketen betiklerden --!native kaldırmayı deneyin, böylece daha küçük betiklerin sınırın altında kalmasına izin verin. Alternatif olarak, büyük veya nadiren çağrılan işlevleri ayrı bir yerel olmayan modüle taşıyın.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.