Profiler skryptów to narzędzie w Konsoli Dewelopera, które pozwala na rejestrowanie sesji profilowania wszystkich uruchomionych skryptów oraz przeglądanie ich kosztów czasu CPU z niestandardowymi ustawieniami nagrywania 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 wykorzystują najwięcej zasobów CPU i spowalniają wydajność.
Rejestruj sesje profilowania
Przed rozpoczęciem nagrywania musisz wybrać środowisko nagrywania:
- Klient (domyślnie) — Rejestruje skrypty po stronie klienta, w tym LocalScripts oraz Scripts z RunContext ustawionym na Client.
- Serwer — Rejestruje skrypty po stronie serwera, w tym Scripts z RunContext ustawionym na Server lub Legacy. Profiler skryptów usuwa wszystkie zebrane dane po stronie serwera na końcu każdej sesji.
Możesz także ustawić poniższe opcje nagrywania:
| 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ż Profiler skryptów może nie wykrywać wywołań API, które są wykonywane częściej niż wybrana częstotliwość, ale wiąże się z wyższym kosztem wydajności. |
| Długość sesji | 1 minuta 5 minut 10 minut Ręcznie | Ręcznie | Opcja ręczna wymaga od Ciebie ręcznego zatrzymania nagrywania. |
| Zachowanie w czasie rzeczywistym | Włączone Wyłączone | Wyłączone | To zachowanie ankietuje i 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ć ScriptProfiler.

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

(Opcjonalnie) Zaznacz pole wyboru Na żywo, aby włączyć zachowanie ankiety w czasie rzeczywistym.
(Opcjonalnie) Wybierz Częstotliwość i Czas, aby wybrać częstotliwość nagrywania 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, Profiler skryptów wyświetli licznik odliczający pozostały czas w sesji.
Kliknij Zatrzymaj lub poczekaj, aż nagrywanie się zakończy, aby wyświetlić dane profilowania.
Odczytaj dane profilowania
Po zakończeniu sesji, Profiler 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 do najkrócej trwających, a także pozwala na wyszukiwanie konkretnych funkcji po ich nazwie. Dostarcza następujące dwa widoki:
- Callgraph (domyślnie): Kategoryzuje i wyświetla wywołania funkcji w strukturze drzewiastej na podstawie zadań ramki. Ten widok wyświetla każdą kategorię zadań jako węzły pod tym samym korzeniem i pozwala na ich rozwinięcie, aby zobaczyć funkcje. Możesz także 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: Wypisuje wszystkie funkcje bez kategoryzacji 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 |
|---|---|---|---|
| Jeden | Milisekundy (ms) Procenty (%) | ms | Wyświetla czas spędzony na każdym wywołaniu API w milisekundach lub procentach całkowitej sesji nagrywania. |
| Ś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, Profiler 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. |
Eksportuj dane profilowania
Profiler skryptów umożliwia eksportowanie zarejestrowanych danych profilowania jako pliku JSON. Aby wyeksportować zarejestrowane dane po sesji profilowania:
W oknie Profilera skryptów kliknij Eksportuj.
W oknie eksportu wybierz sesję profilowania, którą chcesz wyeksportować. Zmień domyślną nazwę pliku, jeśli chcesz ustawić własną nazwę.
Kliknij Eksportuj, aby zapisać plik JSON.

Wyeksportowany plik JSON zawiera następujące pola:
- Wersja: Numer wersji.
- SessionStartTime: Znak czasowy w milisekundach, który rejestruje czas rozpoczęcia sesji.
- SessionEndTime: Znak czasowy 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ęzeł). Jest to indeks oparty na 1 w tablicy Nodes. Na przykład, możesz znaleźć węzeł o 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órą 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 konkretne środowisko wykonawcze funkcji. Obecnie może mieć następujące wartości:
- 0: Zerowa pozycja reprezentuje IsNative dla wykonania w ramach Native CodeGen.
- 1: Pierwsza pozycja reprezentuje IsPlugin dla wykonania jako część wtyczki.
Przykładowe wyeksportowane dane profilowania
{
"Version":2,
"SessionStartTime":1704850750514,
"SessionEndTime":1704850751198,
"Categories":
[
{"Name":"Równoległe 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}
]
}