en

root's blog

Рано или поздно все упирается в гибкость движка. Но как его сделать гибким с возможностью легко модифицировать и менять условия под нужды дизайнеров и игроков. Все очень казалось бы просто - скрипты.


А теперь приступим. В игре, хочется, и планеты, и корабли, и физику, и спец эффекты, и кучу всего интересного, о да, и чтобы на каждом сервере были свои условия, квесты и многое, многое, многое веселое и полезное.


Что нам требуется от языка, идеальные параметры:

- легкость интеграции

- легкий синтаксис

- функционал

- скорость (желательно наличие JIT)

- возможность генерации байткода, для транспортировки по сети


Собственно самый последний пункт и стал решающим. 

Много раз глядя на чудо под названием QuakeC (особенно те кто знает что это и его производные которые есть и в HL/CS и других играх), который позволяет менять игру и особенно сетевую часть + хранить все это в бинарном виде. 

А теперь представим если наш скриптовой язык не умеет генерировать бинарный код. Значит придется передавать по сети сотни файлов, искать зависимости, указывать точные пути и надеяться, что у человека не окажется каких либо граблей, что уже по определению звучит страшно. 

Когда передав 1 бинарный файл который даже сохранять не придется (например gameplay.dat) у клиента появится другой геймплей другие возможности, разные квесты и многие прелести, которые присущи только его серверу или модификации. Или ситуация вы подлетели к планете, а у нее есть файл с дополнительными свойствами на сервере. Так же плюс бинарного файла, он всего один и при компиляции был проверен на наличие всех нужных функций движка. Так же в нем хранится список функций которые должны быть в движке. Если например все обновились, а у сервера старая версия или наоборот у клиента.

В общем это краткая справка зачем нужна такая возможность, а она нужна и должна быть.


Но казалось бы все легко и просто, вставил готовый велосипед и поехал.


Тем более есть встроенный CubeScript.

Начну с него, синтаксис из мира фантастики, простой пример

мы хотим сложить два числа 2 + 2, что может быть проще )))

sum = + 2 2

а теперь хотим тоже самое но от этого отнять 3

sum = (- (+ 2 2) 3)

от одного вида этого синтаксиса волосы дыбом встают ))) Да к нему можно привыкнуть и даже делать нужное, но ладно мне привыкнуть понимая его полное устройство, а тем кто пришел новенький в проект.

Итоги:

Скорость - весьма посредственная

Легкость - куча граблей и даже если их заменить на новые их число не меняется

JIT - из мира фантастики

платформонезависимый байткод есть


Идем дальше LUA. LUA ты могуч ты гоняешь стаи туч. Да, язых хороший, шустрый легко встраивается, синтаксис более добрый, есть JIT. Ну и на этом наверное все. В общем у нас он встроен и даже многие вещи на нем были протестированы. Но опять же что-то с ним не то когда дело дошло до сетевой части. А в чем беда? да очень просто байткод оказался разный ))) на 32 битной машине нельзя запустить 64 битный, и наоборот 64 на 32х. Ужас.


Тестируем QuakeC ( FTEQCC ), но в игру не встраиваем. (Почему не встраиваем? он GPL)

Байткод платформонезависим.


Попробуем монстра гугла V8 это высокооптимизированый JavaScript монстр.

Чтобы его собрать пришлость проклятия слать на гугл команду которая все делает в виде ребусов.

возможности сохранения платформонезависимого байткода нет ... ну еханый бабай ... собственно он им и не нужен, зато компиляция на лету (JIT) красиво работает, мои тесты с 5 млн. записей прям как печеньки скушал.


В результате ведутся работы в двух направлениях.

Первое свой велосипед (синтаксис аналог JS). 

Работы ведутся уже более месяца. Свой велосипед работает медленнее луа именно это сейчас основная проблема про LUAJIT вообще молчу с тем даже глупо соревноваться.


Второе велосипед к LUA, но тут огромная проблема - сегодня я добавлю велосипед, а вдруг утром проснусь а версия уже 6.0 )) велосипед может и вовсе стать негодным ))) По этому второе решение пока под вопросом, может у кого готовое есть и он поделится.

May 24 '14 · 0 comments