forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   TatEngine (http://forum.boolean.name/showthread.php?t=17554)

jimon 23.11.2012 05:18

TatEngine
 
Предыстория :

В общем последний опенсорс двиг от меня был аж в 2008-2009 году http://forum.boolean.name/showthread.php?t=6284 (он так и лежит http://code.google.com/p/enesea/), а дальше я устроился работать в Tatem Games. Много чего повидал, много чего наделал, с 2009 года я проектировал\писал in-house движок, он пережил полный рефакторинг в конце 2011 года.

Глядя на все движки под мобильные платформы, понимаешь всю их ущербность, особенно всяких кокосов и корон :crazy: Потому было решено попробовать свои силы на поприще 2д движков. Вышло довольно не плохо в итоге. Но наш двигло и 3д умеет. Showcase пока не имеет выпущенных проектов, но в течении 6 месяцев выйдет социальная 3д игра на нём (http://www.tuaw.com/2012/03/13/tatem...-gym-and-more/) и 2д квест.


А теперь история : in-house технология идет в опен сорс :crazy:

https://github.com/tatemgames/tatengine

Что внутри ? Довольно высоко технологический ящик плюшек ! Претендент на один из самых мощных 2д движков для мобильных игр.
  1. Pure aggregation scene graph (http://cowboyprogramming.com/2007/01...your-heirachy/) и редактор к нему.
  2. Constant size design, aka полное отсутствие каких либо аллокаций памяти во время игры, только при загрузке уровня.
  3. Data oriented design, всё на пулах объектов.
  4. Data driven design, вы описываете в коде только классы контролёров объектов, а все инстансы создаются в редакторе.
  5. Baked render pipeline, оптимизация очереди рендера происходит в заранее
  6. Очень простой рендер, движку нужен всего 1-2 VBO и пара текстур, потому наш рендер очень упростился, сейчас поддерживается OpenGL, d3d9 рендер в разработке ( для wp8 ).
  7. Content pipeline, создание атласов, подсчёт AABB для заскиненых моделей и тд, всё происходит в оффлайне отдельной тулзой, а игра представляет собой просто минимальный плеер подготовленного контента.
  8. Photoshop content pipeline, сделали интерфейс и лень его нарезать и вставлять ? Просто вставьте его в игру в три клика. Экспортёр и импортёр уже в комплекте.
  9. FBX конвертер, самописный монстр на fbx sdk (кто юзал, тот знает), поддерживает скелетку, меши, процессинг uv, гибкий формат структуры вертексов и тд.
  10. И еще много чего.

Но сейчас SDK находится в alpha preview стадии, пишутся туториалы, пишутся семплы, поправляется код, выпиливаются костыли. В данный момент пока залиты бинарники тулзов только для win, в скором будущем будет и mac версия.

Так что прошу оценить пока то что есть :crazy:

Nex 23.11.2012 07:34

Ответ: TatEngine
 
Цитата:

понимаешь всю ихнюю ущербность
если не ошибаюсь, то правильно будет "их", а "ихнюю" не правильно. :)

HolyDel 23.11.2012 11:14

Ответ: TatEngine
 
Цитата:

Constant size design, aka полное отсутствие каких либо аллокаций памяти во время игры, только при загрузке уровня.
если у меня игра какая-нибудь ртс с заранее неизвестным числом юнитов? выделять память по максимуму?

pax 23.11.2012 12:31

Ответ: TatEngine
 
Появился повод снова ковырять С++ :)


С масштабирование что-то не то.. точнее наверное с прорисовкой
http://f3.s.qip.ru/etSMyDPQ.png

UPD: пока ничего не понятно, буду следить, читать мануалы и примеры смотреть)

UPD2: было бы клево сортировать ноды по категориям, еще бы нужной фичей было бы перемещение страницы с нодами мышкой. А вращение не в кватернионах задавать никак?)

UPD3: После билда тестовое окно с инфой очищается, так надо? Было бы клево иметь пункт в меню WorldEditor'а - Recent Projects

