Profilowanie skryptów to narzędzie w Konsoli Dewelopera, które pozwala na rejestrowanie sesji profilowania wszystkich działających skryptów oraz przeglądanie ich kosztów czasowych CPU z niestandardowymi ustawieniami rejestracji i wyświetlania. Może rejestrować wszystkie typy wywołań funkcji, w tym funkcje Luau, wywołania metod i dostęp do właściwości. To narzędzie jest pomocne w identyfikacji skryptów, które zajmują najwięcej zasobów CPU i spowalniają wydajność.
Rejestracja sesji profilowania
Przed rozpoczęciem rejestracji musisz wybrać środowisko rejestracji z:
- Klient (Domyślnie) — Rejestruje skrypty po stronie klienta, w tym LocalScripts i Scripts z RunContext ustawionym na Client.
- Serwer — Rejestruje skrypty po stronie serwera, w tym Scripts z RunContext ustawionym na Server lub Legacy. Profilowanie skryptów czyści wszystkie zebrane dane po stronie serwera na koniec każdej sesji.
Możesz również ustawić następujące opcje rejestracji:
| Zachowanie | Opcje | Domyślnie | Opis |
|---|---|---|---|
| Częstotliwość | 1000 razy na sekundę (1 KHz) 10 000 razy na sekundę (10 KHz) | 1 KHz | Częstotliwość 10 KHz ma wyższą precyzję, ponieważ Profilowanie skryptów może nie uchwycić wywołań API, które wykonują się częściej niż wybrana częstotliwość, ale ma również wyższy koszt wydajności. |
| Długość sesji | 1 minuta 5 minut 10 minut Ręcznie | Ręcznie | Opcja ręczna wymaga, abyś ręcznie zatrzymał rejestrację. |
| Zachowanie na żywo | Włączone Wyłączone | Wyłączone | To zachowanie odświeża dane profilowania co sekundę podczas sesji profilowania. |
Aby zarejestrować nową sesję profilowania:
Otwórz Konsolę Dewelopera.
Rozwiń rozwijane menu narzędzi, aby wybrać ProfilowanieSkryptów.

Rozwiń rozwijane menu klient-serwer, aby wybrać Klient lub Serwer.

- OPCJONALNEZaznacz pole Na żywo, aby włączyć zachowanie odświeżania na żywo.
- OPCJONALNEWybierz Częstotliwość i Czas, aby wybrać częstotliwość rejestracji i długość sesji, jeśli nie chcesz używać wartości domyślnych.
Kliknij Rozpocznij, aby rozpocząć sesję profilowania. Jeśli ustawisz czas trwania, Profilowanie skryptów wyświetli licznik odliczający z pozostałym czasem w sesji.
Kliknij Zatrzymaj lub poczekaj, aż rejestracja się zakończy, aby wyświetlić dane profilowania.
Odczyt danych profilowania
Po zakończeniu sesji Profilowanie skryptów generuje tabelę pokazującą, ile czasu każde wywołanie funkcji kosztuje w czasie CPU. Tabela sortuje wywołania funkcji od najdłużej spędzonego czasu do najkrótszego, i pozwala na wyszukiwanie konkretnych funkcji po ich nazwie. Oferuje następujące dwa widoki:
- Callgraph (Domyślnie): Kategoryzuje i wyświetla wywołania funkcji w strukturze drzewa na podstawie zadań ramki. Ten widok wyświetla każdą kategorię zadań jako węzły pod tym samym korzeniem i pozwala na ich rozwijanie, aby zobaczyć funkcje. Możesz również najechać kursorem na dowolny węzeł w drzewie, aby zobaczyć informacje o pliku i linii. Na przykład, Stepped/CameraInput/<anonymous> może ujawnić Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125.

- Funkcje: Wymienia wszystkie funkcje bez kategoryzowania ich według zadań.

Możesz również wybrać spośród następujących opcji wyświetlania, aby dostosować swoje potrzeby debugowania:
| Nazwa | Opcje | Domyślnie | Opis |
|---|---|---|---|
| Jednostka | Milisekundy (ms) Procenty (%) | ms | Wyświetla czas spędzony na każdym wywołaniu API w milisekundach lub procentach całkowitej sesji rejestracji. |
| Średnia | Wyłączone 1 sekunda 1 minuta 5 minut 10 minut | Wyłączone | Oblicza średni czas spędzony na każdym wywołaniu API według wybranej wartości. Jeśli wybierzesz opcję, która jest dłuższa niż długość sesji, Profilowanie skryptów ekstrapoluje długość sesji, aby obliczyć średnią. Na przykład, możesz wybrać opcję 5 minut dla sesji 1-minutowej, aby zobaczyć oczekiwaną wartość średnią, jeśli uruchomisz kod przez 5 minut. |
Eksport danych profilowania
Profilowanie skryptów pozwala na eksportowanie zarejestrowanych danych profilowania jako plik JSON. Aby wyeksportować zarejestrowane dane po sesji profilowania:
W oknie Profilowania skryptów kliknij Eksportuj.
W oknie eksportu wybierz sesję profilowania, którą chcesz wyeksportować. Zmień domyślną nazwę pliku, jeśli chcesz ustawić niestandardową nazwę.
Kliknij Eksportuj, aby zapisać plik JSON.

Wyeksportowany plik JSON zawiera następujące pola:
- Wersja: Numer wersji.
- SessionStartTime: Znacznik czasu w milisekundach, który rejestruje czas rozpoczęcia sesji.
- SessionEndTime: Znacznik czasu w milisekundach, który rejestruje czas zakończenia sesji.
- Kategorie: Tablica kategorii zadań ramki zarejestrowanych w sesji profilowania. Każdy wpis zawiera:
- Nazwa: Nazwa każdej kategorii zadań ramki.
- NodeId: Unikalny identyfikator kategorii zadań (węzła). Jest to indeks oparty na 1 w tablicy Nodes. Na przykład, możesz znaleźć węzeł z NodeId równym 123, pobierając 123. element w Nodes.
- Węzły: Tablica węzłów zarejestrowanych w sesji profilowania. Każdy wpis zawiera:
- TotalDuration: Ilość czasu, który węzeł kosztuje w czasie CPU w mikrosekundach.
- FunctionIds: Tablica unikalnych identyfikatorów funkcji.
- NodeIds: Tablica identyfikatorów węzłów.
- Funkcje: Tablica funkcji zarejestrowanych w sesji profilowania.
- TotalDuration: Ilość czasu, który funkcja kosztuje w czasie CPU w mikrosekundach.
- Nazwa: Nazwa funkcji, jeśli dostępna.
- Źródło: Źródło funkcji, jeśli dostępne.
- Linia: Numer linii funkcji, jeśli dostępny.
- Flagi: Pole bitowe, które wskazuje na jakiekolwiek specyficzne środowisko wykonania funkcji. Obecnie może mieć następujące wartości:
- 0: 0. bit reprezentuje IsNative dla wykonania pod Native CodeGen.
- 1: 1. bit reprezentuje IsPlugin dla wykonania jako część wtyczki.
{
"Version":2,
"SessionStartTime":1704850750514,
"SessionEndTime":1704850751198,
"Categories":
[
{"Name":"Równoległy 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":"Skrypt","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}
]
}