Ocena wątku:
  • 0 głosów - średnia: 0
Problem z FPSami na vanilli
#1
Witam. Od prawie 3 lat gram w Cities namiętnie, mam przegrane ponad 700h, jednak od samego początku przygody z tą grą trapią mnie lagi. Ta gra jest na tyle piękna, że jakoś one mi nie przeszkadzały jednak po pewnym czasie zaczęły mi dawać po oczach. Grałem z modami jak najbardziej jednak tymi podstawowymi Move It, TM itd łącznie miałem włączonych ok 20 bez żadnych assetów. Po osiągnięciu ponad 15 000 mieszkańców klatki już spadały poniżej 20. Postanowiłem włączyć grę bez modów i stworzyć nowe miasto nawet w konsoli wpisałem polecenia o wyłączeniu warsztatu i modów. Na początku było wszystko pięknie, jednak znów po osiągnięciu nieco ponad 15 tys mieszkańców klatki spadły do okolic 20 na czystej vanilii. Strasznie mnie to zaczęło wkurzać bo na prawdę nie wiem o co chodzi zmniejszanie ustawień graficznych nie daje poprawy znacznie tylko o 1 - 2 fpsy. Moja specyfikacja: Intel i5-4460, GTX 1050 Ti, 24gb Ramu (specjalnie w zeszłym roku dokupiłem ramy bo myślałem że coś pomoże). Gram ze wszystkimi DLC + content packami, wczoraj zacząłem grę z dwoma dlc After Dark i Industries żeby zobaczyć czy dlc maja na to wpływ. PS: Ja zdaje sobie sprawę, że optymalizacja w tej grze nie należy do fantastycznych, ale mi zależy tylko na grze z 30 klatkami kiedy przybliżę widok. Jeżeli ktoś wie i może mi doradzić co zrobić to będę wdzięczny.
  Odpowiedz
#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.



Skocz do:


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