Script Profiler, tüm çalışan scriptlerin profilini kaydetmenizi ve özel kayıt ve görüntüleme ayarları ile CPU zaman maliyetlerini görmenizi sağlayan bir Developer Console aracıdır. Luau fonksiyonları, metod çağrıları ve özellik erişimleri dahil olmak üzere tüm fonksiyon çağrılarının kaydını tutabilir. Bu araç, en fazla CPU kaynaklarını tüketen ve performansı yavaşlayan scriptleri tanımlamak için yararlıdır.
Profiling oturumlarını kaydetme
Kayıttan önce, kayıt ortamını seçmeniz gerekir:
- İstemci (Varsayılan) — LocalScripts ve Scripts için RunContext ayarı Client olan istemci tarafı scriptlerini kaydeder.
- Sunucu — Scripts için RunContext ayarı Server veya Legacy olan sunucu tarafı scriptlerini kaydeder. Script Profiler, her oturumun sonunda toplanan tüm sunucu tarafı verilerini temizler.
Aşağıdaki kayıt seçeneklerini de ayarlayabilirsiniz:
| Davranış | Seçenekler | Varsayılan | Açıklama |
|---|---|---|---|
| Sıklık | Saniyede 1000 kez (1 KHz) Saniyede 10,000 kez (10 KHz) | 1 KHz | 10 KHz sıklığı daha yüksek hassasiyet sunar, çünkü Script Profiler, seçtiğiniz sıklıktan daha sık gerçekleştirilen API çağrılarını yakalayamayabilir, ancak daha yüksek bir performans maliyetine sahiptir. |
| Oturum Süresi | 1 dakika 5 dakika 10 dakika Manuel | Manuel | Manuel seçenek, kaydı manuel olarak durdurmanızı gerektirir. |
| Canlı Anket Davranışı | Açık Kapalı | Kapalı | Bu davranış, bir profil oluşturma oturumu sırasında her saniye profil verilerini sorgular ve yeniler. |
Yeni bir profil oluşturma oturumu kaydetmek için:
Developer Console açın.
ScriptProfiler seçeneği için araç menüsünü genişletin.

İstemci-sunucu açılır menüsünü genişleterek İstemci veya Sunucu seçin.

(İsteğe bağlı) Canlı anket davranışını etkinleştirmek için Canlı onay kutusunu işaretleyin.
(İsteğe bağlı) Varsayılan değerleri kullanmak istemiyorsanız kayıt sıklığı ve oturum süresi uzunluğunu seçmek için Sıklık ve Zamanı seçin.
Profil oluşturma oturumuna başlamak için Başlat butonuna tıklayın. Bir süre belirlediyseniz, Script Profiler oturumun kalan süresini gösteren bir geri sayım sayacı görüntüler.
Profil verilerini görüntülemek için Durdur'a tıklayın veya kaydın bitmesini bekleyin.
Profil verilerini okuma
Bir oturum durduktan sonra, Script Profiler her fonksiyon çağrısının CPU zamanı maliyetinin ne kadar sürdüğünü gösteren bir tablo oluşturur. Tablo, fonksiyon çağrılarını en çok harcanan zamandan en az harcanan zamana sıralar ve adlarına göre belirli fonksiyonları aramanıza olanak tanır. Aşağıdaki iki görüntüyü sağlar:
- Callgraph (Varsayılan): Fonksiyon çağrılarını çerçeve görevlerine göre bir ağaç yapısında kategoriler ve görüntüler. Bu görünüm, her görev kategorisini aynı kökün altında düğümler olarak gösterir ve fonksiyonları görüntülemek için genişletmenize izin verir. Ayrıca, ağaçtaki herhangi bir düğümün üzerine gelerek dosya ve satır bilgilerini görüntüleyebilirsiniz. Örneğin, Stepped/CameraInput/<anonymous> belki Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125 bilgisini ortaya çıkarabilir.

- Fonksiyonlar: Tüm fonksiyonları görevlere göre kategorize etmeden listeler.

Ayrıca, hata ayıklama ihtiyaçlarınıza göre özelleştirmek için aşağıdaki görüntüleme seçeneklerinden seçim yapabilirsiniz:
| Ad | Seçenekler | Varsayılan | Açıklama |
|---|---|---|---|
| Birimi | Milisaniye (ms) Yüzde (%) | ms | Her API çağrısı için harcanan zamanı milisaniyeler veya toplam kayıt oturumu yüzdeleri cinsinden gösterir. |
| Ortalama | Kapalı 1 saniye 1 dakika 5 dakika 10 dakika | Kapalı | Seçilen değere göre her API çağrısında harcanan ortalama süreyi hesaplar. Oturum süresinden daha uzun bir seçeneği seçerseniz, Script Profiler ortalama hesaplamak için oturum süresini uzatır. Örneğin, 1 dakikalık oturum için 5 dakika seçeneğini seçtiğinizde, kodu 5 dakika çalıştırmayı bekleyen ortalama değeri görebilirsiniz. |
Profil verilerini dışa aktarma
Script Profiler, kayıtlı profil verilerini JSON dosyası olarak dışa aktarmanıza olanak tanır. Profil oluşturma oturumu sonrası kayıtlı verileri dışa aktarmak için:
Script Profiler penceresinde Dışa Aktar'a tıklayın.
Dışa aktarma penceresinde dışa aktarmak istediğiniz profil oluşturma oturumunu seçin. Varsayılan dosya adını değiştirmezseniz özel bir ad ayarlayabilirsiniz.
JSON dosyasını kaydetmek için Dışa Aktar'a tıklayın.

Dışa aktarılan JSON dosyası aşağıdaki alanları içerir:
- Versiyon: Versiyon numarası.
- SessionStartTime: Oturum başlangıç zamanını kaydeden milisaniye cinsinden bir zaman damgası.
- SessionEndTime: Oturum bitiş zamanını kaydeden milisaniye cinsinden bir zaman damgası.
- Kategoriler: Profil oluşturma oturumunda kaydedilen çerçeve görev kategorilerinin bir dizisi. Her giriş şunları içerir:
- Ad: Her çerçeve görev kategorisinin adı.
- NodeId: Bir görev kategorisinin (düğüm) benzersiz tanımlayıcısıdır. Nodes dizisi içinde 1 tabanlı bir indekstir. Örneğin, NodeId'si 123 olan düğümü, Nodes dizisindeki 123. öğeyi alarak bulabilirsiniz.
- Düğümler: Profil oluşturma oturumunda kaydedilen düğümlerin bir dizisi. Her giriş şunları içerir:
- ToplamSüre: Düğümün CPU zamanında harcadığı süre milisaniye cinsindendir.
- FunctionIds: Benzersiz fonksiyon tanımlayıcılarının bir dizisi.
- NodeIds: Düğüm kimliklerinin bir dizisi.
- Fonksiyonlar: Profil oluşturma oturumunda kaydedilen fonksiyonların bir dizisi.
- ToplamSüre: Fonksiyonun CPU zamanında harcadığı süre milisaniye cinsindendir.
- Ad: Fonksiyonun adı, mevcutsa.
- Kaynak: Fonksiyonun kaynağı, mevcutsa.
- Satır: Fonksiyonun satır numarası, mevcutsa.
- Bayraklar: Belirli bir fonksiyon yürütme ortamını gösteren bir bit alanıdır. Mevcut durumda şu değerleri alabilir:
- 0: 0. bit, Native CodeGen altında IsNative için temsil eder.
- 1: 1. bit, bir eklentin parçası olarak IsPlugin için temsil eder.
Örnek Dışa Aktarılan Profil Verileri
{
"Version":2,
"SessionStartTime":1704850750514,
"SessionEndTime":1704850751198,
"Categories":
[
{"Name":"Paralel Luau","NodeId":4},
{"Name":"Heartbeat","NodeId":1}
],
"Nodes":
[
{"TotalDuration":2530,"FunctionIds":[1],"NodeIds":[2]},
{"TotalDuration":2530,"FunctionIds":[2,5],"NodeIds":[3,7]},
{"TotalDuration":1267},
{"TotalDuration":7746,"FunctionIds":[3],"NodeIds":[5]},
{"TotalDuration":7746,"FunctionIds":[4],"NodeIds":[6]},
{"TotalDuration":7746},
{"TotalDuration":1263,"FunctionIds":[6],"NodeIds":[8]},
{"TotalDuration":1263,"FunctionIds":[7],"NodeIds":[9]},
{"TotalDuration":1263,"FunctionIds":[8],"NodeIds":[10]},
{"TotalDuration":1263}
],
"Functions":
[
{"Name":"main","TotalDuration":2530},
{"Source":"builtin_ManageCollaborators.rbxm.ManageCollaborators.Packages._Index.roblox_rodux-3.0.0.rodux.Store","Line":81,"TotalDuration":1267},
{"Name":"Script","TotalDuration":7746},
{"Source":"Workspace.Actor.Script","Line":1,"TotalDuration":7746},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Line":221,"TotalDuration":1263},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Name":"_update","Line":236,"TotalDuration":1263},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Name":"_getRange","Line":277,"TotalDuration":1263},
{"Source":"[C]","Name":"ScrollingFrame.CanvasPosition","TotalDuration":1263}
]
}