pax 23.11.2012 13:13

Ответ: TatEngine
 
Отдельно вопрос хотел задать - поддержка разных разрешений экранов каким образом будет?

UPD: Туторы прочитал, хочу еще!

jimon 23.11.2012 13:45

Ответ: TatEngine
 
Вложений: 1
Цитата:

Сообщение от HolyDel (Сообщение 244572)
если у меня игра какая-нибудь ртс с заранее неизвестным числом юнитов? выделять память по максимуму?

Мы не зря долго сидели и всё продумывали, представь, да, выделять по максимуму, но юниты очень дешевые получаются, думаю до 500-1000 байт на юнит. И самое интересное - нет ситуации где надо было бы выделять, максимум надо стримить геометрию и текстуры, но ведь это же не аллокация памяти. :crazy:

Цитата:

С масштабирование что-то не то.. точнее наверное с прорисовкой
http://f3.s.qip.ru/etSMyDPQ.png
Есть такое :(

Цитата:

UPD2: было бы клево сортировать ноды по категориям, еще бы нужной фичей было бы перемещение страницы с нодами мышкой. А вращение не в кватернионах задавать никак?)
Там сама сцена для удобства имеет страницы (последняя закладка в редакторе), между ними можно перемещать ноды с помощью пункта в тулзах. Да, добавлю эдитор для углов эйлера, но и с кватернионами хорошо :)

Цитата:

UPD3: После билда тестовое окно с инфой очищается, так надо? Было бы клево иметь пункт в меню WorldEditor'а - Recent Projects
Там два текстовых окна, одно выводит информацию про Bake стадию (Ctrl + B если отдельно надо), если она завершается без ошибок то окно закрывается и открывается окно запуска приложения (Ctrl + Alt + R)

Цитата:

Отдельно вопрос хотел задать - поддержка разных разрешений экранов каким образом будет?
Хороший вопрос, с приходом в iOS аж 4 ppi, стало понятно что 4 раза рисовать графику просто не реально, а под Андроидом их еще больше, потому было решено рисовать графику интерфейса под самое большое разрешение экрана (сейчас 2048 * 1536), а потом только даунскейлить.

Автоматический даунскейл делается вот этой штукой :
Вложение 18106
К ней просто аттачится куча трансформов для каждой крайней точки, и она каждой точке задает размер и позицию.

Основной проблемой даунскейла раньше были шрифты, но мы заюзали distance field fonts (http://www.youtube.com/watch?v=CGZRHJvJYIg) и с его помощью можем одной текстурой 512*512 (или 256*256) покрыть вообще все размеры гарнитуры.

pax 23.11.2012 14:15

Ответ: TatEngine
 
А что-то типа встроенных эффектов частиц и т.п. планируется?

jimon 23.11.2012 14:23

Ответ: TatEngine
 
Цитата:

Сообщение от pax (Сообщение 244589)
А что-то типа встроенных эффектов частиц и т.п. планируется?

Я в идеале заюзал бы какие нибудь готовые частицы, но сейчас получается что проще их самому написать отдельно для каждого проекта, так что пока хз. В двигло хорошо вставлялись magic particles, но автор не хочет раскрывать код плеера своих партиклов.

HolyDel 23.11.2012 18:26

Ответ: TatEngine
 
Цитата:

distance field fonts
клевая техника.
а как вы текстуры для нее генерите? отдельной утилитой или в рантайме?

moka 23.11.2012 19:16

Ответ: TatEngine
 
А бенчмарки какие-то делали, сравнения производительности, и выжимали нагрузку на разных платформах / девайсах - что выдаёт?

jimon 23.11.2012 19:43

Ответ: TatEngine
 
Цитата:

Сообщение от HolyDel (Сообщение 244610)
клевая техника.
а как вы текстуры для нее генерите? отдельной утилитой или в рантайме?

генерим шрифт размером 8192*8192 с помощью BMFont, а дальше в сдк есть Tools/DistanceField тулза которая превращает текстуру в картинку 512*512

Цитата:

А бенчмарки какие-то делали, сравнения производительности, и выжимали нагрузку на разных платформах / девайсах - что выдаёт?
Синтетика пока только предстоит, но в общем 3д социалочку с 200+ объектами держит :crazy:

jimon 24.11.2012 05:29

Ответ: TatEngine
 
залил туториалы по Lua скриптам и базовому нативному программингу

dimanche13 24.11.2012 12:13

Ответ: TatEngine
 
интересно, буду следить

dimanche13 25.11.2012 19:25

Ответ: TatEngine
 

jimon 25.11.2012 20:04

Ответ: TatEngine
 
Цитата:

Сообщение от dimanche13 (Сообщение 244784)

хым, залил на virustotal, ничего нет, так что проверь свой exe'шник по md5, вполне возможно троян у тебя на компе

ps. https://www.virustotal.com/file/0167...is/1353855652/

dimanche13 25.11.2012 21:53

Ответ: TatEngine
 
я уже удалил,
дождусь лучше версии, где не будет глючить прорисовка рабочей области
а пока проверю комп полностью

pax 26.11.2012 14:59

Ответ: TatEngine
 
Цитата:

Сообщение от jimon (Сообщение 244616)
генерим шрифт размером 8192*8192 с помощью BMFont

Что-то BMFont падает если визуализация идет более чем на одну страницу...

Хочу в Unity попробовать такие шрифты завести...

jimon 26.11.2012 17:28

Ответ: TatEngine
 
Цитата:

Сообщение от pax (Сообщение 244841)

Что-то BMFont падает если визуализация идет более чем на одну страницу...

Хочу в Unity попробовать такие шрифты завести...


попробуй подобрать размер чтобы всё на 1 странице уместилось, это обычно 800-1200 pt, ну или попробуй 4096*4096, плюс еще надо padding везде побольше указать чтобы при даунскейле был запас места вокруг каждого глифа

pax 26.11.2012 18:10

Ответ: TatEngine
 
Шейдер написал по примеру, надо теперь генератор меша сделать на основе инфы о шрифте... а в Unity 4 сделать импортер.
http://f4.s.qip.ru/etSMyDRW.png
http://f2.s.qip.ru/etSMyDRX.png


Почитал новые туторы и взглянул на редактор еще раз. Оказывается нету проверки типов входов и выходов при соединении, было бы очень клево ее добавить, а то получается что можно назначить что хочешь, куда хочешь...

jimon 19.01.2013 02:23

Ответ: TatEngine
 
выложил тулзы под макось, разработка проектов и движка потихоньку переходит на опенсорс репозиторий, showcase дорос до 9 комерческих проектов, но большинство пока под NDA :( надеюсь скоро появится время продолжить серию базовых туториалов и сделать демо проект

dimanche13 25.08.2013 18:48

Ответ: TatEngine
 
как дела у движка и какие на нем выпущены проекты под какие платформы? будут ли новые туторы, желательно по всем доступным компонентам движка.
вобщем тему надо обновить :)

jimon 01.09.2013 23:53

Ответ: TatEngine
 
Цитата:

Сообщение от dimanche13 (Сообщение 265902)
как дела у движка и какие на нем выпущены проекты под какие платформы? будут ли новые туторы, желательно по всем доступным компонентам движка.
вобщем тему надо обновить :)

проекты в основном делались под iOS, сейчас есть :
  • Lil Flippers
  • Flora : Jewel Quest
  • Dream Gym (пока тут не начинали маркетинговую компанию, но как только будет presskit то я расскажу подробнее)

была куча проектов не под издательство : презентации, конференции и тд, и так же всякие поделки которые не вылились в нечто более серьезное

в основном в движке более менее всё обкатано, но нашлись некоторые очевидные проблемы с тулсетом : он неудобный в некоторых случаях

мы собрали большой опыт в разных use cases с разными движками и хотим сейчас их систематизировать в универсальном тулсете - llgm (аналогия с llvm - low-level game machine), основная идея в том что WYSIWYG для игр работают не достаточно хорошо, например задача : вставьте 500 анимаций и назначьте их разным объектам, нужно еще поискать редактор в котором это будет удобно делать, и задавшись целью написать тулсет которым хочется пользоваться мы погрузли в R&D

в основном за всю историю IT самые сложные и разнообразные use cases были в редакторах текста, люди придумали очень мощные инструменты для редактирования текста : latex, vim, regexp, etc, потому мы решили использовать текстовое представление как основное, сделать некий markup language для игр

за основу markup language мы взяли qml (http://en.wikipedia.org/wiki/QML) - json подобный язык на котором внезапно удобно писать, declarative + reactive programming + scripting, и перекраиваем его для нужд realtime, назвали его game markup language - GML

оно выглядит примерно так :

Код:

material
{
  id: sprite_mat
  texture
  {
    file: "foo.png"
  }
  shader: "sprite"
}

sprite
{
  material: sprite_mat
  transform.x: 100
}

sprite
{
  material { texture.file: "bar.png" }
  transform { x: 50; y: 100 }
}

сам язык очень похож на json, стараемся сделать даже так чтобы GML был надмножеством json (любой json код - валидный gml код), можно будет переводить gml в json и обратно

сейчас изучаем использование этого языка, некоторые вещи делаются очень быстро в тексте, некоторые вещи делаются очень наглядно в unity-style редакторе, а некоторые возможно сделать только в excel (вставка 500 анимаций), представление в виде objects with properties позволяет легко переходить из одного вида в другой и обратно

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

основной фишкой llgm мы стараемся сделать абсолютную универсальность и простоту - GML будет полностью schema-driven без хардкода каких либо имен или структуры, потому можно будет подстроить тулсет под ваш движок, или вообще делать импорт\экспорт из существующих движков

по самому движку tatengine : есть планы по его рефакторингу, нужно обновить тулзы по работе с ide, добавить task-driven многопоточность, вынести геймлогику в скрипты и тд

так и не решили пока с гуи, возможно declarative + reactive programming упростит создание гуи (в QML оно достаточно просто делается), но это пока только догадки, production бывает ломает любые догадки =) возможно попробуем тупо встроить chrome чтобы забыть наконец-то о гуи

ps. дальше еще будет =)

moka 02.09.2013 00:01

Ответ: TatEngine
 
Какие преимущества у GML над JSON'ом?

jimon 02.09.2013 00:25

Ответ: TatEngine
 
Цитата:

Сообщение от moka (Сообщение 266294)
Какие преимущества у GML над JSON'ом?

удобнее писать руками, удобнее читать глазами, меньшая избыточность, lazy syntax, ну и да - комментарии в коде

разделителем может быть : или , или ; или его вообще может и не быть

например :
Код:

// gml
sprite { transform { x: 5 } }
sprite { transform { y: 20 } }

// json
Код:

[
{ "type" : "sprite", "childrens" : [ { "type" : "transform", "x" : 5 } ] },
{ "type" : "sprite", "childrens" : [ { "type" : "transform", "x" : 20 } ] },
]

еще думаем над всякими плюшками типа string literals и raw strings (как в C++), что позволит писать GML в UTF-8, а на выходе получать строку в UTF-16 или 32, а raw strings позволит не экранировать символы в теле строки и писать там скрипты любой сложности прям внутри GML файла

например :
Код:

script
{
text : R"(
// lua script
print("wow");
)"
}

стараемся упростить все до предела чтобы на нем именно ХОТЕЛОСЬ писать, есть много красивых инструментов, а любимых очень мало

так же в schema-driven будет много экспериментальных вещей : lazy types, lazy nested objects, lazy scripts и тд, но это не относится к синтаксису языка

например :
Код:

/* сам объект sprite по schema требует чтобы к нему был присоединен объект типа transform, у sprite для этого есть дефолтное поле с именем transform которое принимает ссылку (bind в терминологии qml) на объект с типом transform */
sprite
{
  // но если мы опишем объект с типом transform в теле sprite то gml сам его подхватит и прилинкует к полю transform
  transform { }
}

sprite
{
  transform { id: a }
  transform { id: b }
  transform : a // спрайт будет двигаться трансформом A
}

sprite
{
  transform : transform { x : 5 } // nested objects
}

spr // вместо указания полного типа можно указывать только первые буквы, да и еще убирая гласные (эксперимент)
{
  trn { x: 5 }
}

spr
{
  trn.x : 5 // можно обращаться к полям объекта через поля-ссылки
}

spr
{
  trn.x := math.sin(t) * 50 // если вместо : написать = или := то парсер будет ожидать nested script, выражение с = выполнится во время загрузки, выражение с := будет выполнятся каждый кадр (reactive programming)
}

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

moka 02.09.2013 04:32

Ответ: TatEngine
 
Цитата:

Сообщение от jimon (Сообщение 266295)
удобнее писать руками, удобнее читать глазами, меньшая избыточность, lazy syntax, ну и да - комментарии в коде

разделителем может быть : или , или ; или его вообще может и не быть

например :
Код:

// gml
sprite { transform { x: 5 } }
sprite { transform { y: 20 } }

// json
Код:

[
{ "type" : "sprite", "childrens" : [ { "type" : "transform", "x" : 5 } ] },
{ "type" : "sprite", "childrens" : [ { "type" : "transform", "x" : 20 } ] },
]


Чем не:
Код:

sprites: [
  { "transform": { "x": 5 } },
  { "transform": { "x": 20 } },
]

?
Цитата:

Сообщение от jimon (Сообщение 266295)
еще думаем над всякими плюшками типа string literals и raw strings (как в C++), что позволит писать GML в UTF-8, а на выходе получать строку в UTF-16 или 32, а raw strings позволит не экранировать символы в теле строки и писать там скрипты любой сложности прям внутри GML файла

например :
Код:

script
{
text : R"(
// lua script
print("wow");
)"
}

стараемся упростить все до предела чтобы на нем именно ХОТЕЛОСЬ писать, есть много красивых инструментов, а любимых очень мало

так же в schema-driven будет много экспериментальных вещей : lazy types, lazy nested objects, lazy scripts и тд, но это не относится к синтаксису языка

например :
Код:

/* сам объект sprite по schema требует чтобы к нему был присоединен объект типа transform, у sprite для этого есть дефолтное поле с именем transform которое принимает ссылку (bind в терминологии qml) на объект с типом transform */
sprite
{
  // но если мы опишем объект с типом transform в теле sprite то gml сам его подхватит и прилинкует к полю transform
  transform { }
}

sprite
{
  transform { id: a }
  transform { id: b }
  transform : a // спрайт будет двигаться трансформом A
}

sprite
{
  transform : transform { x : 5 } // nested objects
}

spr // вместо указания полного типа можно указывать только первые буквы, да и еще убирая гласные (эксперимент)
{
  trn { x: 5 }
}

spr
{
  trn.x : 5 // можно обращаться к полям объекта через поля-ссылки
}

spr
{
  trn.x := math.sin(t) * 50 // если вместо : написать = или := то парсер будет ожидать nested script, выражение с = выполнится во время загрузки, выражение с := будет выполнятся каждый кадр (reactive programming)
}

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

Это не будет языком, а будет "разметкой".
Да и любая попытка "упростить" требует создание каких либо механик, а они в 90% не оправдываются продакшаном и имеют ограничения. Которые в итоге вынудят других разрабатывать свои велосипеды.

Те же schem'ы, всегда имели % разрабов их не уважающих.

jimon 02.09.2013 13:54

Ответ: TatEngine
 
Цитата:

Сообщение от moka (Сообщение 266307)
Чем не:
Код:

sprites: [
  { "transform": { "x": 5 } },
  { "transform": { "x": 20 } },
]

?

первая строчка и уже не валидный json по двум причинам : ключ должен быть строкой, текст должен быть объектом (это не описано в стандарте, но 95% парсеров которые я видел не умеют парсить файл который не является объектом)

плюс опять же - комментариев нету, добавь их и твой файл никто не сможет распарсить, что уже не json

а в случае если ты хочешь описать все спрайты с помощью одного массива то получается что тебе нужно добавлять новые спрайты только в этот массив, что не удобно, можно тогда сделать объект "entity" и там уже делать спрайты и тд, получится ровно то что сейчас в юнити

основной минус такого подхода - слишком большая сложность и громоздкость, json представление мы делали в tatengine, и единственным плюсом был рабочий merge в системах контроля версий :crazy: формат оказался хоть и читабельным, но писать его руками не хотелось

Цитата:

Сообщение от moka (Сообщение 266307)
Это не будет языком, а будет "разметкой".

1) любая разметка - декларативный язык программирования

2) разметка с reactive programming взлетает для самописного кода, так же как html взлетает с nested js, nested css и прочим nested которое можно разместить в теле html файла

Цитата:

Сообщение от moka (Сообщение 266307)
Да и любая попытка "упростить" требует создание каких либо механик, а они в 90% не оправдываются продакшаном и имеют ограничения.

мы собрали опыт с unity, опыт со своим движком, опыт с cocos2d, udk и прочими и думаем как сделать удобнее, так же есть опыт людей из Qt : http://doc-snapshot.qt-project.org/q...t3d-qml3d.html, они потихоньку делают свой 3д движок на базе qml, потому текущее начинание это побольшей части research, ведь такую разметку в итоге можно превратить хоть в blitz3d код

Цитата:

Сообщение от moka (Сообщение 266307)
Которые в итоге вынудят других разрабатывать свои велосипеды.

таких уже нету, все пишут на unity

Цитата:

Сообщение от moka (Сообщение 266307)
Те же schem'ы, всегда имели % разрабов их не уважающих.

любой язык вообще-то имеет schema, даже C++, это как бы часть того что собирает набор токенов языка в семантическое дерево, просто json и xml могут описать любые объекты, а schem'ы нужны чтобы проверять некоторые поля на валидность с граматикой нужных для приложения объектов

если ты имеешь ввиду "напиши schema для своего же кода" - то нет, с тулсетом будет поставляться дефолтная schema gml с абстракциями уровня примитивов рендера, камеры, трансформов, материалов, скриптов и тд, но сам тулсет будет schema-driven, в чем смысл ? в том что в случае большой необходимости можно поменять schema на свою, например для движков где 3д камеры нету, а трансформам Z позиция не нужна

потому для обычного обывателя schema по началу вообще будет не доступна - он о ней даже знать не будет, кроме как из ошибок компиляции =)

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

Samodelkin 20.11.2013 21:00

Ответ: TatEngine
 
Цитата:

d3d9 рендер в разработке ( для wp8 ).
Я правильно понимаю что для магазина мелкомягких нужен dx11? Или вы без него обойдётесь?

jimon 20.11.2013 23:13

Ответ: TatEngine
 
Цитата:

Сообщение от Samodelkin (Сообщение 270449)
Я правильно понимаю что для магазина мелкомягких нужен dx11? Или вы без него обойдётесь?

там directx 11 с feature level 9_3

http://msdn.microsoft.com/en-us/libr...v=vs.105).aspx

http://msdn.microsoft.com/en-us/libr...v=vs.105).aspx

Samodelkin 21.11.2013 00:55

Ответ: TatEngine
 
Если у меня есть рендер написанный с d3d9 то мне всеравно его придется переписать через интерфейсы d3d11, или там можно из d3d11 получить интерфейс для d3d9 и не менять основную часть кода?


Часовой пояс GMT +4, время: 14:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot