Autor Wątek: Talk/Rozmowa: Dlaczego td2 jest tak źle zoptymalizowany - wyjaśnienie  (Przeczytany 4709 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline skorakora

  • Weteran
  • Grupa I
  • *
  • Wiadomości: 239
  • Siła reputacji: 16
  • skorakora zwrotniczyskorakora zwrotniczyskorakora zwrotniczy
    • Danzo Systems - Serwery
Dlaczego td2 jest tak źle zoptymalizowany - wyjaśnienie
« dnia: 25 Stycznia 2019, 22:14:42 »
[Wątek został napisany tylko w celach edukacyjnych, proszę o jego nie usuwanie. Jeśli znajduje się w złym dziale to proszę o przeniesienie w odpowiedni]

Witam.
Wiele osób krzyczy, że w grach ma po 60 FPS a w td2 ma ledwo 20
Powstało wiele "teorii" dlaczego tak się dzieję, ja przedstawię i raz na zawszę wyjaśnię przyczynę


Zacznijmy od tego, że TD2 wykorzystuje potencjał GPU w znikomym stopniu - wiele mocy obliczeniowej jest marnowane
By znaleźć przyczynę małej ilości FPS obniżmy ustawienia Graficzne do minimum...
W moim przypadku, klatkaż zwiększył się ok 5-10 FPS co jest bardzo słabym wynikiem.

By zrozumieć dlaczego tak się dzieje ustawmy mnożnik LOD na 0.


Już na starcie widać na czym polega problem...


Po ustawieniu mnożnika na 0 odległość rysowania jest przemnażana przez 0 (logiczne :p) czego efektem powinno być zniknięcie wszystkich obiektów.
Fakt część obiektów znika np. wysięgniki czy podkłady, lecz reszta obiektów jest rysowana na całej długości scenerii co po przemnożeniu przez ilość obecnych wierzchołków modeli daje ogromną liczbę
Skybox (możliwe że przypadkowo) jest nieudolną próbą zasłonięcia tego że te obiekty są wyświetlane na całej długości (lub znikają w bardzo dużej odległosci)
Ilość obiektów które procesor musi przetwarzać przekłada się na znacznie wyższe użycie CPU w stosunku do niskiego użycia GPU co potwierdza fakt że można mieć dobrą grafikę a mieć i tak 20FPS
(tak jest w moim przypadku)

Druga przyczyna (też istotna) jest to renderowanie obiektów które są niewidoczne
By to sprawdzić sprawdźmy użycie GPU oraz CPU gdy patrzymy się w różnych kierunkach:

Najpierw spójrzmy stronę kierunku jazdy by zebrać dane kontrolne...


Następnie spójrzmy w bok gdzie statystycznie jest mniej obiektów, niż w kierunku jazdy


Jak widać użycie CPU oraz GPU się nie zmieniło (lub spadło nieznacznie) mimo iż widzimy znacząco mniej obiektów

By się upewnić zobaczmy co się stanie jak będziemy patrzeć w niebo gdzie nie widzimy na ekranie żadnych obiektów


Jak widać mimo iż nie widzimy obiektów to CPU oraz GPU jest także w pełni obciążone...

Dla porównania zobaczmy jak to wygląda w innym symulatorze w tym przypadku trainz.
Screen w kierunku jazdy:


Screen z boku:


W tym przypadku widać znaczny spadek użycia CPU i GPU
Wywnioskować z tego możemy, że w TD2 obiekty są renderowane nawet jak na nie nie patrzymy
Co powoduje ogromny spadek wydajności bo zamiast renderować tylko tego co widzimy (kąt widzenia dla którego powinny zostać wyrenderowane obiekty to średnio 150st.)
Przez to GPU oraz CPU musi wykonać średnio 2X więcej obliczeń niż tego potrzebujemy

Teraz nasuwa się pytanie dlaczego do dzisiaj nikt przy tym nie usiadł i tego nie poprawił
Poprawienie tych dwóch problemów wymaga ogromnego nakładu pracy, w przykładzie pierwszym wymaga to zmiany odległości rysowania dla każdego obiektu jaki mamy w grze
W drugim przykładzie na ten moment nie ma rozwiązania, w obecnej sytuacji zastosowanie skryptu który by blokował renderowanie niewidocznych obiektów (przy obecnej konstrukcji programu) jest niemożliwe do zrealizowania.
« Ostatnia zmiana: 25 Stycznia 2019, 22:37:56 wysłana przez uetam »
Anime, inżynieria i nauka to złe połączenie jest. Nie rób tego - wiem co mówie.

Offline kojonek2

  • Developer
  • Weteran
  • Sponsor
  • *
  • Wiadomości: 436
  • Siła reputacji: 153
  • kojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezeskojonek2 prezes
Odp: Dlaczego td2 jest tak źle zoptymalizowany - wyjaśnienie
« Odpowiedź #1 dnia: 25 Stycznia 2019, 22:14:58 »
Teraz wyprostuje wiele twoich złych asumpcji. Po pierwsze, osoby pracują nad kwestią optymalizacji.

Po drugie, obiekty są rysowane tylko z przodu ekranu (te zasłonięte również - frostum culling). Zapewnia to unity. Przykład, który podałeś jest zły ponieważ to właśnie te domki, na które patrzysz obciążają najmocniej ponieważ składają się z mnóstwa meshy oraz tekstur. Przykładem może być, hel gdzie stoi na nim 100 obiektów jednego płotka, którego poprawienie poprawiło w znacznej ilości fps (nie pamiętam czy poprawa płotka została wrzucona do głównej gałęzi symulatora, więc nie obiecuję że znajdzie się to w następnej wersji). Na dowód pokazuje zdjęcie na którym stoi w sobie 100 domków na pustej scenie oraz różnicę fps po poprawie obiektu do gry.



Wiadomo, że na scenerii efekt nie będzie tak drastyczny, ale gdy zajmiemy się wszystkimi obiektami, powinien być on zauważalny.

Dzięki inomushis zostały również dosyć mocno zoptymalizowane skrypty semaforów oraz obciążający skrypt, który był podpięty do każdego obiektu. Dlatego na większych sceneriach, gdzie jest najwięcej obiektów i semaforów zmiana ta będzie miała większy wpływ. Zapewne opisze wam inomushis to dokładniej, gdy będzie miał chwilę czasu (głównie on poświęcił na tą kwestię czas).

Zauważę również, że profilowanie w menadżerze nie jest zbyt dokładne. Nie mówiąc o tym że miałeś odpalone dwie gry na raz. Gra pomimo być zminimalizowaną ma załadowane zasoby do karty graficznej oraz prowadzi obliczenia.

EDIT:

Ustawienie "Lod bias" na 0 nie powinno usunąć wszystkich obiektów. Jak sama nazwa mówi Level of details. Nie wszystkie obiekty są na tyle skomplikowane aby potrzebowały mieć taki system. Mimo wszystko obiekty wszystkie znikają w pewnej odległości. Zapewne pamiętacie buga gdy balkony bloku znikały szybciej niż sam blok.
« Ostatnia zmiana: 25 Stycznia 2019, 22:40:01 wysłana przez uetam »

Offline inomushis

  • Zasłużony
  • Weteran
  • Grupa I
  • *
  • Wiadomości: 285
  • Siła reputacji: 149
  • inomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezesinomushis prezes
Odp: Dlaczego td2 jest tak źle zoptymalizowany - wyjaśnienie
« Odpowiedź #2 dnia: 25 Stycznia 2019, 22:15:14 »
Cytuj
Cytuj
Zacznijmy od tego, że TD2 wykorzystuje potencjał GPU w znikomym stopniu
To prawda. I to chyba jedyne słuszne zdanie w całym tym temacie.
Od początku - nie wszyscy wiedzą jak działa proces renderowania grafiki, zatem zacznijmy od wyjaśnienia.
Otóż, w cały proces renderowania jednej klatki zaczyna się od określenia tego, które elementy mają być widoczne na ekranie.
Sprawdzane są poziomy LOD dla obiektów, czy obiekt w ogóle mieści się w kącie widzenia kamery i to jak daleko od kamery znajduje się obiekt.
Następnie siatki obiektów muszą być przesłane z CPU do GPU, jedna po drugiej - jest to złożony protokół komunikacyjny, ale dla uproszczenia zobrazujmy

CPU: Hej karto graficzna, mam dla Ciebie siatkę obiektu!
GPU: No dawaj!
C: No to podaję wierzchołki ... ... ... ... ... ... ... ... ... ... ... ... ... ...
C: Koniec transmisji
G: Koniec transmisji, przesłano n wierzchołków!

I tak z każdym obiektem. Współczesne karty graficzne są bardzo szybkie obliczeniowo, można robić na nich skomplikowane obliczenia w ułamkach sekund, ale - wąskim gardłem jest prędkość transmisji danych. Jeśli chcecie na karcie graficznej policzyć wynik "1 + 2 = ?" licząc, że GPU zrobi to szybciej, to będziecie zdziwieni. Zanim karta graficzna otrzyma dane i zaalokuje na nie pamięć, zwykły procesor policzy to 100 razy. Tak! Karty graficzne świetnie obliczają złożone wektory, macierze, ale pod warunkiem, że są to duuuuuże i skomplikowane obliczenia, bo transfer danych na kartę trwa na tyle długo, że w przypadkach prostych działań zwykłe CPU sprawdza się o wiele wydajniej.
Podsumowując: Transmisja CPU -> GPU to wąskie gardło.

Cytuj
Cytuj
By znaleźć przyczynę małej ilości FPS obniżmy ustawienia Graficzne do minimum...
W moim przypadku, klatkaż zwiększył się ok 5-10 FPS co jest bardzo słabym wynikiem.
Już na starcie widać na czym polega problem...
Po ustawieniu mnożnika na 0 odległość rysowania jest przemnażana przez 0 (logiczne :p) czego efektem powinno być zniknięcie wszystkich obiektów.
Fakt część obiektów znika np. wysięgniki czy podkłady, lecz reszta obiektów jest rysowana na całej długości scenerii co po przemnożeniu przez ilość obecnych wierzchołków modeli daje ogromną liczbę

LOD to nie jest odległość rysowania tylko Level Of Details - poziom szczegółowości. Niektóre obiekty nie muszą pokazywać wszystkich swoich szczegółów z dużej odległości, bo po prostu ludzkie oko i tak ich nie zauważy, dlatego posiadają zdefiniowany LOD. Zmniejszając LOD Bias zmniejszasz mnożnik tej odległości. Jeśli autor ustawił, że króliczek ma mieć wyraźnie widoczne uszka z 50 metrów, a Ty ustawiasz LOD Bias = 0.5, to uszka będą widoczne dopiero z 25 metrów.

Jeśli liczysz, że ustawiając LOD na zero znikniesz całą scenę, to jesteś w ogromnym błędzie.

Cytuj
Cytuj
Skybox (możliwe że przypadkowo) jest nieudolną próbą zasłonięcia tego że te obiekty są wyświetlane na całej długości (lub znikają w bardzo dużej odległosci)
Początek tego tematu zapowiadał rzetelne i poparte dowodami argumenty. Niestety, szerzysz na forum kolejną herezję.
Już u podstaw grafiki 3D, gdy powstawała pierwsza wersja openGLa, kamera pozwalała zdefiniować dwie płaszczyzny odcinania - bliską i daleką.
Są to dwie odległości przed którą i za którą nie widzisz żadnych obiektów. Zanim znowu napiszesz coś równie durnego, otwórz edytor, wznieś się na lekką wysokość i zobaczysz, że daleka płaszczyzna odcinania kamery schowa przed Tobą te obiekty, które są za nią. A niech stracę, zrobię to za Ciebie...


Jak widać na powyższym screenie, SkyBox nie odcina żadnych obiektów, odcięcie następuje wcześniej.


Cytuj
Cytuj
Wywnioskować z tego możemy, że w TD2 obiekty są renderowane nawet jak na nie nie patrzymy
Co powoduje ogromny spadek wydajności bo zamiast renderować tylko tego co widzimy (kąt widzenia dla którego powinny zostać wyrenderowane obiekty to średnio 150st.)
Przez to GPU oraz CPU musi wykonać średnio 2X więcej obliczeń niż tego potrzebujemy
Kolejna bzdura, jakich wiele tutaj na forum. Zaczniemy od źródła, czyli dokumentacji Unity: https://docs.unity3d.com/Manual/class-Camera.html
Note that the near and far clip planes together with the planes defined by the field of view of the camera describe what is popularly known as the camera frustum. Unity ensures that when rendering your objects those which are completely outside of this frustum are not displayed. This is called Frustum Culling.

Sprawdźmy jeszcze tą teorię w praktyce. Niestety, w badaniu wydajności gier nie używa się menadżera zadań, a trochę konkretniejszych narzędzi (kliknij, by powiększyć):



Nie wiem jak u Ciebie, ale u mnie czas poświęcony na renderowanie graficzne sceny spadł z 12ms do 1.5ms.
A u Ciebie nie...
Cytuj
Cytuj
Jak widać użycie CPU oraz GPU się nie zmieniło (lub spadło nieznacznie) mimo iż widzimy znacząco mniej obiektów
... porównanie danych na zasadzie - tu jest 1/2 a tu 1/3 wykresu nie jest miarodajne.

I teraz - zauważ - że ilość obiektów widocznych na scenie nie podniosła znacząco wydajności, zatem problemem nie jest ich ilość ani ich skomplikowanie.
I tu dochodzimy do sedna sprawy. Przez team TD2 przewijało się wiele osób. Niektórzy z nich byli profesjonalistami w tym co robią, niektórzy uczyli się dopiero programowania, a jeszcze inny poklikali trochę w edytor i znudziło im się to. Taka mieszanka spowodowała, że w TD2 jest obecnie wiele różnych szkół dodawania obiektów czy skryptów - każdy robił to tak jak uważał za słuszne - i dzisiejszym tego efektem jest wąskie gardło. To procesor nie nadąża wysyłać informacji o obiektach do wyrenderowania na scenie. Jak jednak pokazałeś powyżej - ilość tych obiektów nie wpływa znacząco na wydajność CPU. Zatem? Zatem powodem jest sposób ich transmisji. Współczesne karty graficzne oferują wiele technik, które pozwalają lepiej zarządzać przepływem danych z CPU do GPU. przykładem jest np. Vertex Buffer Object, Instancing. Dodatkowo po stronie CPU można wykorzystywać narzędzia takie jak Object Pooling, Mesh Baking, Light Baking.

Aha, ostatnio były problemy i pomówienia, że skora coś tam kiedyś pracował nad czymś, a później ekipa go wyrzuciła i wykorzystała jego robotę. No to pokażmy od kiedy pracujemy nad optymalizacją, żeby nie było niedomówień i teorii, że skora chciał dobrze, a cała reszta specjalnie psuje tedeka... I pokażmy efekty. W sumie, to zepsułeś niespodziankę dla użytkowników...



I optymalizacja: bez obiektów i renderingu: z 32 na 42 fpsy:


I później z optymalizacją procesu renderowania - 60:


Prace w Parzęczewie:


Prace na Helu:
Tak, materiały nagrywa się z ręki, telefonem, żeby nie zakłócać pracy CPU procesem nagrywania filmu i zachować miarodajność pomiaru :)
W przeciwieństwie do uruchomienia TD2 i Trainza na raz...

