Wpis z mikrobloga

Jako że pracuję jako programista od lat 15 w zawodzie, podjąłem się próby rozwikłania tego, co działo się z CP77 w ostatnich miesiącach. Doszedłem do dość interesujących wniosków mimo, iż dziedzina IT, którą się zajmuję to nie to samo, co projektowanie złożonych światów 3D. Występują pewne analogie w kontekście tego, co dzieje się z kodem pod wpływem zmian obciążenia i ilości przetwarzanych danych oraz jak kluczowe decyzje podejmowane na początku projektowania danego rozwiązania, mogą wpłynąć na zamknięcie pewnych dróg rozwoju w późniejszym czasie.

Do analizy posłużyło mi kilka obserwacji, już z samego początku gry. Kiedy o tym pisałem w grudniu byłem obśmiewany jako ktoś kto się "czepia", ale moim zdaniem, te obserwacje dotyczyły elementów świadczących o nieprawidłowym podejściu do projektowania wirtualnego świata.

W jednej z pierwszych misji w grze, wraz z Jackiem wsiadamy do samochodu. Jackie kieruje. Zauważyłem to zupełnym przypadkiem, ponieważ po wyjściu z budynku nie podszedłem od razu do Jackiego, tylko ukradłem samochód i pojechałem się kawałeczek przejechać, zobaczyć jak funkcjonuje miasto. Model jazdy może nie był idealny, ale nie był też tragiczny. Wydawał się jedynie nieco zbyt czuły w kontekście klawiatury, ale taką pierdołę można uznać za naprawialną przy okazji którejś z łatek, które mają nadejść. Paradoksalnie ta przejażdżka i pierwsze zetknięcie z modelem jazdy spowodowały, że gdy wróciłem do Jackiego i wsiedliśmy do samochodu coś mi nie zagrało. Po pierwsze Jackie w zasadzie nie kierował pojazdem. Prawie nie wykonywał ruchów rękoma. Sama kierownica ruszała się, ale wykonywała nieproporcjonalnie małe skręty względem faktycznego kąta skrętu samochodu. Kiedy my sami siadamy za kierownicą czuć bardzo mocno to jak samochód jedzie. Skręcasz, ręce naszego bohatera skręcają kierownicą, wykonują szeroki obrót, gdy skręcamy maksymalnie w lewo, czy prawo itd. Wygląda to z grubsza naturalnie. Natomiast będąc pasażerem wyglądało to tak, jakbyśmy obaj (Jackie i nasz bohater) siedzieli w pudełku przypominającym jedynie samochód, które porusza się po ustalonym oskryptowanym torze. Samochód nie zwalniał, nie przyspieszał w naturalny sposób. CO WIĘCEJ odnosiłem bardzo silne wrażenie, że samochód jeździ w dziwaczny sposób. To było wyczuwalne szczególnie podczas brania ostrych zakrętów. Jakbym zamiast siedzieć z przodu długiego samochodu siedział w kabinie koparki, która jest w stanie skręcać 4 kołami powodując obrót całej koparki w miejscu. Rozumiecie o co mi chodzi? Jak macie samochód, skręcacie kołami, tył pojazdu zawsze bierze łuk po nieco mniejszym promieniu. Da się wyczuć, że przód pojazdu skręca ciągnąc za sobą resztę. Kiedy jednak weźmiecie do ręki zwykłego resoraka, nie skręcicie kołami tylko całym resorakiem w sposób zupełnie nienaturalny. Odrobina uważności i się to da dostrzec.

Wówczas zapaliła mi się lampka. To nie był błąd w grze, tylko część głęboko zakorzenionej mechaniki. Wyglądało na to, że Jackie nie posługuje się algorytmem prowadzenia samochodu, który sprawia, że skręcamy kołami o 40 stopni więc samochód skręca trochę w lewo. Wyglądało wręcz na to, że programiści z CDP w ogóle nie stworzyli algorytmów, które łączyłyby zachowanie pojazdu z zachowaniem kierującego, a co gorsza, kształt trasy i zakręty w ogóle nie były połączone bezpośrednio z pojazdem. Miałem wręcz wrażenie jakby na środku pasa jezdni była narysowana niewidoczna linia, której samochód trzymał się jak dwukołowy tramwaj torów. Celowo mówię dwukołowy, bo tramwaj z czterema kołami skręca tak jak samochód, najpierw przód, potem tył, środek po nieco mniejszym łuku niż część z kołami (nieco inaczej niż w samochodach).

Pomyślałem jednak wtedy, że może ilość detali w samochodzie była tak złożona, że nie byli w stanie tego ogarnąć i jazdy jako pasażer oskryptowali w taki sposób, że wsiadamy do oskryptowanego pudełka przypominającego samochód, które sobie sunie przed siebie nie bacząc na kąty zakrętów itd.

JESZCZE SILNIEJ poczułem to na końcu kiedy na parkingu wysiadamy z samochodu, a Jackie odjeżdża w pewnym momencie bierze zakręt w stronę rampy wyjazdowej z parkingu. Samochód obraca się tak nieprawdopodobnie nienaturalnie, że szczena mi opadła.

Wiecie o co mi chodzi? Kiedy jako programista tworzysz algorytm poruszania się samochodu po drodze, taki algorytm, by wyglądać wiarygodnie musi uwzględniać wiele czynników. Długość samochodu, kształt zakrętu, prędkość, szerokość drogi, a nawet kąt maksymalne skrętu pojazdu. Trudno to opisać, ale myślę, że każdy z was byłby w stanie ocenić czy dany sposób chodzenia wirtualnej postaci wygląda naturalnie, czy jest sztuczny i drewniany. Tu jest podobnie.

I wtedy zrozumiałem jedną rzecz. Dostaliśmy grę z miastem, w którym jeździ mnóstwo samochodów i ta gra jest praktycznie całkowicie pozbawiona mechaniki sztucznej inteligencji prowadzącej pojazdy. Pojazdy poruszają się po ściśle określonych narysowanych przez programistów torach. Jeśli taki tor programista narysuje jako zbyt ostry, samochód będzie NADAL się nim poruszał mimo, że jego poruszanie jest kompletnie niezgodne z jakimikolwiek nawet nagiętymi prawami fizyki.

Dowodów na postawioną tezę w grze jest wiele. Niemal każdy z was widział samochody centralnie wjeżdżające w rampy. Samochody o tak naprawdę kartonowe pudełka, które mają swoje wirtualne tory. Jeśli w trakcie projektowania gry w danym miejscu tor był ustawiony w określony sposób i np. przebudowano trasę, dodano jakąś rampę, zwężono drogę, ale zapomniano o przesunięciu wirtualnego toru jazdy, to w takiej sytuacji samochody centralnie wbijają się w rampę. Wówczas aktywuje się co prawda algorytm zniszczeń samochodów, który jest uniwersalnym mechanizmem odpalającym się jako trigger w sytuacji zetknięcia samochodu z jakimś obiektem, ale nic ponad. Samochód nie zatrzymuje się na rampie, ponieważ JEDYNYM wyznacznikiem toru jego jazdy jest wirtualny tor, do którego jest przyspawany. Pamiętacie zabawki z lat 90? Takie samochodziki na torach? No to coś w ten deseń. Nie istnieje tutaj żaden algorytm omijania przeszkód. Droga nie jest traktowana przez pojazd jako pewna całostka w ramach, której pojazd może się poruszać i na której mogą występować przeszkody. Do tego prostego jak budowa cepa algorytmu poruszania się po torowisku (wirtualnym) dodano tylko reagowanie na przeszkodę znajdującą się bezpośrednio w jego obrębie np. nasza postać lub zostawiony samochód. Ale ponieważ nie istnieją żadne inne algorytmy reagowania, a pojazdy są przyspawane do swoich torów, taki pojazd będzie stał i tworzył korek przez wieczność. Wyjątkiem jest tylko sytuacja, w której nasza postać stoi pieszo na zetknięciu dwóch pasów drogowych, wówczas odpala się specjalny skrypt omijania przeszkody, którego wielu graczy w ogóle nie dostrzegło (stąd sądzą do dziś, że go nie ma).

I to tyle. Proste torowiska. Stop, gdy przeszkoda / tor zajęty, jedź gdy tor wolny, jedź bezwzględnie nawet jeśli tor przebiega przez inne elementy świata (to samo patrz w kolejce wjeżdżającej w budynek, latających pojazdach wlatujących w budynki itd.) Do tego wszystkiego dodano prawdopodobnie losowy generator decyzji o skrętach na skrzyżowaniach. Wskocz na dach samochodu i łatwo to zobaczyć. Nie istnieje cel podróży po prostu na każdym skrzyżowaniu decyzja co robić. Problem w tym, że taka prosta konstrukcja świata wygenerowała szereg problemów na autostradach, gdzie nie ma świateł decydujących o tym kto ma pierwszeństwo. Jeśli zbiegiem okoliczności na autostradzie do której dojeżdża droga wlotowa zdarzy się tak, że drogą wlotową (dwupasmową) jadą dwa pojazdy oraz autostradą jadą pojazdy na tej samej pozycji.... co się stanie? Wszystkie pojazdy się zatrzymują. Dlaczego? Bo te na autostradzie chcą jechać prosto. Te dojeżdżające chcą wjechać na autostradę. We wszystkich przypadkach zapala się algorytm o przeszkodzie, więc samochody stoją. Programiści rozwiązali ten problem w taki sposób, że kiedy odwracasz głowę od zdarzenia i spoglądasz ponownie część pojazdów magicznie wyparowuje i mogą rozpocząć dalszą jazdę.

Rozumiecie co to wszystko oznacza? Narzeka się w sieci na brak policji, brak zaawansowanego AI ruchu drogowego. Sęk w tym, że to tak jakby oczekiwać od żółwia, że poleci nad budynkiem. Nie poleci, bo najpierw musiałby stać się ptakiem. Dlaczego policja spawnuje się tylko w postaci pieszej? No właśnie dlatego, że w tej grze nie istnieje zaawansowany system poszukiwania ścieżek. Jest tylko szereg algorytmów poruszania się pojazdów do przodu + kilka wyjątków od tej reguły (czyli dodatkowych algorytmów sytuacyjnych). Jeśli zatem nie istnieje system poszukiwania ścieżek, a drogi dla NPCów nie są drogami tylko torowiskami NIE ISTNIEJE możliwość stworzenia policji, która podejmie za nami pościg. Ta policja nie jest zdolna do znalezienia ścieżki podążania za nami. Ona musiałaby omijać inne pojazdy, spychać je na bok, jeździć pod prąd, omijać czerwone światła itd. NIE ISTNIEJE taka funkcjonalność w tej grze. Drogi to dla NPCów torowiska, a torowiska mają to do siebie, że tam się nikogo nie omija, na torowisku czeka się aż się torowisko zwolni.

Dokładnie te same zasady dotyczą NPCów z tą tylko różnicą, że po natrafieniu na przeszkodę nie zatrzymują się, a losowo zmieniają kierunek.

Rezultatem tych rozważań jest wniosek, iż to nie jest tak, że nie zrobiono zaawansowanego AI policji, bo ktoś nie chciał lub nie miał czasu (to samo tyczy się inteligencji tłumu). Ta gra, w chwili obecnej, w obecnym kształcie rozwiązań czysto technologicznych czysto fizycznie nie pozwala na ogarnięcie tego tematu. Bez przepisania części kodu i zmiany podejścia do kierowania pojazdami przez NPCów nie da się tego zrealizować.

No a stąd prostą drogą dotrzeć można do odpowiedzi na pytanie dlaczego zlikwidowano metro (tudzież zrezygnowano z niego). Wykonanie samego jeżdżącego pudełka nie jest trudne (co pokazuje sposób jeżdżenia pojazdów). Problem w tym, że żeby zrobić metro potrzebny jest bardzo wydajny i bardzo zaawansowany algorytm szukania ścieżek. NPC musi wejść do stacji metra, poczekać na pociąg, zatrzymać się w miejscu na peronie obliczając je tak by na nikogo nie wpaść, nie spaść na tory. W chwili zajechania wagonów musi do nich wejść. Następnie omijając innych dotrzeć do konkretnego siedzenia, usiąść tam, lub dotrzeć do konkretnego miejsca i tam się zatrzymać. Do wszystkich tych czynności potrzebna jest po pierwsze zaawansowana technologia wyszukiwania ścieżek, po drugie zaawansowana algorytmika dla detekcji kolizji, po trzecie algorytmy obierania punktów początkowych i koncowych - NPC nie może krążyć po wagonie jak zoombie, musi tam wejść, pojechać, wyjść, ruszyć dalej.

Wydaje mi się zatem, że CDPowi technologicznie nie udało się zrealizować podstawowej funkcjonalności, dzięki której JAKAKOLWIEK GRA może sprawiać realne wrażenie żywego miasta, w którym coś się dzieje. Jedyne co udało im się wykonać to proste IF'y - trafiasz na przeszkodę stój (samochód), zmień kierunek (pieszy), zniknij (ups nie wiem co robić). Na nic innego nie było ich stać w tej materii i to jest w gruncie rzeczy przykre, bo taka technologia dopiero otwiera drogę do żyjącego miasta. Rutyny dziennie i nocne, AI policji, pościgi, walka o terytoria gangów, porządny ruch uliczny, porządna wersja tłumu. Wszystko to na tę chwilę jest całkowicie nierealizowalne i niemożliwe do wykonania. Co więcej mam wręcz wrażenie, że wszystkie sceny pościgów są RĘCZNIE oskryptowane. Ktoś to chyba nawet testował i choćby nie wiem ile kul władował samochody i pojazdy nas ścigające ZAWSZE wybuchają w ten sam sposób i w tych samych miejscach.

No to jaki jest sens tworzenia otwartego świata, skoro de facto CAŁY ten otwarty świat jest oskryptowany? To tak nie powinno wyglądać. Powinien zostać stworzony potężny algorytmiczny potwór, który pozwalał by oskryptować pościg tak: samochód X jedź za tym pojazdem i strzelaj, wybuchnij kiedy CIę zniszczą. Wtedy każdy taki pościg byłby inny. Zobaczcie na GTA V. Możesz podejmować decyzje rozwalić policję z bazooki bach nie ma pojazdu, strzelać z karabinu: bach goni Cię 10 przecznic itd. Takie podejście ma jedną zasadniczą zaletę: nie wymaga marnowania czasu na ręczne dopieszczanie każdego zakrętu podejmowanego przez pojazdy ścigające nas, to ma robić automat.

To jest największa tragedia tej gry. Oni ją robili tak długo po części przez to że wszystko trzeba było oskryptować ręcznie. Przynajmniej jeśli chodzi o ruch uliczny, a to są naprawdę bardzo czasochłonne historie.

JEŚLI CDP w którejś poprawce wdroży takie funkcjonalności (nie twierdzę, że to się nigdy nie da zrobić, mówię, że jest nierealizowalne w aktualnym kodzie gry), to wiedzcie, że to nie będzie tylko wdrożenie AI policji. To będzie oznaczało, że CDP wykonał NIEPRAWDOPODOBNĄ robotę w kodzie wdrażając bardzo skomplikowane i wydajne algorytmy i dopiero wówczas będzie można powiedzieć, że mamy otwartą drogę do realnego rozwoju tego świata.

Dlaczego tego nie wdrożyli? Myślę, że dlatego że nie potrafili, że muszą "znaleźć" metodę na ogarnięcie tego tematu w swoim silniku. Muszą się tego nauczyć, a nauka to często pisanie modułu po 10 razy by za 10 razem wypracować wersję najbardziej wydajną. Myślę też, że przecenili swoje możliwości, bo takie algorytmy szukające ścieżek i podejmujące decyzje "co robić" na bieżąco to naprawdę bardzo gruba historia. Stąd to, co zrobił Rockstar w GTA V to nie jest byle AI policji. To jest kawał nieziemsko dobrej roboty programistycznej.

=============

Zauważcie też, że w Wiedźminie reakcje tłumu w cale nie są dużo bardziej skomplikowane. Różnice jednak są dwie. Wiedźmin walczy bronią białą, zatem trafia w konkretny cel. Tymczasem w CP77 walczymy bronią palną, a skoro bronią palną to kule latają gdzie bądź. DLATEGO te same reakcje tłumu w CP77 wyglądają jak produkcja opowiadająca o bandzie zoombie zamiast żywym mieście, a w Wiedźminie to jakoś nie kłóło w oczy. Druga sprawa. W Wiedźminie jeździmy konno i chodzimy pieszo. Co można zrobić? Wpaść koniem na pieszego it yle. W CP77 mamy ruch uliczny. Zasady tego ruchu, światła itd. To tak bardzo komplikuje sprawę, że programiści z CDPu po prostu okazali się za słabi na realizację tego. W Wiedźminie jak ktoś jedzie konno to po prostu jedzie i omija sobie przeszkody. Nie ma świateł, krawężników, ramp. To rzecz prosta do realizacji, tymczasem ruch uliczny i jego prawa to zupełnie inna para kaloszy.

Podejrzewam, że gdyby CDPowi jakimś cudem udało się zmienić tę grę tak jak No Man'S Sky podniosło się z kolan... wówczas moglibyśmy liczyć naprawdę na niesamowite doświadczenie żywego miasta, ale... jako programista szczerze w to wątpię. Czemu? Ponieważ uważam (i mogę się tu mylić), że te niedobory silnika gry sięgają aż do jego trzewi. Jeśli jedyną odpowiedzią na problemy z wydajnością jest stworzenie algorytmu masowo uszczuplającego ilość ruchomych elementów gdy jedziemy przez miasto, jeśli odwracamy się o 180 stopni i NPCe się pojawiają / znikają tzn. że nawet z obsługą bazy gry CDP ma potężne problemy. Jakim cudem mamy więc oczekiwać, że programiści z CDPu wdrożą tak skomplikowane algorytmy poszukiwania ścieżek? Z pustego i ... nie naleje...

Dlatego nie wierzę w reformę tej gry, jak również nie wierzę, by kolejna gra AAA stanowiła na rynku rewolucję. To nie jest tak, że CDP to oszuści i wydymali graczy. Jest natomiast tak, że chcieli zrobić coś dużego, ale nie wiedzieli jak. Oni po prostu nie potrafią tworzyć takich dużych gier.

CZOŁEM!

#cyberpunk2077 #cdprojektred #wiedzmin #gry
  • 46
Warto zwrócić jeszcze uwagę na to, że JEDYNYM dużym algorytmem szukającym ścieżki (jako pojazd) jest przywoływanie naszego samochodu. On potrafi robić nieprawdopodobny burdel, wbijać się w ściany, w inne pojazdy, wybuchać od razu po pojawieniu się itd.

To najbardziej zaawansowane szukanie ścieżki jakie na dzień premiery potrafili wdrożyć programiści z CDPu. Wyobraźcie sobie co by się w tym mieście działo, gdyby cały ruch uliczny oprzeć na tym koderskim paszkwilu :)
@NieznanyWykopek: O tym właśnie wspomniałem w swoim wywodzie :) dokładnie o tej sytuacji. Stajesz na ulicy między pasami i odpala się algorytm. To nie jest tak, że CDP wdrożył WYŁĄCZNIE to co tu opisałem. Tam jest multum detali jak na przykład ruszające się podwozie samochodu podczas jeżdżenia po wertepach itd. jest też sporo algorytmów triggerowanych w określonych sytuacjach jak to co podałeś. ALE brakuje PODSTAWY kreującej żywy świat. No bo co
Powiem wam tak... nawet w prymitywnym jęzku PHP połączonym z bazą danych MySQL zdarzają się czasem sytuacje, w których okazuje się, że kawałek kodu będący PODSTAWĄ aplikacji wpływa na beznadziejne działanie wielu innych segmentów aplikacji. Albo okazuje sie, że całej masy założeń NIE DA SIĘ zrealizwoać bez gruntownej przebudowy jądra aplikacji. A coś takiego jak CP77 to jest stopieńs komplikowania moich aplikacji razy 1000
@Nihas: Bardzo ciekawy ten film od strony mojej czyli programisty! Dziękuję! Pięknie pokazuje jak nieprawdopodobną ilość zmiennych to musi brać pod uwagę, by działać dobrze, taki policjant nie może jechać byle gdzie bo robi fikołki jak tutaj itd. Ale to też pokazuje jak niesamowitą robotę robi Rockstar :D heheheh :) można tylkot rzymać kciuki za CDP w przyszłych projektahc, bo moze się czegoś nauczą.

A MOŻE mnie zaskoczą i CP77 podniesie