Wybierz ustawienia plików cookie
Używamy plików cookie i podobnych narzędzi, aby świadczyć nasze usługi, rozumieć, w jaki sposób klienci korzystają z naszych usług, abyśmy mogli wprowadzać ulepszenia i wyświetlać reklamy.
Wystąpił błąd podczas zapisywania Twoich ustawień plików cookie.
Wróć do aktualności

Za kulisami: Wydajność

J Brian Smith

Witajcie! Nazywam się J Brian i odpowiadam za główne prace technologiczne zespołu Crucible. Jedną z kluczowych rzeczy, za które odpowiada nasz zespół, jest wydajność gry.

 

Ogólnie rzecz biorąc, wydajność odnosi się do poczucia responsywności i płynnego działania gry. Jednak problemy z wydajnością mogą przybierać wiele różnych postaci i mają wiele różnych przyczyn. Na początku porozmawiajmy o kluczowych komponentach wydajności gry i o pracach, które odbywały się od maja. Później porozmawiamy o kolejnych krokach, które podejmiemy w drodze ku jaśniejszej i wydajniejszej przyszłości!


 


Częstotliwość wyświetlania klatek

Niemal każdy gracz wie, że im więcej klatek na sekundę (ang. fps), tym lepiej.  Problemy z liczbą klatek na sekundę mogą przybrać postać  wydłużonych klatek lub „zacięć” (ładowanie jednej klatki trwa znacznie dłużej niż poprzednich, co może być odczuwane jako „przeskakiwanie”). Dążymy do tego, żeby na komputerach spełniających zalecane wymagania sprzętowe, z użyciem domyślnych „wysokich” ustawień graficznych, Crucible działało przy stałej liczbie 60 klatek na sekundę.  Na sprzęcie wysokiej klasy, gra powinna działać jeszcze szybciej, a na komputerach spełniających minimalne wymagania, z domyślnymi „niskimi” ustawieniami, gra powinna działać przy prędkości przynajmniej 30 klatek na sekundę.  Obecnie, przy zalecanej konfiguracji, większość klatek wyświetlana jest z częstotliwością 60fps, jednak zbyt często obserwujemy chwilowe spadki poniżej tej wartości lub pojedyncze nieprawidłowe klatki.

 

Podczas pracy jednak, zwykle patrzymy na „czas klatek”, a nie na ich liczbę. Aby osiągnąć wartość 60 klatek na sekundę, każda klatka może trwać maksymalnie 16,5 milisekundy. Nasza praca polega głównie na skróceniu czasu potrzebnego do zakończenia symulacji i wyrenderowania pojedynczej klatki. Wykonaliśmy ponad tuzin mikrooptymalizacji pod kątem częstotliwości wyświetlania klatek i od wypuszczenia gry ograniczyliśmy czas wyświetlania klatek o ponad 15% dla konfiguracji zalecanej, dzięki czemu zeszliśmy poniżej progu  i większość klatek już wyświetla się krócej niż maksymalne 16,5 milisekundy. Większość usprawnień wywodziła się z poprawy wydajności kluczowych systemów i kodu silnika, który odpowiada za wykonywanie logiki gry i renderowanie, lub lepszego wykorzystania bezczynnych rdzeni procesora w miejscach, gdzie nasz kod niepotrzebnie ograniczał wykorzystanie procesora do jednego rdzenia w danym momencie.

 

Desynchronizacja

 

Kiedy Twój klient (kopia gry działająca na Twoim komputerze) i serwer prawidłowo współdzielą stan świata gry, stwierdzamy, że są zsynchronizowane, czyli „zgodne” w kwestii stanu tego świata. Desynchronizacja ma miejsce wtedy, gdy klient i serwer mają w danej chwili odmienne dane świata gry. Jeśli tak się stanie, serwer wydaje poprawkę klientowi, wymuszając przyjęcie stanu świata z serwera (serwer  zawsze ma w tej kwestii „pierwszeństwo” ). Ta poprawka sprawia, że świat wygina się w nienaturalny sposób z perspektywy gracza. Ty lub inny gracz możecie zostać „wystrzeleni” w inne miejsce, możesz przypadkowo użyć jakiejś zdolności lub jedynie będzie Ci się wydawać, że została użyta, czy też inna wartość gry może się zmienić w sposób, który wygląda na nienaturalny. Desynchronizacja kilku klatek z rzędu daje szczególnie nieprzyjemne rezultaty i może prowadzić do problemów z częstotliwością wyświetlania klatek lub z przepustowością.

 

Realia ruchu internetowego i modele synchronizacji sieci o niskiej latencji oznaczają, że nigdy nie uda nam się ich ograniczyć do zera, ale możemy je usprawnić. Wykryliśmy kilka sytuacji, gdzie pojedyncza desynchronizacja spowodowana przez pominięty pakiet internetowy lub błąd logiczny mogła prowadzić do ciągu dziesiątek następujących po sobie desynchronizacji. Naprawienie kilku takich błędów zmniejszyło ogólną częstotliwość desynchronizacji o ponad połowę w stosunku do tego, co obserwowaliśmy w momencie wypuszczenia gry.

 

Pamięć RAM

Kiedy gra wykorzystuje pamięć o dostępie swobodnym (RAM) Twojego komputera lub pamięć wideo RAM niemal do granic możliwości, wydajność zdecydowanie cierpi, zwłaszcza jeśli inne programy lub systemy również korzystają z tych zasobów. Wykorzystywanie mniejszej ilości pamięci sprawia, że jest mniejsze prawdopodobieństwo osiągnięcia tych limitów, zapewnia płynność gry i może pozwolić nam na uruchomienie gry na większej liczbie różnych konfiguracji sprzętowych.

 

Postanowiliśmy, że naszym celem będzie zmniejszenie wykorzystania pamięci o 3 GB (to dużo, biorąc pod uwagę, że uruchamiamy grę na maszynach posiadających 8 GB pamięci RAM!) i na dzień aktualizacji z 12 sierpnia, udało nam się już ograniczyć tę wartość o 2,6 GB. Najtrudniejszym elementem tej pracy było zaimplementowanie w naszym silniku znacznie lepszego kodu do pomiaru i raportowania, aby dostarczyć naszym programistom szczegółowe dane dotyczące tego, co tak właściwie wykorzystuje całą pamięć. Uzbrojeni w dokładne dane na temat systemów i treści wykorzystujących pamięć, zoptymalizowaliśmy ponad pół tuzina kluczowych obszarów gry, w kodzie jak i treści, co znacząco przyczyniło się do zmniejszenia wykorzystania pamięci bez konieczności poświęcenia jakości gry. Te działania znacząco poprawiły wrażenia z gry na słabszych komputerach.

 


Przepustowość sieci

Większość połączeń internetowych ulega wahaniom w trakcie meczu. Kiedy gra musi wysłać lub odebrać większą ilość informacji niż połączenie może obsłużyć w danej chwili, informacje te znikają, a w grze pojawia się desynchronizacja i wysokie opóźnienie. Zmniejszenie przepustowości wykorzystywanej przez grę pozwala ograniczyć częstotliwość występowania tych problemów.

 

Jednym z kluczowych elementów optymalizacji w tej kwestii było poradzenie sobie z kilkoma ważnymi systemami, które zużywały znacznie więcej przepustowości sieci niż było to konieczne do synchronizowania ich danych.

 

Śledzenie postępu

Omówiliśmy już cztery czynniki, czyli częstotliwość wyświetlania klatek, desynchronizację, pamięć i przepustowość, które w głównej mierze składają się na wrażenia graczy związane z wydajnością gry, ale skąd wiemy, że nasze zmiany działają?

 

Bez konsekwentnych pomiarów charakterystyk wydajności, określenie czy robimy postępy jest bardzo trudne! W trakcie rozwoju uważnie mierzyliśmy wydajność i wciąż doskonalimy naszą zdolność rozumienia wszystkich scenariuszy w zakresie wydajności gry. Są trzy główne sposoby, aby śledzić zmiany wydajności w czasie:

 

  • Poprawiliśmy automatyzację testów, które automatycznie badają i zbierają szczegółowe dane dotyczące wydajności gry, nawet dziesiątki razy dziennie. A to wszystko po to, by spójnie i właściwie opisać wydajność. Te dane pozwalają nam szybko wyłapywać pojawiające się problemy i weryfikować skuteczność nowych elementów optymalizacji.

 

  • Automatycznie zbierane dane uzupełniamy o manualne przebiegi wydajnościowe, gdy nasz zespół dbający o jakość (QA) gra w naszą grę, używając przy tym specjalnych narzędzi i kodu rejestrującego wydajność. Dzięki temu mamy pewność, że posiadamy dane z rzeczywistych scenariuszy rozgrywki, które w innym przypadku mogłyby zostać pominięte przez zautomatyzowane testy (te zaś z uwagi na swoją konstrukcję badają zawsze te same warunki).

 

  • Na koniec na naszej wewnętrznej stronie śledzimy dane wydajnościowe wysokiego poziomu z rzeczywistych rozgrywek na świecie, aby porównać to, czego doświadczają gracze z naszymi oczekiwaniami, które wynikają z wewnętrznych testów.

 


Spoglądając w przyszłość

Teraz, gdy już omówiliśmy elementy wpływające na wydajność, ich stan dla atrybutów Crucible i to, jak je mierzymy, pozostaje nam tylko jeden temat: co dalej? Oto kilka podzielonych na kategorie elementów, nad którymi obecnie pracujemy:

 

Częstotliwość wyświetlania klatek

W naszych wewnętrznych testach na urządzeniu o zalecanej specyfikacji, wciąż jest około 10% klatek, których ładowanie zajmuje 19 ms (pamiętajcie, że celujemy w 16,5 ms lub mniej), a dla 1% klatek ta wartość wynosi 23 ms. Mamy zamiar wykorzystać dodatkowe rdzenie procesora, które zmniejszą linię odniesienia czasu klatek, zwłaszcza na mocniejszych komputerach z większą liczbą rdzeni. Będziemy także prowadzić pogłębioną analizę sytuacji, które prowadzą do „nieprawidłowych klatek”, aby móc odnieść się do ich szczegółowych przyczyn. Na koniec, będziemy pracować nad zrównoważeniem obciążenia pracy, którą trzeba włożyć w wyświetlenie każdej jednej klatki.

 

Zmierzamy do obsługi stałej liczby 144 klatek na sekundę na mocniejszych komputerach. W perspektywie krótko i średnioterminowej skupiamy się głównie na obsłudze stałej liczby 60 klatek na sekundę na maszynach spełniających nasze wymagania konfiguracji zalecanej, a te korzyści od razu przyczynią się do wyższej liczby klatek na sekundę także na mocniejszym sprzęcie.

 

Desynchronizacja

Przez następne kilka miesięcy będziemy pracować nad zmniejszeniem częstości desynchronizacji o ponad połowę, co sprawi, że będą one występowały rzadziej i powinno to mieć widoczny wpływ na dalsze poprawienie ogólnego wrażenia z gry, zwłaszcza w sytuacjach intensywnej walki. Te optymalizacje będą pochodzić z poprawy logiki przewidywania w sytuacjach, gdzie istniejące przewidywanie jest niezbędne, ale bardzo wrażliwe, a także z usunięcia niepotrzebnych elementów logiki przewidywania.

 

Pamięć RAM

Ja już wcześniej wspomniałem, wyznaczyliśmy sobie cel ograniczenia wykorzystania pamięci przez Crucible o 3 GB i już udało nam się osiągnąć ograniczenie na poziomie 2,6 GB. Poprzez kilka zaplanowanych optymalizacji kodu i zawartości (zwłaszcza powiązanych ze sposobem ładowania geometrii do pamięci) prawdopodobnie uda nam się osiągnąć ten cel w ciągu następnego miesiąca.

 

Przepustowość sieci

W następnym wydaniu wykorzystamy pewne technologie szybkiej kompresji, co pozwoli dodatkowo ograniczyć wykorzystanie przepustowości o szalone 30%. Dzięki temu, będziemy mogli konsekwentnie spełnić nasz cel, zakładający wykorzystanie mniej niż 300 kb/s przepustowości pobierania, a przez większość czasu ta wartość będzie zdecydowanie niższa.

 

Po osiągnięciu tych wartości na razie zakończymy optymalizację wykorzystania przepustowości, ale wciąż będziemy badać na ile możemy poprawić używaną w grze przepustowość wysyłania.  Wykorzystywana przepustowość wysyłania jest na ogół mniejsza, jednak połączenia części graczy mają dużo większe ograniczenia wysyłania niż pobierania, dlatego też warto byłoby dalej prowadzić optymalizację w tym kierunku, jeśli uda nam się znaleźć stosowne możliwości.

 


Dziękujemy za zapoznanie się z tym, co mamy do powiedzenia i za granie w Crucible! Zdajemy sobie sprawę z tego, że wydajność jest kwestią kluczową dla strzelanki z trybem gry wieloosobowej. Nigdy nie będziemy całkowicie zadowoleni z osiągnięć i zawsze będziemy szukać nowych sposobów na poprawienie wydajności w grze. Jeśli interesujesz się wydajnością i masz jakieś uwagi dotyczące konkretnych sytuacji w grze, które wydają się być problematyczne, z chęcią ich wysłuchamy – kanał „#bugg reports” na platformie Discord to doskonałe miejsce by się nimi podzielić.


V2