Quake 2 за Java, или Jake2 (GPL 2)
May 5th, 2008 Иван Давидов Категории Всичко, Размисли, Технологии |
Тъй като многото почивни дни покрай великденските празници се отразяват негативно на програмистката ми душа, днес цял ден се оглеждах за ресурси, свързани с правенето на игри за Java и по-специално за 3D игри.
След не много лутане попаднах на един изключителен проект - Jake2. Това е порт на енджинът на Quake 2, само че написан изцяло на Java. Първоначално не се впечатлих кой знае колко, все пак аз започнах търсенето с цел да видя какви технологии са измислили хората, за да визуализират 3D обекти, а и първият ми сблъсък с Java 3D API от преди няколко години ми беше оставил болезнени спомени за производителността…
И така, свалих binary дистрибуцията и… още в самото начало се впечатлих. Енджинът засече, че нямам Quake 2 на компютъра си и учтиво ме попита дали искам да си дръпна демото, което е безплатно. Казах “да”, взехме се и заживяхме дълго и щастливо!
…
След като демото се изтегли, трябваше да почакам малко. Всъщност много. Ехидно се усмихнах, очаквайки минимална производителност от машината си, вероятно без звук, с не повече от 7-8 FPS…
Да, ама не! Играта тръгна от раз, не съм засичал FPS, но вървеше супер гладко, звукът беше на ниво, нямаше никакви насичания, а играта се играе така, сякаш играеш оригиналния Quake 2!
За пръв път в живота си останах с положително впечатление от Java в 3D света. И то не къде да е, ми в областта на игрите, където изискванията са на ниво!
Толкова много се впечатлих от това, че всичко тръгна от раз, че реших да си дръпна сорса на енджина.
Ето тук се впечатлих още повече, защото въпреки че проектът използва няколко много сериозни външни зависимости, всички те са включени в сорса. Освен това Jake 2 използва Ant скриптове, като Ant дистрибуцията идва заедно със сорсовете и на практика за да се build-не проектът е необходимо само да се стартира един .bat (или .sh) файл. Единствената външна зависимост, която не идва със сорсовете е JavaSE!
Като се позарових малко в сорсовете намерих няколко неща, които не ми харесаха много, но като се има предвид какъв е мащабът на проекта, моите забележки са повече от нищожни:
- В ant скриптовете има твърде много hard coded елементи. Оправих го за по-малко от 5 минути, така че не е болка за умиране. В рамките на същите тези 5 минути промених скриптовете така, че крайните дистрибуции да се създават в папка, различна от основната, тъй като по default всичко се генерира в основната директория на сорсовете, което води до “претрупване” на файлове и директории в основната директория.
- В сорсовете се използва таймера на Sun, който е част от недокументираните класове, които се намират в подпакетите “sun.*”. По време на изпълнение на програмата runtime се определя до кои таймери има достъп Jake 2 и ако използваме Java SE 5, тогава се взима таймерът за наносекунди, иначе се прави тест за Sun таймера и ако това също пропадне, тогава се взима класическия милисекунден таймер. Всичко това е много хубаво, обаче какво ще се получи, ако в JDK 7 например (В JDK 6 таймерът е наличен) Sun-ския таймер изчезне? Runtime няма да има проблеми, но проектът няма да може да се компилира.С изтриването на един файл и закоментаряването на няколко допълнителни реда тази зависимост също отпада, но след като направих промените, реших да върна нещата пак така, както си бяха преди.
- Като цяло портът на Quake 2 енджинът е повече от успешен, но четимостта на кода е сведена до почти абсолютната нула, тъй като идеята не е била да се направи 3D енджин, който да се ъпгрейдва, а по възможно най-бързия и безболезнен начин да се “мигрира” кода от “C/C++” на Java. Съответно в сорсовете на Jake2 “обитават странни същества (класове) с имена като “cvar_t.java”, “M.java” и “V.java”. Но лошо няма проектът все пак работи, а ако някой не разбира от “C/C++”, тогава според мен изобщо не бива да се захваща и с Java. Хубаво е да се знае от къде произлизат корените на всеки език за програмиране.
Тъй като се впечатлих страшно много от проекта, накрая реших да си дръпна сорсовете директно от CVS repository-то на Source Forge. Е… малко се разочаровах, проектът е изоставен от вече две години, но пък и то какво да иска човек от енджин, който веднъж вече е направен. Както вече казах, идеята не е била да се доразвие енджина на Quake 2, а да се направи порт на Java за него.
Понякога (рядко, но се случва) имам свободно време и ако сорсовете бяха малко по-четими и по-добре документирани, бих се заел да направя някои дребни корекции, но пък така интригата е по-голяма и е по-интересно.
Препоръчвам на всички Java маниаци, които се чудят дали има 3D игри, писани на Java, да хвърлят едно око на Jake2, определено си заслужава.
Оставете отговор: