5

Co można zmieścić w kodzie QR? Na przykłaaaad…. całą grę wideo?

Przyzwyczailiśmy się, że gry wideo ważą po kilkadziesiąt GB. Co jednak, jeżeli będziemy jako medium chcieli wykorzystać coś, co ma zaledwie 3KB miejsca? Czy możliwa jest gra wideo w kodzie QR?

Kody QR są z nami już od lat i póki co – ich wykorzystanie jest bardzo dalekie od tego, co zamierzali twórcy. Często bowiem, jeżeli są wykorzystywane, stanowią proste odnośniki do stron internetowych, nie dostarczając żadnej realnej wartości, jeżeli chodzi o przyspieszanie działania odbiorcy. Nie znaczy to jednak, że sama technologia nie jest niesamowicie interesująca. Kody QR to bowiem bardzo ciekawy sposób przechowywania i przekazywania danych. Nie raz i nie dwa zastanawiałem się, do czego mogą zostać wykorzystane. Teoretycznie bowiem nie ma ograniczenia co do rodzaju treści które mogą zostać z nich odczytane, w końcu ciąg zer i jedynek nie rozróżnia, czy chodzi o tekst, grafikę czy muzykę. Limitem jest oczywiście rozmiar. Powstaje więc pytanie – czy za pomocą kodu QR możemy przesłać coś bardziej skomplikowanego niż tylko link do strony. Coś tak skomplikowanego jak… gra wideo?

Gra wideo w kodzie QR to olbrzymie wyzwanie

Największym problemem, z jakim należy się zmierzyć, próbując zapisać kod programu w formie QR jest ilość danych, jakie taki kod może pomieścić. Kody QR które widzimy na co dzień są malutkie, ale nie są jedynymi możliwymi do odczytania. Największą dostępną wersją jest „wersja 40”, która składa się ze 177 na 177 modułów. Jest olbrzymia.

Gra wideo w kodzie QR

Zapewne zastanawiacie się, ile danych jest ona w stanie pomieścić. Spieszę z odpowiedzią, że dzięki swojemu rozmiarowi może ona przechować 2,953… bajty. Czyli około 2,88 kilobajtów danych. Jeżeli skompresowalibyśmy moje zdjęcie do takich rozmiarów, wyglądałoby ono mniej więcej tak:

Gra wideo w kodzie QR

Grafika i muzyka są jednak obszarami, które zajmują całkiem sporo miejsca na dysku, natomiast kod komputerowy potrafi zająć go zaskakująco niewiele. Udowodnił to niedawno YouTuber i programista, MattKC, który niedawno podjął się właśnie takiego wyzwania – napisać grę, którą będzie można przekazać przez kod QR. Jego założenia były proste – musi to być samodzielnie działający program (nie może odpalać się w przeglądarce), a sama gra musi być… grywalna. Jako platformę wybrał system Windows, ze względu na pewne ograniczenia w uruchamianiu „podejrzanych” programów zarówno na Androidzie jak j iOS.

Gra w ukryta w kodzie QR jest możliwa

Grą, którą Matt wybrał do stworzenia był stary, poczciwy Snake. Inspiracją były dla niego ważące po kilkaset bajtów gry ukrywane często w bootsektorach dyskietek, a także produkcje na bardzo stare konsole. Jest więc to wykonalne, jednak wymaga naprawdę strategicznego podejścia do zasobów. Przede wszystkim – współczesne kompilatory starają się być bardzo przystępne dla piszącego, przez co mocno cierpi ich efektywność. Zwykle „Hello World” w C zajmuje już około 100 KB. Matt obszedł ten problem, zmuszając kompilator do przypisywania do programu tylko absolutnie niezbędnych bibliotek. Niestety, nawet po tych zabiegach i optymalizacji kodu, dalej przekraczał on zakładane 2,88 KB.

Drugą próbą było więc przejście na inny język – Assembler. Jest to język programowania najniższego poziomu, w którym (w dużym uproszczeniu) wydajemy instrukcje bezpośrednio komputerowi z pominięciem kompilatora. Pozwala to na uniknięcie drobnych nieefektywności związanych z tym, że wspomniany kompilator nie zawsze tłumaczy instrukcje w najlepszy możliwy sposób. Niestety, nawet duże umiejętności Matta nie pozwoliły mu stworzyć na tyle efektywnego kodu w Assembly, by zmieścić się poniżej zakładanej granicy.

Matt wrócił więc do C, czyli języka w którym czuł się pewniej i zaczął się zastanawiać, w jaki sposób może dodatkowo zmniejszyć rozmiar pliku wykonywalnego bez usuwania fragmentów kodu. Jak się okazało – odpowiedzią były algorytmy kompresji znane jako Executable Packing. W dużym skrócie, programy tego typu przeznaczone są do kompresji plików .exe i dodają do nich specjalny kod, który pozwala na dekompresje podczas uruchamiania. Dla użytkownika końcowego nie robi to różnicy, a pozwala osiągnąć rozmiary pliku rzędu 1 KB. I tak właśnie udało się zrobić w tym przypadku.

Nie obyło się bez problemów

Jak widzicie na filmie, Matt miał spore kłopoty by uruchomić grę przy użyciu czytnika kodów QR znanego jako ZBar. Problem zauważył, analizując Hex Editor dla pliku, który powstał po przeczytaniu kodu QR (jak dla mnie – niesamowita umiejętność). Jako, że ZBar jest narzędziem open source, mógł wprowadzić do niego własne poprawki (które z resztą zostały wprowadzone także do oficjalnej wersji). Finalnie jednak – udało się odczytać obraz. W taki właśnie sposób powstał poniższy kod QR:

Gra wideo w kodzie QR

Każdy z was może go wydrukować i przy użyciu tych instrukcji – odpalić Snake’a na swoim komputerze. O ile to doświadczenie nie zrewolucjonizuje kodów QR i w codziennym zastosowaniu prawdopodobnie będą one tak samo nieprzydatne jak zawsze, pokazuje ono, że twórcy tego standardu mieli bardzo dobre założenia.

Zawiodła tylko implementacja i kreatywność osób, które takie kody wykorzystują.