Namierzyć Laga - opóźnienia

0

Witam. Programuję grę w Visual Studio 2022. Dodałem parę nowych funkcjonalności i gra zaczęła lagować. Jak namierzyć fragmenty kodu odpowiedzialne za opóźnienia ?

1

Dodać logi do kodu.

4

Ja bym szukał profilera dla języka który używasz
jeżeli to c++ może być np. https://github.com/yse/easy_profiler

3

W visual studio masz wbudowany profiler, "Diagnostic Tools" po prawej. Zwyczajnie włączasz CPU profiling, zaznaczasz na wykresie fragment w którym masz lagi i widzisz ile która funkcja zajęła czasu

screenshot-20241112185533.png
po naciśnięciu na funkcję możesz zobaczyć konkretne drzewko wywołań

screenshot-20241112190506.png
i konkretne miejsce w kodzie:

screenshot-20241112190515.png

0

@obscurity Mam coś takiego - jak naduszę "Break All" to zawiesza mi grę
screenshot-20241112190739.png
screenshot-20241112190916.png

2
tBane napisał(a):

@obscurity Mam coś takiego - jak naduszę "Break All" to zawiesza mi grę

tak, po włączeniu nagrywania musisz zawiesić grę żeby przeanalizować dane

0

@obscurity a da się jakoś sprawdzać zużycie pamięci i CPU w czasie rzeczywistym ?

0
tBane napisał(a):

@obscurity a da się jakoś sprawdzać zużycie pamięci i CPU w czasie rzeczywistym ?

no to ci się na wykresie cały czas pokazuje, do analizy pamięci musisz robić snapshoty, ale nie trzeba zatrzymywać aplikacji, analizę CPU można zrobić tylko na zatrzymanej aplikacji, w zasadzie to nie wiem czemu. Może dlatego że sama analiza danych wpływałaby na performance i przekłamywała wyniki?

0

@obscurity no właśnie mam ten problem, że mi się w czasie rzeczywistym nie wyświetla :-/

0

@obscurity Tak to u mnie wygląda.

screenshot-20241112193447.png

1

odpalasz nagrywanie (record CPU profile), grasz normalnie, czekasz na laga, na wykresie będziesz tego laga widział prawdopodobnie w postaci pika na wykresie, zaznaczasz ten fragment, zatrzymujesz grę (break) i masz listę funkcji i procentowe zużycie CPU. Do analizy pamięci robisz snapshot na początku i po momencie który chcesz zanalizować i masz listę alokacji. Czego więcej potrzebujesz?

2

@tBane: nie bardzo rozumiem dlaczego zwracasz uwagę na pamięć jak lagowanie jest zwiane z czasem

ja bym szedł w kierunku pomiaru czasu rysowanie klatek i szukana co trwa najdłużej
screenshot-20241112221323.png

1

a jak to włączyć ?

  1. git clone https://github.com/yse/easy_profiler
  2. w cmake add_subdirectory(....)
  3. target_link_libraries(TWOJA_APLIKACJA easy_profiler)
  4. obejrzyj przyklad https://github.com/yse/easy_profiler/blob/develop/sample/main.cpp
0

Nie znam się na monitorowaniu aplikacji desktop, bo pracuję z serwerowymi, ale może to podejście wypali jeśli nie chcesz zatrzymywać gry tylko zbierać dane live i potem je analizować. Także weź poprawkę na to, że mogę wygadywać bzdury.

Profilując dostajesz de facto zestaw metryk tudzież coś na kształt tracingu, masz drzewo wywołań itd. Ja bym poszedł dalej i zamiast profilować i zatrzymywać grę, by się czemuś przyjrzeć, zaczął bym sobie instrumentować aplikację metrykami które mnie interesują i w trakcie testów / debugu gdzieś te metryki wrzucał do analizy.

Nie wiem na ile pozwala profiler, ale z własnymi metrykami masz generalnie pełną dowolność, jak tylko jesteś w stanie wyłuskać daną informację, i może to być wszystko co podejrzewasz, że ma wpływ na rozgrywkę / lagi:

  • zużycie CPU przez proces
  • stan puli wątków (jeśli masz)
  • zużycie I/O (dyski, sieć, jeśli są relewantne)
  • metryki z GPU
  • metadane gry jak np. liczba postaci, obiektów, sprajtów itd. najlepiej z podziałem na rodzaje
  • czas renderowania klatki
  • czas przeliczania stanu gry pomiędzy
  • FPSy na monitorze
  • to ile razy na sekundę przeliczasz stan gry (jeśli jest to niezależnie od rysowania)

Takie metryki możesz generować na bieżąco w ramach diagnostyki, zapiąć się do nich jakąś darmową Grafaną i testować, szukać sobie korelacji itd. w przypadku aplikacji serwerowej tak bym zrobił, pomogłoby mi szukać źródeł problemów w kontekście tego, co robię. Nie da mi to dokładnych wywołań funkcji, które powodują problemy, ale zanim zacznę jej szukać da mi to pogląd sytuacji i pozwoli szukać korelacji.

1

w easy_profiler masz dwie opcje wszystko oczywiscie w runtime

  • albo zapisujesz próbki do pliku i oglądasz potem
  • albo podlaczas sie po IP i oglądać dane w czasie rzeczywistym

swego czasu używałem tez https://github.com/wolfpld/tracy
ale trochę większa kobyła

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.