Oczywiście, fpsy mierzone w Unity są lekko zaniżone, bo sam edytor jest dość obciążającym procesem. A jak to wygląda w finalnym exe?


Oczywiście to nie tak, że w nowej wersji będziecie mieć 120 fpsów na każdej scenerii. Pokazałem tylko jakie są możliwości.
Optymalizacja procesu renderowania to dość czasochłonny proces. Jest to działanie poprzez szukanie dziury w całym, badanie renderowanego obrazu klatka po klatce, obiekt po obiekcie:



Cytuj
Cytuj
W drugim przykładzie na ten moment nie ma rozwiązania, w obecnej sytuacji zastosowanie skryptu który by blokował renderowanie niewidocznych obiektów (przy obecnej konstrukcji programu) jest niemożliwe do zrealizowania.
Nie ma rzeczy niemożliwych do zrealizowania. Jednakże, to rozwiązanie jest całkowicie zbędne. Jak wykazano powyżej, nie ilość obiektów i ich skomplikowanie są problemem, a sposób ich renderowania. I nad optymalizacją tego problemu pracujemy od początku roku. Miło, że chcesz zwrócić uwagę na problem, ale podpierasz się przy tym niepoprawnymi pomiarami i błędnymi argumentami. Później takie teorie krążą po forum i mamy całą armię specjalistów w każdej dziedzinie, bo usłyszeli oni to czy tamto.

Zaufajcie nam i dajcie troszkę czasu :)
« Ostatnia zmiana: 25 Stycznia 2019, 22:58:49 wysłana przez uetam »

Offline uetam

  • Zasłużony
  • *
  • Wiadomości: 462
  • Siła reputacji: 115
  • uetam prezesuetam prezesuetam prezesuetam prezesuetam prezesuetam prezesuetam prezesuetam prezesuetam prezesuetam prezesuetam prezesuetam prezes
  • Administrator Techniczny
Odp: Dlaczego td2 jest tak źle zoptymalizowany - wyjaśnienie
« Odpowiedź #3 dnia: 25 Stycznia 2019, 23:01:36 »
Z powodu małego chochlika musiałem ręcznie przywrócić posty dlatego przy każdym widnieje adnotacja:
Ostatnia zmiana: Dzisiaj o 22:xx:xx wysłana przez uetam
Nie odpowiadam na wiadomości prywatne dotyczące problemów, które mogą być rozwiązane na forum.

Offline skorakora

  • Weteran
  • Grupa I
  • *
  • Wiadomości: 239
  • Siła reputacji: 16
  • skorakora zwrotniczyskorakora zwrotniczyskorakora zwrotniczy
    • Danzo Systems - Serwery
Odp: Dlaczego td2 jest tak źle zoptymalizowany - wyjaśnienie
« Odpowiedź #4 dnia: 25 Stycznia 2019, 23:52:02 »
Z powodu małego chochlika musiałem ręcznie przywrócić posty dlatego przy każdym widnieje adnotacja:
Ostatnia zmiana: Dzisiaj o 22:xx:xx wysłana przez uetam
No to niezły chochlik mnie prześladuje :p
Anime, inżynieria i nauka to złe połączenie jest. Nie rób tego - wiem co mówie.

Offline irek

  • Weteran
  • Wiadomości: 6
  • Siła reputacji: 336
  • irek prezesirek prezesirek prezesirek prezesirek prezesirek prezesirek prezesirek prezesirek prezesirek prezesirek prezesirek prezes
  • Nie mów że nie ma Boga, ale szukaj Go całym sercem
Odp: Dlaczego td2 jest tak źle zoptymalizowany - wyjaśnienie
« Odpowiedź #5 dnia: 17 Kwietnia 2019, 22:53:54 »
W takim razie po przeczytaniu tych cennych informacji wynika że po zmianie procesora CPU będziemy mieli więcej FPS tak? Bo po zmianie karty graficznej z gtx 970 na RTX 2080 TI nie poprawiło się u mnie ani o jeden FPS.
Bóg daje się odnaleźć tym, którzy szukają go całym swoim sercem. On sam tak powiedział, więc nie mów że go nie ma. Czy aby na pewno szukałeś? Powiedział to przez Jeremiasza 29:13-14. Sprawdź, szukaj Go całym sercem a przekonasz się!

Offline xoorbes

  • Zarząd
  • Administrator
  • Developer
  • Weteran
  • Naczelnik administratorów
  • Sponsor
  • Grupa VIII
  • *
  • Wiadomości: 695
  • Siła reputacji: 397
  • xoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezesxoorbes prezes
    • Blender Development Fund