This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold zawiera narzędzia profilujące zintegrowane z silnikiem i procesem budowania. Pomagają one wykrywać problemy z wydajnością, pamięcią i użyciem zasobów. Dane profilowania w czasie działania mogą być wykorzystywane przez kilka narzędzi:
Ustawienie Profiler w manifeście aplikacji określa, czy kod profilera jest dołączany do buildu. Debug Only jest opcją domyślną, None go wyklucza, a Always dołącza go zarówno do buildów debug, jak i release. Ustawienia profiler w pliku game.project sterują zachowaniem w czasie działania, ale nie przywracają do buildu wykluczonego kodu profilera. W szczególności ustawienie Track CPU steruje próbkowaniem użycia CPU i jest niezależne od wyboru w manifeście aplikacji.
Buildy z dołączoną obsługą profilera zawierają wizualny profiler działający w czasie rzeczywistym, który wyświetla bieżące informacje jako nakładkę na uruchomioną aplikację:
function on_reload(self)
-- Włącz wizualny profiler po szybkim przeładowaniu.
profiler.enable_ui(true)
end

Wizualny profiler udostępnia kilka funkcji, których można użyć do zmiany sposobu prezentacji danych:
profiler.set_ui_mode()
profiler.set_ui_view_mode()
profiler.view_recorded_frame()
Więcej informacji o funkcjach profilera znajdziesz w dokumentacji API profilera.
Podczas uruchamiania buildu komputerowego lub mobilnego z obsługą profilera można otworzyć w przeglądarce interaktywne profilery klatek i zasobów.
Profiler klatek pozwala analizować grę podczas działania i szczegółowo badać poszczególne klatki. Aby otworzyć profiler:
Profiler klatek jest podzielony na kilka sekcji, z których każda pokazuje inny widok uruchomionej gry. Naciśnij przycisk Pause w prawym górnym rogu, aby tymczasowo zatrzymać odświeżanie widoków przez profiler.

