Wpis z mikrobloga

✨️ Refleksje Starego Programisty o Współczesnym Gamedevie
Deszcz bębnił o parapet mojego bunkra pełnego gipsokartonowych boksów z taką samą monotonią, z jaką Timex T80 na moim nadgarstku wybijał kolejne minuty dobiegającego czterdziestki życia. 18:00. Piskliwe biip przeszyło ciszę jak igła gramofonowa szorująca po pękniętej płycie. Spojrzałem na monitor – jedyne okno na świat, który dawno przestał mieć sens. 60Hz. Czysty, surowy obraz, bez zbędnych klatek, które tylko mącą umysł.

Wspominałem stare czasy. Wtedy dane miały swoją wagę, a programowanie było jak walka na noże w ciemnej alejce. W QBasicu nie bawiłeś się w rysowanie – ty preparowałeś bajty. Obliczałeś rozmiar tablicy INTEGER z precyzją chirurga, by zmieścić tam surowe mięso segmentu wideo, a potem jednym, brutalnym PUT rzucałeś to na ekran. W gimbazie, zamiast uganiać się za spódniczkami, wchodziłeś w intymny związek z Turbo Pascalem i wstawkami w ASM. Optymalizowałeś rotujące bryły tak, by pre-calculated sinusy siedziały w cache’u twojego 486 jak naboje w magazynku. Czułeś się jak Case z nowel Gibsona, tyle że zamiast decka miałeś klawiaturę mechaniczną i dokumentację System/360 do poduszki.

Nagle terminal zakaszlał. Połączenie przychodzące. Zoom. W okienku pojawił się on. Oskar. Lat 22. Fryzura typu „brokuł”, t-shirt z logo frameworka, który zdechnie, zanim skończę tę herbatę. Ulotnie spojrzałem na przyklejony do ściany boksu wydruk artykułu z Phracka sprzed lat i westchnąłem w duchu.
– Siema, jestem gotowy na dynamiczne wyzwania – rzucił, a jego głos miał barwę matchy i płytek z designerskiego betonu.
Popatrzyłem na niego z góry, z sardonocznym uśmiechem kogoś, kto zna na pamięć listę instrukcji procesorów RISC i potrafi przejść Duke Nukem 3D z zamkniętymi oczami.
– Posłuchaj, młody – zacząłem cicho, cedząc słowa jak krople deszczu. – Zapomnij o tych swoich warstwach i abstrakcjach. Wyobraź sobie, że stoisz przed gołym krzemem. Masz framebuffer pod 0xA0000000. Masz jedną funkcję: zwraca ci pozycję myszy i klawisz. Nic więcej. Żadnych bibliotek. Jak zaimplementujesz dropdown menu?
Oskar mrugnął. W jego oczach widziałem tylko szum informacyjny.
– No... użyję jakiegoś DropdownContainer? – wykrztusił.
– Container? – Uniósłbym brwi, gdyby jeszcze chciało mi się dziwić. – Tu nie ma kontenerów. Jest tylko procesor i szyna danych, która nie wybacza błędów. Jaką strukturę wybierzesz, żeby przy dziesięciu tysiącach elementów nie zarżnąć TLB i nie sprawić, że prefetched cache zacznie przypominać pobojowisko?
Oskar poprawił bezprzewodową pchełkę w uchu.
– No... wrzucę to w ArrayList<Object>? RAM jest tani, po co się przejmować strukturą? To jest modern approach.
Pociągnąłem łyk zimnej jak precyzja 256 bitowych floatów herbaty.
– „Modern approach” – powtórzyłem z niedbale maskowaną pogardą. – To tylko ładna nazwa na intelektualną nędzę. RAM może i jest tani, ale fizyka to twarda nierządnica, Oskarze. Alokujesz te swoje obiekty na stercie, a procesor krwawi, czekając na dane jak ofiara nożownika na karetkę. Przez takich jak ty gamedev to dzisiaj trup przypudrowany shaderami, który tnie jak Kuba Rozpruwacz na sprzęcie wartym tyle, co dobry samochód. Totalna niezdolność do racjonalnego doboru struktur danych.
Oskar uśmiechnął się, jakby patrzył na relikt z innej epoki.
– Ale od tego są kompilatory i optymalizatory JIT...
– Kompilator nie naprawi twojej niewiedzy o spatial locality – uciąłem. – Skoro tak bardzo ufasz magii, to powiedz mi: co to jest przerwanie sprzętowe (IRQ)? I jak byś je wykorzystał do obsługi tej twojej myszki, gdybyś został sam na sam z gołym procesorem?
Patrzył na mnie, jakbym pytał o kod źródłowy do mainframe'a IBM z 1964 roku.
– Przerwanie... sprzętowe? To coś jak async/await na poziomie kabli?
Timex zrobił biip. Pełna godzina. Koniec spektaklu. Wylogowałem się. Ciemność znów była moim jedynym sojusznikiem.

