Ocena wątku:
  • 0 głosów - średnia: 0
Problem z FPSami na vanilli
#2
TL;DR Poczekaj tydzień, dwa i myślę, że coś się zmieni w tej materii (obserwuj Mini FPS Booster w warsztacie Steam).

Problemem w tej grze jest niezbyt przemyślany sposób implementacji elementów interfejsu użytkownika(możliwe, że źle oszacowali popularności tytułu), jak i duże obciążenie procesora ze względu na symulacyjny aspekt gry. 
Każdy element, od okienek, paneli, dialogów, po przyciski, kończąc na separatorach, nawet jeśli niewidoczny jest ciągle automatycznie odświeżany przed wyrenderowaniem każdej klatki przez silnik Unity.
Dla przypomnienia, maksymalny czas w jakim musi się zakończyć operacja zbierania informacji o następnej renderowanej klatce aby utrzymać pożądana liczbę klatek na sekundę:
  • 120 kl/s - 8.3ms(milisekundy)
  • 60 kl/s - 16.6ms
  • 30 kl/s - 33.3ms
  • 15 kl/s - 66.6ms
  • 8 kl/s - 125ms
Wywołanie funkcji odświeżania obiektu z poziomu silnika Unity jest stosunkowo szybkie, ale niesie ze sobą kilka dodatkowych testów (czy obiekt istnieje, czy jest w scenie i czy nie został przypadkiem usunięty pomiędzy klatkami) co za tym idzie, pochłania czas procesora. Na domiar złego, wywołanie jest wykonywane z "niezarządzanej" części silnika (C++) do zarządzanej (C#) dodając kolejne testy sprawdzające przed wykonaniem docelowej funkcji. 

Jeśli obiektów jest stosunkowo niedużo, różnica jest niezauważalna, ale tu właśnie jest haczyk. Liczba rodzajów elementów interfejsu użytkownika jest stosunkowo nieduża w grze, ale to ilość instancji (pojedynczych wystąpień) obiektów gra tutaj ogromną rolę. 
W podstawowej grze po załadowaniu pustej mapy jest ich koło 8-10 tys. Każdy DLC dodaje kolejny zbiór nowych elementów, gdzie finalnie, posiadając wszystkie duże DLC, tych elementów jest około 14 tys (być może więcej, sprawdzałem przed Sunset Harbor).

W normalnych warunkach, gdyby elementy były odświeżane ręcznie w kodzie (napisanym przez deweloperów) ta operacja, nawet mimo odświeżania tak duże liczby elementów wykonałaby się maksymalnie w kilka milisekund (zależnie od szybkości procesora). W związku z tym że robi to silnik Unity, czas wykonania tej operacji dla wszystkich obiektów jest nieporównywalnie większy (nie można pominąć żadnego aktywnego obiektu, aktywacja/dezaktywacja nie została przewidziana).


Podsumowując opis problemu, niewielka pomoc w poprawieniu FPS w grze zbliża się dość dużymi korkami. 



Powoli kończę prace nad pełną wersją FPS Booster'a, potrzebuję jeszcze trochę czasu na dokończenie(tydzień, dwa przy obecnej ilości wolnego czasu, obsuwa możliwa, niestety), bo walczę z kompatybilnością modów (obecnie 95% kompatybilnych) i kilkoma ważnymi elementami. 
Rozwiązanie samo w sobie jest dość skomplikowane. Z uwagi na to, że nie można dystrybuować zmodyfikowanych bibliotek gry (EULA i te sprawy  Wink  ), musiałem stworzyć mechanizm łatania ich podczas uruchamiania gry (właściwie zanim się uruchomi) oraz utworzyć automat który załata wszystkie mody które aktualnie używają części kodu poddanej modyfikacjom - jeszcze przed ich załadowaniem. 

Wzrost wydajności? Hmm... różny, ale w każdym przypadku Wink

Na vanilli w moim przypadku czas odświeżania 1000-1200 elementów interfejsu wynosi ~1ms co daje w sumie jakieś 12-15ms straty na odświeżaniu UI => żadnych szans na 60 fps.

W zależności od sprzętu i ilości obiektów na scenie różnica będzie wynosiła od kilkunastu do... w sumie nie wiem ilu procent(laptop: i7 + 660M pokazuje i nawet 120 fps miejscami). 
Jeśli ktoś na nowej, pustej mapie zobaczy grubo ponad 100 fps to nie będę bardzo zdziwiony, tym bardziej, że mój sprzęt już swoje lata ma. 


W obszarach o dużej gęstości budynków i bardzo dużym zaludnieniu (>400k), przyrost jest szacowany tylko na kilkanaście procent z uwagi na duże obciążenie symulacją. Osobiście bez większych problemów mogę uruchomić mapkę 650K mieszkańców ~20-25fps w mieście w porównaniu do vanilli... max 20fps (patrząc w ziemię)

W drugim etapie planowane jest obniżenie spadku FPS do którego dochodzi wraz ze zwiększeniem ilości subskrypcji elementów warsztatu. Tak... to tez ma wpływ, podobny do odświeżania interfejsu, tylko mniejszy, bo rzadko kto próbuje subskrybować tysiące assetów, no chyba, że mówimy o Westdale - słynne Bus Ride'y z PHTN Gaming - 23k assetów, 40min ładowanie zapisu, rozmiar plik stronicowania na poziomie 220GB  Tounge
  Odpowiedz

Witaj na Cities Skylines PL!
Aby dodać odpowiedź zaloguj się, lub zarejestruj nowe konto

Jedynie zalogowani użytkownicy mogą odpowiadać w wątkach

Szybka rejestracja

Możesz także skorzystać z opcji szybkiej rejestracji za pomocą facebooka.



Wiadomości w tym wątku
Problem z FPSami na vanilli - przez Matik1332 - 07-04-2020, 01:55
RE: Problem z FPSami na vanilli - przez krzychu124 - 07-04-2020, 16:26

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości