Normalnie nikt raczej nie kupuje książek czy gier z gatunków, za którymi nie przepada. Sam zresztą tego nie robię, więc potrzebne byłyby dość niecodzienne okoliczności, abym zainteresował się, dajmy na to, strzelanką typu FPP. Fakt, że Bulletstorm jest polską produkcją (na tyle, na ile to dzisiaj możliwe) nie byłby wystarczający. Potrzebny był do tego efektowny trailer, interesujący nie tyle ze względu na grafikę, co specyficzne i zastanawiające przedstawienie gameplayu w połączeniu ze stroną fabularną (tak, jest tam coś takiego ;]). Rodziło ono podejrzenie, że gra w rzeczywistości jest czymś zupełnie innym niż to widać na pierwszy rzut oka.
W każdym razie uznałem, iż warto się o tym przekonać i zobaczyć przy okazji, jak się obecnie miewa ten gatunek gier. W końcu od Quake’a 3 minęło już “trochę” czasu :) Zaopatrzyłem się więc w Bulletstorm z zamiarem zweryfikowania swoich podejrzeń. Okazały się one w stu procentach zgodne z rzeczywistością… a jednocześnie zupełnie nieprawdziwe.
Jak należy to wszystko rozumieć? Ano tak mianowicie, że Bulletstorm jest swoją własną parodią. Naśmiewając się z konwencji gatunku, jest zarazem im wierna w niemal każdym szczególe. Mamy tu bowiem wszystko, czego w porządnym FPS-ie zabraknąć nie może: mnóstwo zróżnicowanych lokacji, spory wybór broni przeznaczonych do siania zniszczenia i oczywiście hordy nieprzeliczonych wrogów, na których można nasz arsenał wypróbować. Efekty są rzecz jasna wyjątkowo krwiste i jestem przekonany, że do tego aspektu Bulletstorm już niedługo przyczepią się mainstreamowe media, jak to mają w zwyczaju (zresztą wygląda na to, że w Fox News już to zrobiono).
W tym samym czasie gra jest też wybitnie udanym pastiszem całego gatunku strzelanek. Zamiast mrocznych podziemi i krętych korytarzy, z których w każdej chwili może wyskoczyć wróg, prawie cały czas poruszamy się po otwartej przestrzeni i w pełnym słońcu, a przeciwnicy są widoczni jak na dłoni. Dialogi i przerywniki filmowe ukazują natomiast to, że ogromne giwery mają przede wszystkim reprezentować równie wielkie ego głównego bohatera, który sam w sobie jest karykaturą postaci z filmów akcji.
Najzabawniejsze jest jednak to, iż niewątpliwe innowacje, jakie Bulletstorm wprowadza do mechaniki gry FPS, są zarazem doskonałym żartem z całego kierunku rozwoju, jakim podąża ten gatunek. Jak bowiem wiadomo, jedną z głównych cech tej gry jest duża liczba interaktywnych elementów środowiska i intensywnie wykorzystywany silnik fizyczny. Na tej podstawie oparty jest system przyznający punkty za odpowiednio efektowne pozbywanie się wrogów, najlepiej z wykorzystaniem przedmiotów dostępnych wokoło. W ten sposób Bulletstorm posłusznie podąża za obowiązującym trendem (czerpiąc oczywiście z dokonań takich poprzedników jak choćby Crysis), pokazując jednocześnie, co jest jego prawdziwym celem. Bo realizm realizmem, ale wiadomo przecież, że chodzi tu o jak najlepiej wyglądającą jatkę ;)
Wydaje się, że to nie przypadek, że po dłuższej chwili rozgrywki w Bulletstorm nasuwają się nieodparte skojarzenia z filmem Kill Bill. W oświadczeniu prasowym przedstawiciel Electronic Arts użył zresztą takiego porównania i działa ono zdecydowanie na korzyść tej gry. W tym sensie moje podejrzenia się sprawdziły i dlatego mogę z czystym sumieniem polecić tę produkcję także tym, którzy na co dzień preferują nieco ambitniejsze pozycje.
Na koniec zaś wypada tylko pogratulować twórcom. Udało im się bowiem dokonać nie lada sztuki: stworzyli grę, przy której dobrze bawić będą się zarówno zwolennicy, jak i przeciwnicy jej gatunku – o ile oczywiście potrafią na nią spojrzeć z odpowiednim przymrużeniem oka. Okazuje się zatem, że dzisiaj nawet “głupie FPS-y” wykazują artystyczną głębię ;]
Pod koniec notki na temat czcionek i wyświetlania tekstu stwierdziłem, że podstawowym zastosowaniem tej części biblioteki 2D jest wyświetlanie licznika FPS :) No cóż, pewnie wcale nie byłem daleko od prawdy, bo – jak wiadomo – pomiar ilości generowanych na sekundę klatek jest bardzo ważny. Można to jednak robić na kilka sposobów.
Najprościej jest chyba policzyć czas generowania ostatniej klatki w sekundach – i tak jest to potrzebne do wyliczenia nowych pozycji obiektów i uaktualnienia całej reszty symulacji. Odwrotność tego czasu będzie chwilową wartością FPS.
Można też policzyć ilość klatek narysowanych w jakimś krótkim odstępie czasu poprzedzającym chwilę obecną – zwykle w ciągu jednej sekundy. Wtedy podzielenia owego czasu przez zliczoną ilość ramek da nam średnie FPS.
Wreszcie można te obliczenia prowadzić od momentu uruchomienia gry, śledząc liczbę klatek i całkowity czas jej działania. Wówczas iloraz tych wartości da nam całkowite FPS.
Która wartość jest najlepsza do pokazania na ekranie?… Wartość chwilową najłatwiej wyliczyć, ale zmienia się ona co klatkę, więc podlega przypadkowym wahaniom, niemającym związku z kodem samej gry. Poza tym tak częsta aktualizacja sprawiałaby, że nie dałoby się tej wartości odczytać. W praktyce trzeba by więc wypisywać ją rzadziej, np. co sekundę, co komplikuje sprawę.
Z kolei całkowite FPS ze względu na swój globalny charakter “spłaszcza” wszelkie wahania. Im dłużej działa gra, tym mniejszy jest związek między jego wartością, a tym co widać na ekranie. Może się więc zdarzyć, że gra będzie strasznie przycinała, podczas gdy całkowite FPS będzie stało na wartościach 60-70 z lekką tylko tendencją spadkową.
Najlepiej jest więc pokazywać średnie FPS wyliczone dla jakiegoś krótkiego odcinka czasu. Ponieważ jego wartość zmienia się często (zazwyczaj co sekundę), dobrze odzwierciedla aktualną szybkość generowania klatek. Zmiana parametrów sceny (ilość wielokątów, światła, cienie, odbicia, cząsteczki, pozycja kamery, itd.) może więc prawie natychmiast przełożyć się na wartość FPS. Negatywnie, rzecz jasna :]
Jednocześnie średnie FPS nie podlega tak bardzo chwilowym i losowym zatorom na linii procesor-RAM-karta graficzna, gdyż jest liczone na podstawie przynajmniej kilkudziesięciu próbek.
I chociaż średnie FPS liczy się w nieco bardziej skomplikowany sposób niż chwilowe, jego wyznaczenie nie jest niczym trudnym ani kosztownym:
Jedno jest pewne: wartość FPS nie powinna spadać od samego jej liczenia ;)