Cheb's Game Engine

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: Cheb's Game Engine

Сообщение скалогрыз » 23.09.2016 20:40:30

это то, чего ты хочешь добиться?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 12.10.2016 16:14:02

Нет.

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

Основной планируемый масштаб борьбы - в пределах планеты, с привлечением альтернативных планов бытия (как Арканум и Миррор в "Мастере магии", только больше двух). Планирую хорошо оттянуться на плане Хаоса, топология которого за границами видимости игроков будет перекраиваться, скуручиваясь в неэвклидовы кренделя, кеш внесённых изменений - сбрасываться, и прочие заподлянки.

Никакой научной фантастики, основой будут ки и магия, и зависящие от них технологии. Максимум - стимпанк-магитек с левитирующими броненосцами. Пулемёт - продвинутая технология выше среднего. Големы (в т.ч. пилотируемые) в роли ОБЧР. И прочее подобное.

Сетевая игра - два совершенно несходных режима на одном движке.
1. То же, что сингл, только сетевая. Кооперация или соперничество - пусть сами решают. Все игроки - как бы астральные проекции призванных сущностей с другого плана бытия, это чтобы не мудохаться с настройками убиваемости.

2. Эмуляция механики киберспортивной дисциплины "квейк 3 арена" с добавлением стремительного строительства и разрушаемостью всего. Стандартный дезматч, или командный дезматч, или захвати флаг. В качестве арены огораживается кусок случайно сгенерированной планеты от базовой игры, со всеми её неписями, фракциями, дорогами и городами. Т.е. забивание гвоздей микроскопом. Для большего фана неписи считают проходящий дезматч вторжением демонов и реагируют соответственно (рандом может сделать ареной кусок города, например). Обязательно с поддержкой запоминания любимых семечек ГСЧ, чтобы удачные места отбирались пользователями.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 06.11.2016 18:24:55

1. Почти довёл X11 фреймворк:работает всё, включая переключение полноэкранный/оконный, но панель задач XFCE остаётся поверх полноэкранного окна. Отложил до тех пор, пока поставлю куда-нибудь убунту свежее, чем то ископаемое пятилетней давности, на котором сейчас тестю.

2. Преодолел затык в портировании на Raspberry Pi II. Окно создаётся, библиотека грузится, падает потом: порт на GLES даже близко не завершён.

Снова откладываю линукс, чтобы сосредоточиться на ключевых игровых механиках. К линуксу вернусь когда можно будет пострелять, побегать.

Добавлено спустя 2 часа 58 минут 15 секунд:
Окей, памятка себе чтобы не забыть, как будет работать игровая логика (до которой ещё семь вёрст раком):

1. Полоумные указатели:
Игровые объекты - со счётчиком ссылок. Когда один физический объект обращается к другому, который потенциально мог деспавниться - от мобов до чанков до целых вселенных - он должен сначала пнуть его метод "Ты_там_живой?(держи бестиповый указатель на мою ссылку на тебя). Если тот не живой (для чего у всех игровых объектов предусмотрен специальный флаг "моооозги"), то он сбрасывает эту ссылку в nil, тем самым сокращая свой счётчик ссылок.
Вся красота этого метода в крахоустойчивости: даже если погромист забудет добавить вызов Ты_там_живой() перед обращением, то худшее, что может произойти - ссылаемый на зависнет на какое-то время в состоянии зомби пока ссылающийся не обратится к нему правильно.
Для отладки - несложная проверка на утечки зомбей при очередном обходе графа (например, при сохранении). То есть всё прекрасно ловится.

2. Чанки и любые другие сложные сущности хранятся как объекты с одним/несколькими числовыми массивами внутри. В частности, у чанка эти массивы содержат упакованные хитрым образом мини-октри.
При клонировании такого объекта, все массивы клонируются путём увеличения счётчика ссылок (после копирования ссылки, которое происходит при тупом копировании внутренностей инстанса как бинарного блоба).
Естественно, любая запись в любой такой массив должна предваряться SetLength(a, Length(a)). Подумываю даже сделать собственную имплементацию array of Longint, где любая запись идёт через методы, гарантирующие Copy-on-write, и собственным диспетчером памяти, чтобы счётчики ссылок компактно лежали отдельно от тела массива - можно, например, уменьшить счётчик ссылок до одного байта, и блокировать тела массивов посредством VirtualProtect чтобы сделать, например, основной слой только для чтения в то время, как идёт просчёт всплывающего слоя - гарантированно ловя любые ошибки в коде, поскольку запись куда не надо вызовет AV.

3. Отпочковывание всплывающего слоя выглядит так:
а. Составляется список чанков, попадающих в расслаиваемую зону. Помечаются флагом "Ыц".
б. Составляется список объектов, находящихся внутри расслаиваемой зоны. Помечаются флагом "Ыц".
в. Осуществляется клонирование по флагу "Ыц", где корневым объектом служит список чанков, подлежащих клонированию. В процессе оного, ссылки на клонируемые объекты изменяются на ссылку на клон, а ссылки на объекты без флага остаются ссылками на базовый слой (примечание: это таки требует специализированного диспетчера памяти с отдельнолежащими полями, мне больше не отвертеться: каждому объекту надо временно придать поле "вот ссылка на мой клон", а пихать её внутрь самого объекта будет слишком жирно).
Одно важное исключение: если у чанка ссылка на соседний чанк, который в зону не входит, то она сбрасывается в NIL.
г. Сброс флага "Ыц" у всех затронутых.
Имеем: копированию подвергается порядка двух тысяч объектов сравнительно небольшого размера (порядка 200 байт), все тяжеловесные таблицы как лежали в массивах, так и лежат (и, со специализированным диспетчером памяти, их даже никто не трогал).

4. Физика расслоенного мира

- поскольку ссылки на объекты за пределами зоны сохраняются, то, например, бот продолжит преследование игрока который за границей видимости, только не идеально точно (его реакция будет слегка лагать, поскольку тот игрок - в отстающем базовом слое) Более того, бот, скорее всего, перестанет видеть того игрока, поскольку все запросы проверить линию взгляда идут через иерархию чанков и будут упираться в NIL. А огонь игрока не попадёт по боту, поскольку не существует во всплывающем слое. Все подобные последствия корректируются путём всплывания нового слоя от базового - т.е. нещадно лагают.

- любое изменение чанка (в массивах же) приводит к тому, что затронутый массив copy-on-writится. Но только он. Иначе всё просто сдохло бы: плавающих слоёв - минимум два, и все, кроме одного, гоняют физику на многократно увеличенной скорости

- критически важно чтобы мобы могли повлиять друг на друга только посредством событий, отправляемых через чанк. Никакого "Я тебя вижу?.. А если найду?.. Тогда я в тебя запулил!". Моб спрашивает у своего чанка: "Я вижу вон того ханурика?", подписываясь на событие "проверка видимости". Через некоторе время (как оптимизация трассировки лучей сложится, может, через несколько кадров) чанк сигналит мобу: "видишь". Тогда моб говорит чанку "Окей, моя стреляй рейлган вот по этому вектору", создавая объект "выстрел из рейлгана". Чанк просчитывает линию, видит, что линия упёрлась в его внешнюю границу, и пинает соседа: "Эй, тут тебе из рейлгана прилетело, вот объект". И так по цепочке, пока не попадёт во что-нибудь. Причём, если упрётся в NIL - просто молча останавливается. Если попало куда надо - объекту выстрела сигналят, в кого попал, а уже тот сигналит своему родному боту "Поздравляю, ты фрагнул имярек, кровькишкирасхреначило" и тот включает анимацию "Изображение"

- также все взаимодействия чанка с NIL соседом замирают: если оттуда лилась вода - она продолжит литься до бесконечности, с той же скоростью. Если дотуда дотечёт вода, она будет течь дальше с той скоростью, с какой втекла в прикасающийся к NIL стенке блок. И т.п.

Лирическое отступление: текущая вода - статический блок, обладающий параметрами скорости и давления. Меняется лениво при изменении давления соседей, обладает заметной петлёй гистерезиса. Что позволяет:
- задёшево создавать эпические потопы а ля Terraria, где значительная часть потопа статична, и потоп вменяемо ведёт себя на границе активной зоны вокруг игрока (общее количество воды не сохраняется, если текло из NIL - то может налиться целое море из ручейка, если текло в NIL - то будет утекать пока не утечёт целое море: у блока, соседствующего с несуществующим, просто не будет пересчитываться скорость течения
- автогенерировать текущие реки, которые с точки зрения физики абсолютно статичны
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 06.11.2016 22:33:07

Cheb писал(а):Отложил до тех пор, пока поставлю куда-нибудь убунту свежее, чем то ископаемое пятилетней давности, на котором сейчас тестю.

А нет опасности, что на свежей убунте код вообще перестанет работать?
я не думаю, что X11 прям-таки перебирают от сборке с сборке, но всё-таки :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 07.11.2016 01:06:51

Им чё, делать нечего >_<

Я надеюсь, что на ней всё как раз заработает.
Или не заработает, и надо будет искать косяк в своём коде дальше.

Цинично говоря, X11 нужен только для вишенки. Для обычной линукс под x86/x86_64 X11 желателен, но таки опционален, поскольку там есть связка (wine + виндовая Чентра) и таки планируемый уровень вайн-совместимости - платиновый.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 07.11.2016 01:17:04

Cheb писал(а):Цинично говоря, X11 нужен только для вишенки. Для обычной линукс под x86/x86_64 X11 желателен, но таки опционален, поскольку там есть связка (wine + виндовая Чентра)

я не в теме, но неужели под wine видеоускорение работает без проблем?
(хотя в прицнипе, если wine берёт на себя все заботы по работе с X11, то OpenGL на то и OpenGL что кроссплатформенный)

и кроме как GLX (связка OpenGL <-> X-windows), других возможностей рисовать через OpenGL-е в никсах нет.
Т.е. по-умному X11 реализацю писать придётся в любом случае.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 07.11.2016 02:14:11

но неужели под wine видеоускорение работает без проблем?

Ну, вайн - это лишь достаточно тонкая API-прослойка над нативной системой, его точнее будет сравнивать с GTK+ или QT, а не с эмулятором.
Директикс - там да, там грустно (дохрена слоёв эмуляции). А OpenGL? Вайн вообще ретранслятором может работать, каждая функция - не более, чем обёртка над нативной, чтобы формат вызова конвертировать. Соответственно, при правильно написанном под OpenGL 2+ коде (минимизация вызовов, всё через буферы) оверхед должен иметь вес пера.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 08.11.2016 19:16:38

А нет опасности, что на свежей убунте код вообще перестанет работать?

Таки перестал :D
Мне простого XInternAtom() показалось недостаточно, запилил хардкорную AtomOrDie(). И что бы вы думали? Ни одна современная линупсятина не знает WM_SAVE_YOURSELF :oops:

Поставил современную убунту. Полюбовался как страшно расколбашивает окно при попытке переключения в полноэкранный. Заблокировал полноэкранный для X11. :(

З.Ы. Если бы не zengl, я был бы в глубокой и волосатой. Современная убунта подклала ещё пару нежданчиков.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 08.11.2016 19:21:23

Cheb писал(а):З.Ы. Если бы не zengl, я был бы в глубокой и волосатой. Современная убунта подклала ещё пару нежданчиков

следим-следим.
Есть мнение, что имеет смысл спросить eugeneloza (здесь или на gamedev.ru) потестировать castleengine, на предмет того, как он себя ведёт в полноэкранном режиме под X11 (с видео и скриншотами).
И если всё ок, то "вдохновляться" их кодом :D
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 11.11.2016 23:01:46

Рязина тяаааанется, тяаааанется.... ... ... :cry:

Хочу мультитекстурирование.
Для него нужен атлас.
Для него нужен механизм кеширования атласа.
Для него нужен механизм сохранения картинок, где до вчерашнего дня конь не валялся.

"тренируясь на кошечках" запилил встроенную скриншотоделку:
[кадр №515, 22:05:48.192, Пт, 11.11.2016]

(поток №0) Hot key detected, requesting the mother to prepare data for a screenshot


[кадр №516, 22:05:48.206, Пт, 11.11.2016]

Got a request to copy back buffer data for a screenshot...

allocated 6172 Kilobytes)

calling glReadPixels()...

Ok, 1920x1080 in 104425 μs


[кадр №517, 22:05:48.314, Пт, 11.11.2016]

(поток №0) Suddenly found screenshot data prepared by mother. Adding a background task to save it to a file.


[кадр №518, 22:05:48.322, Пт, 11.11.2016]

(поток №2) got a task: TScreenshotMakeTask

(поток №2) TScreenshotMakeTask.Perform

(поток №2) creating image 1920x1080 GL_RGB8...


[кадр №522, 22:05:48.367, Пт, 11.11.2016]

(поток №2) Создаю папку "D:\chentrah\screen-capture" ...


[кадр №523, 22:05:48.379, Пт, 11.11.2016]

(поток №2) saving D:\chentrah\screen-capture\_test020__2016_11_11_22_05_48_378.png


[кадр №591, 22:05:49.114, Пт, 11.11.2016]

(поток №2) completed in 821757 μs

(поток №2) Сохранён снимок экрана,

D:\chentrah\screen-capture\_test020__2016_11_11_22_05_48_378.png

(поток №2) completed TScreenshotMakeTask

Got a request to delete screenshot data...

deleted unnecessary screenshot data (1920x1080)

Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 02.12.2016 11:44:54

Прогресс со скоростью беременной улитки.

1. Обнаружил пару *ляпов*, ломавших принцип "вся работа с библиоткекой изображений строго из одного потока".
Один исправил (картинка удалялась в деструкторе фоновой задачи, который вызывался в основном потоке, а не в рабочем. Доработал, теперь деструктор задачи декодирования порождает фоновую задачу удаления, сдавая ей хендл картинки.
Второй ещё нет (команда матке переключить указатель мыши на песочные чесы (логический поток!) внутре себя вызывает чтение PNG с этими самыми часами).

2. Медитировал над атласами, доработал класс текстуры-на-основе-картинки, добавив флаг "не удалять картинку после инициализации" и метод "сдать завершённую задачу декодирования картинки в поликлинику для опытов".

Теперь можно делать атлас.
З.Ы. Многопоточное программирование - рафинированный геморрой :x
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 02.12.2016 18:48:41

Cheb писал(а):"тренируясь на кошечках" запилил встроенную скриншотоделку:

calling glReadPixels()...

а почему бы не через render target (render to texture)?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение runewalsh » 02.12.2016 19:33:39

скалогрыз писал(а):а почему бы не через render target (render to texture)?

Из рендертаргета тоже читается как BindFramebuffer [+ ReadBuffer] + ReadPixels. Для ускорения можно использовать PBO, в этом случае данные читаются в буфер в видеопамяти, который ты копируешь в клиентскую «когда удобно OGL», а не «вот прям сейчас» (например, через кадр), он тоже работает с ReadPixels (с забинденным PBO указатель интерпретируется как смещение). Для скриншотов это не самая актуальная вещь в мире, вот если ты захочешь обрабатывать видеокадры OpenGL и не выводить на экран, а отдавать кодировщику, тогда да.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение скалогрыз » 02.12.2016 21:04:31

runewalsh писал(а):Из рендертаргета тоже читается как BindFramebuffer [+ ReadBuffer] + ReadPixels.

да. логично. натупил.

просто у меня сцена рисуется в текстуру (и вывод на экран для меня это дополнительный шаг) а вот скриншоты делаются "сразу же".
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 02.12.2016 21:06:40

а почему бы не через render target (render to texture)?

Тупее, надёжнее, универсальнее.
Скорость приемлемая: захват FullHD на не самом быстром оборудовании вызывает лишь 100мс микро-фриз.

Медитирую над структурой хранения мира в памяти.
На работе работать лень, сил нет :x

Пока додумался забить на сверхжёсткую экономию (при этом слишком многое ощущается натягиванием совы на глобус) и постулировать 8 байт на воксель, в котором хранится либо 63-битная bitpacked record, либо указатель на объект (что на 32-битных платформах ну ужос, как расточительно). Один узел октри = 8*8 = как раз одна линейка кеша. При этом, можно, через жопу с приведением типов, но задействовать механизм счётчика ссылок у объектов.
Требует некоторого допила Чеперси для правильного сохранения, но в целом дополнительной работы немного, а плюшки весомые.

просто у меня сцена рисуется в текстуру (и вывод на экран для меня это дополнительный шаг) а вот скриншоты делаются "сразу же".

Кстати, у меня скриншот делается с UI и даже с указателем мыши.

Добавлено спустя 6 минут 48 секунд:
P.S.
сцена рисуется в текстуру (и вывод на экран для меня это дополнительный шаг)

У меня будет гораздо суровее: сцена будет рисоваться несколько раз, в разные буферы, которые при выводе на экран будут смешивться сложным образом.

А как ещё получить проекцию 120х67 градусов со сферической коррекцией и качеством в центре лучше, чем по краям?
Я линейные перспективные проекции не люблю, у меня ещё в той досовской игрушке проекция была цилиндрическая. 8)

Добавлено спустя 3 минуты 24 секунды:
З.Ы.
Принял решение перевести игровой UI на виртуальное разрешение, меняющееся от 1280х720 до 1280х1024. Если окно/полноэкранный режим не укладываются в этот диапазон соотношений - будут чёрные полосы по краям, и николеблет.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru