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 bytecode yerine, CPU'ların çalıştırdığı makine kodu talimatlarıyla doğrudan derlenebilir. Bu özellik, özellikle çok fazla sayısal hesaplama yapan ve çok sayıda ağır Luau kütüphanesi veya Roblox API çağrısı kullanmayan bazı betiklerin sunucudaki yürütme hızını artırmak için kullanılabilir.

Yerel kod üretimini etkinleştirme

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 ve kâğıdın üst düzey kapsamı için, faydalı görülmesi durumunda yerel kod üretimini etkinleştirir. Ek bir değişiklik gerekli değildir; yerel olarak yürütülen betiklerin davranışı tam olarak önceki gibi aynı olup, 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 belirli bir işlev için yerel kod üretimini etkinleştirebilirsiniz:


@native
local function f(x)
return (x + 1)
end
1 Gelecekte, bazı betikler kâr sağlamak için yerel olarak çalıştırılmaya başlamış olabilir, ancak manuel olarak yerleştirilmiş --!native yorumları şu anda 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'da doğrudan çok fazla hesaplama yapan betikler içinde etkinleştirmeniz en iyisidir. Eğer tablolar üzerinde çok fazla matematiksel işlem yapıyorsanız ve özellikle buffer türlerine sahipseniz, betik iyi bir aday olabilir.

  • Sadece betiğin işlevleri yerel olarak derlenir. Dıştaki kapsam genellikle sadece bir kez yürütülür ve çok kez çağrılan işlevler kadar fayda sağlamaz, özellikle de her çerçeveyle çağrılanlar.

  • Yerel derlemenin ne zaman en iyi kullanılacağını belirlemek için bir betik veya işlevin aldığı zamanı ölçmeniz önerilir. Betik Profilleri aracı, bilgilendirilmiş kararlar almak için işlevlerin performansını ölçebilir.

  • Her betikte --!native yorumunu konumlandırma eğilimi cazip olabilir, ancak yerel kod üretiminin bazı dezavantajları vardır:

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

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

Kaçınılması gereken kod

Yerel kod üretimi etkinleştirildiğinde tüm özellikler aynı şekilde davranacak olsa da, bazıları yerel olarak çalışmayacak ve de‑optimize olma veya yorumlanan yürütmeye geçiş yapma riski taşıyabilir. Bunlar arasında:

  • Kullanımdan kaldırılmış getfenv()/setfenv() çağrıları.
  • math.asin() gibi Luau yerleşik işlevlerinin sayısal olmayan argümanlarla kullanılması.
  • Tiplendirilmiş işlevlere yanlış tipte parametrelerin geçirilmesi; örneğin, foo function foo(arg: string) olarak tanımlandığında foo(true) çağrılması. Her zaman doğru tip anotasyonlarını kullanmayı unutmayın.

Betik Profili aracını kullanırken, bir işlevin yerel olarak derlenmiş versiyonu ile normal versiyonu arasındaki zaman farkını karşılaştırabilirsiniz. --!native yorumuyla veya @native ile işaretlenmiş bir iç işlevin yerel olarak çalışmadığını görürseniz, yukarıdaki listedeki bir veya daha fazla faktör de‑optimize işlemini tetikliyor olabilir.

Tip anotasyonları kullanın

Yerel kod üretimi, eldeki bir değişken için en olası tipi tahmin etmeye çalışır, bu da kod yollarını optimize etmek için önemlidir. Örneğin, a + b işleminin sayılar üzerinde gerçekleştirileceği varsayılır veya t.X'de bir tablonun erişileceği düşünülür. Ancak, operatör aşırı yüklemesi nedeniyle, a ve b tablolar veya Vector3 türleri ya da t bir Roblox veri türü olabilir.

Yerel kod üretimi her türü desteklese de, yanlış tahminler gereksiz kontrol işlemlerine neden olabilir ve bu da daha yavaş kod yürütmesine yol açabilir.

Bazı yaygın sorunları çözmek için, işlev argümanlarında Luau tip anotasyonları kontrol edilmektedir, ancak Vector3 argümanlarını anot etmek özellikle ö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ımlandı; vektörler için özel 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 betikleri ve @native işlevleri için desteklenmektedir.

Hata Ayıklama

Betiğin genel hata ayıklaması desteklenmektedir, ancak yerel olarak yürütülen çerçevelerden değişkenlerin yerel/üst değişkenler görünümü eksik olabilir ve tamamlanmamış değişkenler içerebilir.

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

Betik Profili

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

Betik Profilinde yerel olarak işaretlenmiş işlevlerin örneği

@native ile işaretlenmiş bir işlev veya --!native betik içine yerleştirilmiş bir işlev <native> anotasyonunu göstermiyorsa, bu işlev yerel olarak çalışmıyor olabilir. Bu, kesme noktası yerleştirilmesi, kaçınılması gereken kod kullanılması veya uyuşmayan tip anotasyonları nedeniyle olabilir.

Luau yığında

Luau Yığın profili aracında, yerel işlevlerin kullandığı bellek, grafikte [native] öğeleri olarak görüntülenir.

Luau Yığın profilinde işaretlenmiş yerel bellek kullanımı örneği

Boyut analizi

Her yerel derlenmiş betik bellek kullanır. Derlenmiş kodun boyutu önceden tanımlanmış bir limite ulaştığında, yerel derleme durur ve kalan kod yerel olarak çalışmadan öylece yürütülür. Bu, yerel derleme için betikleri dikkatlice seçmenin önemini vurgular.

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

  1. client/server toggle 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ş betiklerin ve işlevlerin toplam sayısını, onların yerel kodunun kullandığı belleği ve yerel kod boyut limitini göreceksiniz. Özette, kod boyutuna göre azalan sırada her nitelikli betik için bir tablo göreceksiniz.

Çıktı penceresinde yerel kod boyutunun gösterildiği bir örnek.

Her betik için, derlenen işlev sayısını ve yerel kod bellek tüketimini gösterir. Daha sonra, her işlev yerel kod boyutuna azalan sırada listelenirken, anonim işlevler [anonymous] olarak ve tüm betikler [top level] olarak gösterilir. Son sütunda, yerel kod boyut limitine ilişkin yüzdelik hesaplanır. İşlevlerin yerel kod boyutu kesin olarak bildirilirken, betiklerin bellek tüketimi en yakın sayfa boyutuna yuvarlanmaktadır.

Sınırlamalar ve sorun giderme

Bir CPU için talimatları kodlamak fazladan depolama belleği gerektirir. Ayrıca, karmaşık işlevler için optimizasyonların gerçekleştirilmesi çok fazla zaman alabilir. İç sınıra ulaşılması, Stüdyo'nun Çıktı penceresinde bir hata raporlar, örneğin:

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

Bu hata, bir işlev içindeki tek bir kod bloğunun 64K'dan fazla talimat kullandığı anlamına gelir. Bu, işlevi basitleştirerek veya bireysel daha küçük işlevlere ayırarak önlenebilir.

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

Bu hata, bir işlevin 32K'dan fazla iç kod bloğuna sahip olduğunu gösterir. İç kod blokları, betiğinizdeki kontrol akış bloklarıyla tam olarak eşleşmez, ancak bu hata, işlevdeki kontrol akışını basitleştirerek veya bireysel daha küçük işlevlere ayırarak önlenebilir.

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

Bu hata, toplamda, işlevin tüm betik için 1 milyon talimat limitine ulaştığı anlamına gelir. Bazı durumlarda, rapor edilen işlevin kendisi çok sayıda talimata sahip olabilir veya limit, betiğin daha önce indirilen işlevleri tarafından ulaşı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 de deneyebilirsiniz, ancak 1 milyon talimat çok fazla bellek kaplayabilir ve bellek limitini aşabilirsiniz.

Fonksiyon 'f' 20. satırda dahili bir düşürme hatasıyla karşılaştı (veya)
Dahili hata: Yerel kod üretimi başarısız oldu (assembly lowering)

Bazen bir işlev, yerel kod derleyicisinin şu anda ele alamadığı karmaşık kod parçaları içerir. Bu hatayı önlemek için, kodda karmaşık ifadeleri kontrol edin ve bunları ayırın veya basitleştirin, ayrıca bu nedenle başarısız olan kodun bir örneği ile bir hata raporu açmayı düşünün.

Yerel kod üretimi için bellek tahsisat limiti aşıldı

Bu hata, yerel kod verileri için genel bellek limitinin aşıldığı anlamına gelir. Bunu önlemek için, daha fazla bellek tüketen betiklerden --!native kaldırmayı deneyerek, daha küçük betiklerin sınıra uymasını sağlayabilirsiniz. Alternatif olarak, büyük veya nadir ç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.