Stan rejestracji trafień
Cześć. Jestem Kevin Lee. Pracuję jako programista w zespole ds. systemów gry VALORANT. Nasza ekipa odpowiada za opracowanie wielu podstawowych systemów, które obsługują rozgrywkę w VALORANT, włącznie z ruchem, walką i sygnałami wejściowymi. W tym artykule objaśnię jeden z systemów kluczowych dla rozgrywki w grach z rodzaju FPS — rejestrację trafień.
W grze takiej jak VALORANT rejestracja trafień jest zapewne jednym z najważniejszych systemów, ponieważ o zwycięstwie lub przegranej może decydować jedno trafienie w głowę. Naszym celem jako twórców gry jest dopilnowanie, aby wynik strzału oddanego przez gracza był klarowny, właściwie odczuwany, a przede wszystkim poprawny.
Czasami widzimy wpisy lub dostajemy od graczy wiadomości z załączonymi filmikami, na których rejestracja trafień wydaje się zepsuta. Wszystkie takie zgłoszenia traktujemy poważnie i przeglądamy każdy filmik klatka po klatce, aby sprawdzić, czy system działa jak należy.
Zasadniczo uważamy, że w tej chwili rejestracja trafień w VALORANT działa całkiem nieźle. Owszem, wciąż mogą pojawiać się wyjątkowe błędy i zawsze będziemy je traktować poważnie. Stale staramy się poprawiać jakość i przejrzystość wszystkich naszych systemów.
POPRAWNOŚĆ A PRZEJRZYSTOŚĆ
Podczas bety patcha 0.50 odnotowaliśmy gwałtowny napływ zgłoszeń problemów z rejestracją trafień. Po przejrzeniu zgłoszeń i filmów graczy oraz po pogłębionych testach wewnętrznych zdołaliśmy zidentyfikować kilka występujących w wyjątkowych okolicznościach błędów z rejestracją trafień, ale żaden z nich nie był na tyle poważny, by mógł wyjaśnić liczbę zgłoszeń, które dostaliśmy. Po bliższej analizie stwierdziliśmy, że większość filmów obrazowała problemy nie z poprawnością, lecz z przejrzystością. Strzały były prawidłowo przetwarzane, ale ich wizualna reprezentacja wprowadzała gracza w błąd. W tym miejscu należy wskazać na ważną różnicę między poprawnością a przejrzystością.
Jakkolwiek oba te aspekty są ważne dla zapewnienia „wyczucia” strzału...
- Poprawność odnosi się do nieprawidłowego wyniku strzału (np. pociski trafiają w głowę, ale rejestrowane są jako trafienia w korpus, albo przeciwnicy pojawiają się w innych miejscach w kliencie, a w innych na serwerze).
- Przejrzystość odnosi się do niedostatecznej klarowności prezentacji trafienia strzału (np. pocisk trafia w ramię, ale przez efekt wizualny wygląda to tak, jakby pocisk trafił w głowę).
- Błędy poprawności są znacznie gorsze od błędów przejrzystości.
Mamy nadzieję, że ten artykuł nieco objaśni działanie systemu, aby wszyscy potrafili analizować swoją rozgrywkę i rozumieli, co dzieje się na ekranie, gdy oddają strzał. Opiszę ogólne zasady pracy systemu i wyjaśnię, co się dzieje od momentu naciśnięcia przycisku strzału do wyświetlenia trafienia w głowę.
Głębsze i bardziej szczegółowe omówienie techniczne znajdziecie w tym artykule o kodzie sieciowym VALORANT na blogu technicznym Riot.
Ponadto przeanalizuję najczęstsze zgłoszenia „zepsutej rejestracji trafień�� i postaram się wyjaśnić, do czego się odnoszą i co robimy dla poprawienia przejrzystości w tych scenariuszach.
OD KLIKNIĘCIA DO TRAFIENIA W GŁOWĘ
Zanim zagłębimy się w to, co dzieje się, gdy następuje strzał, należy zrozumieć, jak gra symuluje wydarzenia. Rozgrywka w VALORANT symulowana jest dwukrotnie: raz na serwerze (który decyduje o przebiegu symulacji) i raz w waszym kliencie (który przewiduje wyniki serwera dla zwiększenia szybkości reakcji gry).
Symulacja gry obejmuje wszystko, co składa się na świat, włącznie z pozycjami wszystkich graczy, wszelkimi odpalonymi umiejętnościami i wszelkimi zasłonami dymnymi na polu bitwy. Co każdą klatkę gra wykonuje zrzut stanu symulacji i na jego podstawie renderuje kadr na waszym ekranie. Serwer także wykonuje to dla każdej własnej klatki (pomijając krok renderowania, ponieważ nikt nie ogląda gry na serwerze).
Wróg wychyla się zza rogu, a wy dzięki wspaniałemu opanowaniu poruszania celownikiem już namierzyliście jego głowę. Wciskacie lewy przycisk myszy, aby wystrzelić — i co się dzieje?
W momencie, w którym naciskacie klawisz, dane zostają wysłane do naszego systemu sygnałów wejściowych (podlegając niewielkiemu opóźnieniu ze względu na sprzęt/system operacyjny). Co każdą klatkę gry system sygnałów wejściowych przetwarza wszystkie dane otrzymane od czasu poprzedniej klatki. Gdy oddajecie strzał, sygnał wejściowy tego „strzału” wysyłany jest na serwer razem ze znacznikiem czasu wskazującym, w której klatce symulacji nastąpi�� strzał.
Należy zwrócić uwagę, że ten znacznik czasu odpowiada temu, co było aktualnie renderowane na waszym ekranie w momencie odebrania przez VALORANT sygnału wejściowego. Teraz musimy prześledzić strzał w dwóch różnych symulacjach: na kliencie i na serwerze.
Zacznijmy od klienta, czyli waszej lokalnej maszyny. Natychmiast po wysłaniu strzału na serwer klient zaczyna pracować nad wyświetleniem rozbłysku lufy i smugi wystrzału. Najwcześniej wydarzy się to po jednej klatce od wysłania sygnału wejściowego strzału, ponieważ gra musi wyrenderować nowy kadr na waszym ekranie. To ważne, ponieważ oznacza to, że klatka przetwarzania strzału NIE jest tą samą klatką, w której wyświetlana jest smuga. Faktycznie jest to co najmniej jedna klatka wcześniej.
Czasami prowadzi to do zakłócenia przejrzystości strzału. Zwykle stosowanym sposobem rozwiązania problemu takiej desynchronizacji jest opóźnienie pocisku. Nie robimy tego, ponieważ opóźnienie pocisku zwiększa opóźnienie sygnałów wejściowych, które w VALORANT chcemy zminimalizować. Aby uzyskać potwierdzenie trafienia, klient czeka na uzyskanie od serwera wyniku, po czym wyświetla odpowiedni efekt. W celu zapewnienia spójności u wszystkich użytkowników i uniemożliwienia oszustom hakowania klientów graczy, by podawały fałszywe wyniki strzałów, wszystkie wyniki strzałów ustalane są wyłącznie na serwerze.
W międzyczasie serwer w końcu dostaje od klienta komunikat, że został oddany strzał. Ze względu na opóźnienie połączenia internetowego od wystrzelania tego strzału upłynął już pewien czas. Aby mieć gwarancję, że strzał został oddany w tej samej symulacji, która została pokazana graczowi, przed dokonaniem analizy rejestracji trafienia serwer przewija wstecz symulację do znacznika czasu podanego przez klienta. Obejmuje to przewinięcie wstecz pozycji i póz animacji graczy. Następnie serwer wysyła wynik strzału z powrotem do klienta. Na potrzeby niniejszego przykładu powiedzmy, że to było trafienie w głowę!
Klient otrzyma od serwera komunikat z wynikiem strzału, a następnie odtworzy odpowiedni efekt wizualny i dźwiękowy. W tym przypadku będzie to efekt wizualny i dźwiękowy trafienia w głowę. Ponieważ klient musi poczekać, aż serwer poda wynik strzału, następuje opóźnienie między smugą a efektami trafienia równe drodze w obie strony w waszym połączeniu (np. 40 ms do serwera = 80 ms opóźnienia między smugą a efektem wizualnym trafienia) plus niewielkie opóźnienie wynikające z przetwarzania informacji. W gorszych warunkach połączenia to sumaryczne opóźnienie może być zauważalne w czasie rzeczywistym.
Intensywnie pracujemy nad rozwiązaniem tego problemu pod kątem poprawienia przejrzystości.
STUDIUM PRZYPADKU 1: Trafianie w ruchome cele
W wielu zgłoszeniach dotyczących rejestracji trafień widzimy, że cel strzału biegnie. Przyjrzyjmy się bliżej temu, co widać, gdy strzał pomyślnie trafia w biegnący cel. Widzimy, że graczowi udaje się trafić w głowę biegnącej postaci. Dla łatwiejszego zilustrowania tego przykładu załóżmy, że klient wyświetla 60 klatek na sekundę. Widać, że w klatce przed odpaleniem smugi celownik gracza pokrywa się z głową przeciwnika.
Jednak w momencie, gdy pojawia się smuga, już tak nie jest.
Drugi filmik pokazuje tę samą sytuację, tyle że strzał o włos chybia celu. Gdy obejrzycie film klatka po klatce, zauważycie, że tu jest na odwrót: celownik znajduje się poza głową w klatce przed pojawieniem się smugi, ale na głowie w klatce, gdy smuga wylatuje. W pierwszej chwili można by wskazać klatkę ze smugą i powiedzieć: „Patrzcie, to wyraźnie było trafienie w głowę!”. Jednak przeglądając filmy lub powtórki, powinniśmy patrzeć na klatkę przed pojawieniem się smugi, aby uzyskać właściwy obraz tego, kiedy został oddany strzał.
Wróćmy do przykładu, w którym strzał trafił i spójrzmy na klatkę, gdy renderowany jest efekt wizualny trafienia. Da się zauważyć odstęp między aktualną pozycją gracza a umiejscowieniem efektu wizualnego trafienia. Wynika to z opóźnienia połączenia internetowego. Może to być mylące, gdy próbujecie zrozumieć, co stało się z waszym strzałem, ponieważ najprawdopodobniej skupicie się na aktualnej pozycji przeciwnika, a nie na jego pozycji w momencie wystrzału. Jeszcze mniej jasna może być sytuacja z kucaniem/ruchem w bok (której przyjrzymy się w studium przypadku 2).
![case-study-1_part2_frame-where-hit-vfx-rendered.jpg](https://cmsassets.rgpub.io/sanity/images/dsfx7636/news_live/94d93a6d8ab92712414a700c4fa685917b1b2b00-963x603.jpg)
Niniejszy przypadek ilustruje niepełną przejrzystość aktualnego systemu rejestracji trafień. Najlepiej by było, gdybyście nie musieli rozumieć wszystkich tych informacji dotyczących działania systemu w tle, aby móc właściwie odczytywać sytuację. Jako twórcy gry rozumiemy to i szukamy sposobów poprawienia przejrzystości w tych przypadkach.
STUDIUM PRZYPADKU 2: Kucanie a efekt wizualny strzału
Wdaliście się w strzelaninę z dużej odległości. Przytrzymujecie lewe kliknięcie i puszczacie serię ze swojej spluwy. Nie będziecie z tego zadowoleni w niedalekiej przyszłości. Ale przynajmniej jeden z tych pocisków powinien trafić w głowę, prawda? Jednak tak nie jest. Zaliczacie 3 trafienia w korpus swoim Vandalem, zadając 117 punktów obrażeń, po czym sami dostajecie trafienie w głowę.
Wściekli, po grze przeglądacie zapis filmowy, przekonani, że wystąpił problem z rejestracją trafień. Widzicie, że wrogi gracz kuca, próbując uniknąć waszych strzałów. Ku waszemu zaskoczeniu widzicie efekt wizualny trafienia dokładnie na czubku głowy przeciwnika, w momencie gdy gracz kuca. Ale raport z bitwy pokazuje tylko trafienia w korpus! Co jest grane?
Oto link do wpisu na redditcie zatytułowanego Headshots not registering when a player crouches (brak rejestracji trafień w głowę, gdy gracz kuca) dotyczącego tej hipotetycznej sytuacji.
Z doświadczenia naszego zespołu analizującego zgłoszenia złej rejestracji trafień wynika, że to jest najczęstszy przypadek domniemanej nieprawidłowej rejestracji trafień. W rzeczywistości rejestracja trafień działa prawidłowo — strzały lecą tam, gdzie je wycelowaliście (pomijając rozrzut i błędy wynikające z poruszenia) w momencie wciśnięcia przycisku otwarcia ognia i taki strzał jest poprawnie rejestrowany na serwerze.
Jednak kilka różnych czynników sprawia, że ten konkretny przypadek jest wizualnie wprowadzający w błąd:
- Efekty wizualne trafienia są opóźnione z powodu opóźnienia połączenia internetowego.
- Efekty wizualne trafienia są wyświetlane w miejscu uderzenia pokrywającym się z pierwotnym położeniem celownika.
- Gracz będący celem, porusza się (najczęściej kuca).
W kolejnym przykładzie załóżmy, że gracz ma ping 50. Gracz trafia przeciwnika w ramię. Ponieważ musimy poczekać, aż serwer potwierdzi trafienie, dopiero 100 ms później efekt wizualny trafienia zaczyna być odtwarzany w miejscu trafienia w korpus. Lecz podczas tych 100 ms przeciwnik zaczął kucać, przesuwając głowę tuż pod właśnie wygenerowany efekt wizualny trafienia. Z dużej odległości i w ferworze strzelaniny efekt wizualny trafienia w korpus może zostać pomylony z efektem wizualnym trafienia w głowę.
![case-study-2_cursor-on-body.jpg](https://cmsassets.rgpub.io/sanity/images/dsfx7636/news_live/1bdd9ffd43cb5055f07bea55edc8aadfe07e07d2-1280x720.jpg)
![case-study-2_hit-VFX-on-body-correctly.jpg](https://cmsassets.rgpub.io/sanity/images/dsfx7636/news_live/d5470a4076ddb2f1e68fef158775255a09ead1c5-1280x720.jpg)
![case-study-2_player-crouches-into-vfx.jpg](https://cmsassets.rgpub.io/sanity/images/dsfx7636/news_live/0e74fc862fc773013ab1817522f88874bccf1995-1280x720.jpg)
Szczególnie drastyczne było to podczas bety patcha 0.50, gdy na skutek błędu wszyscy mieli wyłączone wyświetlanie krwi. Efekty wizualne błysku podczas trafienia w głowę i trafienia w korpus są trudniejsze do odróżnienia. Zawsze mieliśmy osobne efekty wizualne dla trafień w korpus i trafień w głowę, ale zdaliśmy sobie sprawę, że nie w każdym przypadku są one przejrzyste w walce.
Jest to problem niedostatecznej przejrzystości rejestracji trafień, który intensywnie staramy się usunąć. Jednym z rozwiązań, z którymi eksperymentujemy, jest powiązanie efektu wizualnego trafienia z częścią ciała postaci, która została trafiona. Dzięki temu zachowana zostanie jasna korelacja nawet przy wysokim opóźnieniu.
Porównanie naszego obecnego efektu wizualnego trafienia w głowę bez krwi z efektem wizualnym trafienia w korpus:
PLANOWANE UDOSKONALENIA PRZEJRZYSTOŚCI
Dwa opisane powyżej przypadki pokazują obszary, w których nasz aktualny efekt wizualny potwierdzenia trafienia okazuje się niewystarczający. Jedna ze zmian, nad którymi pracujemy, opiera się na pomyśle, że efekty krwi oraz błysku są generowane w aktualnej pozycji postaci, zgodnie z tym, która część jej ciała została trafiona, i podążają za tą postacią. To znacznie poprawia przejrzystość w sytuacjach takich jak studium przypadku 2 z kucającymi wrogami, ponieważ efekt wizualny porusza się zgodnie z ich ruchem ciała.
Wada tego podejścia polega na tym, że efekt wizualny potwierdzający trafienie może przesunąć się za osłonę razem z postacią, do której jest przyłączony. Rozważmy przypadek gracza z pingiem wynoszącym 100 ms, który strzela w innego gracza, na chwilę wychylającego się zza rogu. Jeśli pierwszy gracz trafi we wroga, który natychmiast cofnie się za róg, jeszcze zanim nadejdzie potwierdzenie trafienia z serwera, strzelec może nie zobaczyć potwierdzenia trafienia, gdy zostanie wygenerowane.
Zastanawialiśmy się nad częściowym rozwiązaniem tego problemu przez dodanie kilku efektów cząsteczkowych częściowo podążających za postacią, a częściowo generowanych natychmiast w miejscu trafienia w oparciu o symulację na kliencie. Jednak to z kolei może prowadzić do nieporozumień, jeśli symulacje klienta i serwera w jakimkolwiek momencie nie zgodzą się co do wyniku strzału: efekty muszą być klarownie reprezentowane, aby łatwo było odczytać rezultat strzału.
Wciąż badamy tę kwestię, a także inne ulepszenia przejrzystości i mamy nadzieję, że wkrótce będziemy mogli opublikować zestaw aktualizacji dotyczących klarowności w nowym patchu
PRZYSYŁAJCIE NAM DALEJ FILMY
Mamy nadzieję, że dzięki temu artykułowi lepiej rozumiecie, jak działa rejestracja trafień w VALORANT i dlaczego strzały reprezentowane są w taki, a nie inny sposób. Przysyłajcie nam dalej filmy za każdym razem, gdy uważacie, że rejestracja trafień działa nieprawidłowo. Postaramy się obejrzeć je wszystkie.
Nawet jeśli w danym przypadku problem nie istnieje, filmy pomagają nam szybciej namierzać błędy poprawności rejestracji trafień, które faktycznie mają miejsce. (Poza tym tętno mi skacze za każdym razem, gdy widzę słowa „rejestracja trafień” na górze wysoko głosowanego wpisu na redditcie).
Poniżej link do przykładu błędu poprawności rejestracji trafień wysłanego na reddita.