Gdy używasz jednocześnie wielu urządzeń docelowych, możesz ręcznie przełączać się między nimi, zmieniając pole Connection Address u góry strony tak, aby odpowiadało adresowi URL profilera Remotery widocznemu w konsoli po uruchomieniu celu:
INFO:ENGINE: Defold Engine 1.3.4 (80b1b73)
INFO:DLIB: Initialized Remotery (ws://127.0.0.1:17815/rmt)
INFO:ENGINE: Loading data from: build/default



Wartość LuaMem to ilość pamięci w kilobajtach używana przez maszynę wirtualną Lua, raportowana przez garbage collector Lua. Memory to ilość pamięci w kilobajtach używana przez silnik.
Ustawienie Max Sample Count ogranicza liczbę próbek profilera rejestrowanych dla każdego wątku w jednej klatce. Jeśli profiler zgłasza przekroczenie limitu, najpierw sprawdź kod profilowania rozszerzeń natywnych pod kątem niedopasowanej pary rozpoczęcia i zakończenia zakresu. Zwiększ limit tylko wtedy, gdy prawidłowa klatka rzeczywiście zawiera więcej zakresów niż skonfigurowany limit.
Profiler zasobów pozwala analizować grę podczas działania i szczegółowo badać użycie zasobów. Aby otworzyć profiler:
http://<address>:<port>/. Użyj adresu i portu zgłoszonych przez działający silnik w konsoli.Profiler zasobów jest podzielony na 2 sekcje: jedna pokazuje hierarchiczny widok kolekcji, obiektów gry i komponentów aktualnie utworzonych w grze, a druga pokazuje wszystkie aktualnie załadowane zasoby.

Możesz również sprawdzić, jak długo ładują się poszczególne zasoby. Przed uruchomieniem gry włącz Resource → Profile w game.project. W widoku tekstowym ustawienie wygląda tak:
[resource]
profile = 1
Ustawienie jest domyślnie wyłączone. Po włączeniu zrestartuj grę, aby zmierzyć ładowanie przy starcie. Każde zakończone powodzeniem lub błędem ładowanie zapisuje wpis poziomu INFO ze ścieżką zasobu, całkowitym czasem i czasami etapów preload, read, create, post-create, queue i wait. Trafienia w pamięć podręczną nie tworzą nowych zapisów ładowania.
W profilerze zasobów kliknij Capture, a następnie Show load times, aby wyświetlić kolumny czasów. Capture odświeża widok zachowanych pomiarów; nie włącza profilowania ani nie mierzy wcześniejszych ładowań wstecznie.
| Kolumna | Znaczenie |
|---|---|
| Load (ms) | Całkowity czas pierwszego ładowania, w tym zależności, operacji po utworzeniu, kolejkowania i oczekiwania. |
| Preload (ms) | Czas przygotowania zasobu w jego wywołaniu zwrotnym preload. |
| Read (ms) | Czas odczytu danych zasobu. |
| Create (ms) | Czas tworzenia zasobu środowiska uruchomieniowego w jego wywołaniu zwrotnym create. |
Wyświetlenie czasów ładowania sortuje tabelę według czasu całkowitego, od najwolniejszych zasobów. Kliknij nagłówek kolumny czasu, aby sortować według tego etapu; kliknij ponownie, aby odwrócić kolejność. Paski w kolumnie Load pokazują każdy czas względem najwolniejszego widocznego zasobu. Kliknij Hide load times, aby ponownie ukryć kolumny.
Czasy ładowania i wywołań zwrotnych obejmują zagnieżdżoną pracę nad zależnościami. Nie sumuj czasów zasobów w celu obliczenia czasu startu, ponieważ ta sama praca może pojawić się w pomiarach kilku zasobów. Kolumny Preload, Read i Create również nie obejmują całego czasu ładowania; dodatkowe etapy są dostępne w logu.
Pauza (—) oznacza brak ukończonego pomiaru, na przykład z powodu wyłączonego profilowania lub niezakończonego pierwszego ładowania. Zmierzone zero jest wyświetlane jako 0.000. Pomiary opisują pierwsze ładowanie: trafienia w cache i szybkie przeładowanie ich nie zmieniają, a wyładowanie zasobu usuwa zachowany pomiar.
Usługa HTTP silnika może przechwytywać polecenia GPU Metal do dokumentu .gputrace w macOS. Otwórz ukończony ślad w Xcode, aby przeanalizować przechwycone klatki. Ta funkcja jest wbudowana w silnik debug.
Utwórz paczkę Debug dla macOS z dołączonym natywnym backendem graficznym Metal. Jeśli używasz manifestu aplikacji, wybierz opcję Graphics (macOS) zawierającą Metal; zobacz backendy graficzne.
Uruchom plik wykonywalny paczki z terminala z METAL_CAPTURE_ENABLED=1 i wybierz adapter Metal. Zastąp ścieżkę paczki i nazwę pliku wykonywalnego w tym przykładzie:
METAL_CAPTURE_ENABLED=1 \
"/absolute/path/MyGame.app/Contents/MacOS/MyGame" --graphics-adapter=metal
Zmienna środowiskowa musi być ustawiona przy starcie silnika. Ustawienie jej tylko w terminalu używanym do żądań HTTP nie włącza przechwytywania w już działającym silniku.
W drugim terminalu użyj portu usługi silnika wypisanego w logu. Poniższe przykłady używają curl i jq:
ENGINE_URL="http://127.0.0.1:<port>"
curl -fsS "$ENGINE_URL/openapi.json" | jq '.paths["/profiler/gputrace"]'
curl -sS -i "$ENGINE_URL/profiler/gputrace"
Trasa jest rejestrowana tylko w macOS. Wpis null w dokumencie OpenAPI oznacza, że ten silnik jej nie udostępnia. Nawet gdy trasa istnieje, obsługa przechwytywania zależy od adaptera graficznego i środowiska uruchomienia. GET /profiler/gputrace zwraca HTTP 501 z error.code: "gputrace_unsupported", gdy przechwytywanie Metal jest niedostępne. Przed kontynuowaniem sprawdź, czy silnik używa Metal i został uruchomiony z METAL_CAPTURE_ENABLED=1. Obsługiwane żądanie zwraca HTTP 200 ze stanem przechwytywania.
Wybierz zapisywalną ścieżkę bezwzględną kończącą się na .gputrace, z istniejącym katalogiem nadrzędnym i bez istniejącego śladu pod tą ścieżką. Ścieżka znajduje się na komputerze z uruchomionym silnikiem. Dla silnika lokalnego ten przykład tworzy nowy katalog tymczasowy i żąda jednej klatki:
GPU_TRACE_DIR=$(mktemp -d /tmp/defold-gputrace.XXXXXX)
GPU_TRACE_PATH="$GPU_TRACE_DIR/frame.gputrace"
GPU_TRACE_REQUEST=$(jq -n --arg path "$GPU_TRACE_PATH" '{path: $path, frames: 1}')
curl -fsS -X POST \
-H 'Content-Type: application/json' \
--data "$GPU_TRACE_REQUEST" \
"$ENGINE_URL/profiler/gputrace" | jq
frames jest opcjonalne, ma domyślną wartość 1 i przyjmuje liczby całkowite od 1 do 10000. Przechwytywanie rozpoczyna się przed następną renderowaną klatką i kończy po przesłaniu żądanej liczby kompletnych klatek. Podczas oczekiwania gra musi nadal renderować. Tylko jedno przechwytywanie może oczekiwać lub być aktywne; kolejne żądanie startu zwraca HTTP 409 z error.code: "gputrace_active".
POST zwraca HTTP 200 z ok: true i data.state: "pending", gdy przechwytywanie zostanie zaplanowane. Jego zakończenie jest zgłaszane przez późniejsze żądania stanu. Powtarzaj żądanie stanu, aż data.state przyjmie complete, canceled lub failed:
curl -fsS "$ENGINE_URL/profiler/gputrace" | jq
data.state |
Znaczenie |
|---|---|
idle |
Nie zaplanowano przechwytywania. |
pending |
Przechwytywanie czeka na rozpoczęcie renderowania. |
capturing |
Przechwytywanie trwa; data.frames_captured podaje liczbę ukończonych klatek. |
complete |
Przechwytywanie zakończyło się i można otworzyć ślad. |
canceled |
Oczekujące przechwytywanie anulowano przed rozpoczęciem. |
failed |
Nie udało się rozpocząć przechwytywania; sprawdź błąd natywny w data.error. |
GET opisuje bieżące lub ostatnie przechwytywanie. Sprawdź, czy data.path odpowiada żądanej ścieżce. Nieudane przechwytywanie nadal zwraca HTTP 200 z ok: true; sprawdź data.state i data.error, aby ustalić wynik. W kliencie automatycznym odpytuj z opóźnieniem i limitem czasu.
Po osiągnięciu stanu complete otwórz ślad w Xcode na Macu z silnikiem:
open -a Xcode "$GPU_TRACE_PATH"
Punkt końcowy HTTP zwraca stan; ślad jest zapisany pod data.path na hoście silnika. Dla silnika zdalnego pobierz ukończony dokument z tego hosta przed otwarciem go lokalnie.
Aby anulować oczekujące przechwytywanie lub wcześniej zakończyć aktywne:
curl -fsS -X DELETE "$ENGINE_URL/profiler/gputrace" | jq
Oczekujące przechwytywanie przechodzi do canceled. Dla aktywnego data.stop_requested przyjmuje true, a przechwytywanie kończy się po przesłaniu bieżącej renderowanej klatki. Odpytuj GET do osiągnięcia stanu końcowego. DELETE pozostawia ślad już zapisany na dysku. Jeśli żadne przechwytywanie nie oczekuje ani nie trwa, zwraca HTTP 409 z error.code: "gputrace_inactive".
HTML5 używa Web Performance API zamiast Remotery dla osi czasu przeglądarki. Aby rejestrować zakresy silnika Defold:
profiler.performance_timeline_enabled) w pliku game.project.Ta oś czasu przeglądarki jest niezależna zarówno od wizualnego profilera w grze, jak i interaktywnego webowego profilera Remotery.
Podczas bundlowania gry możesz utworzyć raport budowania. Jest to bardzo przydatne, jeśli chcesz dobrze zorientować się w rozmiarze wszystkich zasobów, które wchodzą w skład bundla gry. Po prostu zaznacz pole Generate build report podczas bundlowania gry.

Narzędzie do budowania utworzy plik o nazwie report.html obok bundla gry. Otwórz ten plik w przeglądarce internetowej, aby przejrzeć raport:

Sekcja Overview pokazuje ogólny podział rozmiaru projektu według typu zasobu.
Resources pokazuje szczegółową listę zasobów, którą możesz sortować według rozmiaru, współczynnika kompresji, szyfrowania, typu i nazwy katalogu. Użyj pola “search”, aby filtrować wyświetlane wpisy zasobów.
Sekcja Structure pokazuje rozmiary na podstawie tego, jak zasoby są zorganizowane w strukturze plików projektu. Wpisy są kolorowane od zielonego (lekkie) do niebieskiego (ciężkie) zgodnie ze względnym rozmiarem zawartości pliku i katalogu.
Oprócz wbudowanych narzędzi dostępny jest szeroki wybór darmowych, wysokiej jakości narzędzi do śledzenia i profilowania. Oto kilka z nich:
Pamiętaj, że profilery napisane w czystym Lua dodają dość duży narzut przy każdym instalowanym hooku. Z tego powodu warto podchodzić z ostrożnością do profili czasowych uzyskanych takim narzędziem. Profilery zliczające są jednak wystarczająco dokładne.

To narzędzie pozwala analizować uruchomioną aplikację Defold i sprawdzać, jak korzysta z OpenGL. Umożliwia śledzenie wywołań funkcji OpenGL, ustawianie breakpointów na funkcjach OpenGL, badanie zasobów aplikacji (tekstur, programów, shaderów itd.), podgląd zawartości buforów i sprawdzanie innych aspektów stanu OpenGL.

Zestaw narzędzi profilowania, który zbiera dane w czasie rzeczywistym o CPU, pamięci i aktywności sieciowej gry. Możesz wykonywać próbkowe śledzenie wywołań metod, zrzuty sterty, podglądać alokacje pamięci i analizować szczegóły plików przesyłanych przez sieć. Korzystanie z tego narzędzia wymaga ustawienia android:debuggable="true" w AndroidManifest.xml.

Uwaga: od Android Studio 4.1 można też uruchamiać narzędzia profilowania bez uruchamiania Android Studio.
To zestaw narzędzi, który pozwala inspekcjonować, dostosowywać i odtwarzać wywołania z aplikacji do sterownika graficznego. Aby użyć tego narzędzia, trzeba ustawić android:debuggable="true" w AndroidManifest.xml.
