А теперь приступим. В игре, хочется, и планеты, и корабли, и физику, и спец эффекты, и кучу всего интересного, о да, и чтобы на каждом сервере были свои условия, квесты и многое, многое, многое веселое и полезное.
Что нам требуется от языка, идеальные параметры:
- легкость интеграции
- легкий синтаксис
- функционал
- скорость (желательно наличие 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 )) велосипед может и вовсе стать негодным ))) По этому второе решение пока под вопросом, может у кого готовое есть и он поделится.
The Wall