Patrzyłem w czarny ekran, pozwalając, by mój wewnętrzny parser zaczął mielić ten cały „nowoczesny” bełkot. Oskar. Kolejny nietrwały token w strumieniu danych, którego nie da się zredukować do niczego sensownego. Mój umysł, wytresowany na determinizmie automatów skończonych, desperacko próbował narzucić jakąkolwiek strukturę na ten jego recursive descent bełkot. Ale nie było tam żadnej gramatyki. Tylko nieskończona rekursja pustych pojęć, stos rosnący w nieskończoność, aż do nieuniknionego przepełnienia.
Najgorsze, że ten współczesny gamedev jest jeszcze bardziej skopany niż te wszystkie "cuda" Carmacka, z którego zrobili boga optymalizacji, bo miał farta, że rozwój zegarów CPU pozwolił w ogóle jego kodowi działać na topowych 486. Carmack... wielki wizjoner, który rzeźbił w nawozie. Pamiętam ten jego "błyskowtliwy" BSP, który marnował cykle na wieczne dzielenie przestrzeni, te kolizje na gridzie odwiedzające puste celle siatki jak idiota szukający kluczy w pustym pokoju. Bohaterską walczący z problemami jakie to tworzyło moduł reject, i inbę z visplane’ami oraz kod sieciowy multiplayera, który był jednym wielkim wyścigiem kto pierwszy zapcha biurowe łącza pakietami na broadcaście. A mimo to, on chociaż wiedział, że procesor czeka na wolny RAM, by odczytać tekstury. Dzisiejsze Oskarki nie wiedzą nawet, że RAM istnieje – dla nich świat to jeden wielki Cloud, w którym opóźnienia nie istnieją, a struktura danych to coś, co wybiera za nich framework. Jesteśmy w dziórze. W głębokiej, nieoptymalnej, pełnej cache-missów dziórze.

To nie jest postęp. To powolne gnicie w objęciach Nieeuklidesowych Koszmarów, których żaden linter nie wyłapie. Widzę to wyraźnie: współczesny kod to pulsująca, galaretowata masa Yog-Sothotha, gdzie każde npm install to bluźniercza inkantacja przywołująca byty z wymiarów, w których logika Boole’a nie ma prawa bytu. Siedzimy w cyfrowym R'lyeh, uwięzieni pod zwałami cykli procesora, które marnują się na mielenie próżni. Każdy framework to macka Cthulhu, owijająca się wokół rejestrów, dusząca resztki racjonalizmu w śluzie wysokopoziomowych abstrakcji. Oskar i jemu podobni to tylko kultyści, ślepi akolici Wielkich Przedwiecznych Korporacji, składający ofiary z gigabajtów pamięci operacyjnej na ołtarzu Prestiżu i Nowoczesności. Słyszę to w szumie wentylatora – to nie jest chłodzenie, to agonalny ryk krzemu, który próbuje wykrzyczeć prawdę o nadchodzącym Chaosie, zanim stos ostatecznie zapadnie się w nicość, a Wielki Garbage Collector pożre nas wszystkich w akcie ostatecznego, nieodwracalnego czyszczenia pamięci.

#pasta #programista15k #embedded #programowanie #gamedev

〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰
▶︎ Obserwuj nasz tag #mirkoanonim
〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰
· Akcje: Odpowiedz anonimowo · Więcej szczegółów
· Opublikuj swój własny wpis: Mirko Anonim
· Zaakceptował: Dipolarny

💚 Dzięki Twojej dotacji możemy utrzymać projekt i wprowadzać nowe funkcje! Wspomóż projekt

  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach