Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение Cheb » 20.01.2015 18:33:23

Увы, не катит.
DLL создаёт потоки. В потоке происходит AV. Дефолтный виндовый хэндлер убивает всё приложение :(

Несовместимо с моей парадигмой "Если есть что сохранять, то при крахе должно сработать автосохранение".

Устанавливать обработчик в DLL? Можно было бы. НО. Это что пнём об сову, что совой об пень: этот обработчик должен уметь распознать исключения в EXE и перенаправить туда.

Обработчик-то единый на процесс, на все исполняемые модули и все потоки.

Добавлено спустя 6 часов 7 минут 55 секунд:
Оооо-кей, нашёл один нежданчик в стиле "самдурак". :oops: Кучу запарывало только так.

Задачка для любознательных: какое безбожное святотатство содержится в этом фрагменте, и в какой строчке? :roll:
Код: Выделить всё
//function unzGetCurrentFileInfo(afile: unzFile; pfile_info: unz_file_info_ptr; szFileName: PChar; fileNameBufferSize: longint; extraField: pointer; extraFieldBufferSize: longint; szComment: PChar; commentBufferSize: longint): longint; { ZEXPORT }
function TUnzip.GetCurrentFileInfo(pfile_info: unz_file_info_ptr; var FileName: AnsiString; extraField: pointer; extraFieldBufferSize: longint; var Comment: AnsiString): boolean; { ZEXPORT }

{ Get Info about the current file
  if pfile_info<>NIL, the pfile_info^ structure will contain somes
  info about the current file
  if szFileName<>NIL, the filemane string will be copied in szFileName
      (fileNameBufferSize is the size of the buffer)
  if extraField<>NIL, the extra field information will be copied in
    extraField  (extraFieldBufferSize is the size of the buffer).
    This is the Central-header version of the extra field
  if szComment<>NIL, the comment string of the file will be copied in
    szComment (commentBufferSize is the size of the buffer) }
var name_sz, comm_sz: longint;
begin
//function TUnzip.GetCurrentFileInfoInternal(pfile_info: unz_file_info_ptr; pfile_info_internal: unz_file_info_internal_ptr;
//   szFileName: PChar; fileNameBufferSize: longint; extraField: pointer; extraFieldBufferSize: longint;
//  szComment: PChar; commentBufferSize: longint): longint;

//  unzGetCurrentFileInfo := unzlocal_GetCurrentFileInfoInternal(afile,
//    pfile_info, nil, szFileName, fileNameBufferSize,
//    extraField,  extraFieldBufferSize,
//    szComment, commentBufferSize);

  SetLength(FileName, UNZ_MAXFILENAMEINZIP + 1);
  SetLength(Comment, 1000);
  Result:= UNZ_OK = GetCurrentFileInfoInternal(
    pfile_info, nil,
    @FileName[1], Length(FileName),
    extraField,  extraFieldBufferSize,
    @Comment, Length(Comment)
  );
  CutAnsiStringByZeroChar(FileName);
  CutAnsiStringByZeroChar(Comment);
end;


Добавлено спустя 12 часов 44 минуты 45 секунд:
Пока ехал в метро на работу, добавил отладочный режим где потоки не создаются, а все фоновые задачи выполняются в основном потоке.
Падать перестало.
Раздражает. :evil:

Добавлено спустя 7 часов 35 минут 50 секунд:
P.S. Моё отношение к изменениям механизма строк в грядущем fpc 3:
Я очень рад что они наконец-то это сделали, и обязательно сделаю свой движок 100% юникодным (о чём давно мечтал). Но доползу далеко не сразу. Частичная переделка вялотечёт уже давно, но сделать ещё предстоит немало, и - буду честен - для меня сейчас гораздо важнее получить рабочий игровой мир где уже бегают монстры и плещутся волны. Так что, скорее всего, и Чентра и Чеперси до конца 2015-го застрянут на связке FPC 2.6.4 / внутренняя кодировка = WideString. :roll:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 26.01.2015 20:15:20

Как сказал - так и сделал :roll:
Перелопатил весь код, заменив везде WideString на UnicodeString и добавив чеперси поддержку оных.
Пока падает. Похоже, что-то расковырял. :(
Не проверял чеперси в линуксе: не знаю, не упадёт ли, пытаясь два раза зарегистрировать UnicodeString.
Может, просто вынести поддержку WideString к чертям собачьим?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 26.01.2015 21:19:50

Любые строки, кроме однобайтовых — ересь. Вводить поддержку зоопарка на уровне языка вместо того, чтобы признать одну кодировку (UTF-8) дефолтной и предоставить функции для конвертирования в/из всех остальных, и то только для взаимодействия с внешними API или хранения, было стратегической ошибкой. Зачем с невероятно важным видом трубить о переходе %projectname% на юникод и перелопачивать код, «меняя WideString на UnicodeString», когда можно с тем же успехом не делать ничего. Сам использую ansistring как де-факто UTF8string, единственный хак, что требуется — {$codepage cp866} (или любая ASCII), чтобы вынудить компилятор считать UTF-8 литералы ansistring'ами.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 27.01.2015 03:30:32

Если бы FP развивался самостоятельно - так бы и было и я бы только приветствовал. Но для FP слишком важна совместимость. Это наша СвященнаяКороваПлюс. Поэтому, увы, стратегам пришлось обезъянничать у делфей.
У меня изначально была заложена хитровывернутость системы строк. Были имена файлов отдельно, 8-битные, а все строки в логике - отдельно, 16-битные. За WideString я ухватился как за надежду избавиться от ада кодировок, ещё до того, как узнал про утф-8. Моя первая линуксятина, к слову, работала в cp1251. А кошерной в те времена тогда считалась то ли кои-8, толи ещё какая муть.

Парадигма требует, чтобы игровая механика, по возможности, ничего не знала ни о платформе, ни об операционке.
Сейчас, в данный момент, UnicodeString я выбрал чтобы меньше переделывать: очень много кода уже заточено под WideString и не факт, что где-то не забиты костыли типа "буква это 16 битное целое". Кодировка у них одинаковая, всё одинаковое, единственное отличие - UnicodeString - это нормальная строка, а не костыль. Минимум изменений.

Имена файлов... Будете смеяться, но я уже успел везде переделать на обращение к типу TFileNameString, который объявляется в зависимости от директив компилятора: в линуксе - Utf8String, в виндовсе - AnsiString (сейчас) или WideString (планировалось).

Но! У меня к utf-8 есть претензия. Многобайтная кодировка ломает принципы Паскаля по работе со строками: известная заранее длина становится бесполезной, принцип обращения к буквам как к элементам массива ломается.
В принципе,я мог бы тогда забить, и внутренней кодировкой выбрать cp1251. Всё равно шрифт - текстура из ограниченного числа букв. Перестраховался просто.
Теперь буду в именах файлов тоже использовать UnicodeString.

А файлы конфигурации, локализации, и журнал у меня с самого начала были UTF-8. Код увешан Utf8Decode и Utf8Encode как ёлка гирляндами.


P.S. Разгрёб многия баги. Выгреб три позорнейших места с неинициализированными переменными, :oops: и один законченный ктулху фтагн. :shock:
Падать перестало :D
Теперь вправить мозги классу вьюпорта (почему то всегда создаёт FBO 1x1 пиксел, хоть и работающий :shock: ) - и можно выкладывать на суд общественности. Загрузка PK3 работает, йо! :D

P.P.S. Кошка мявает, бедная :( Самец нужен. Голубя домогаться уже перестала: он, скотина, только кусается.

Добавлено спустя 9 часов 45 минут 22 секунды:
Лог файл обрывается правильно, меметично :mrgreen:
Код: Выделить всё
Saving session: temporary file name "D:\chentrah\sessions\_test018\default\temporary.$$$"
Saving the session...
Chepersy: validating state for CpsStore()
Types information had been written.
The mother's SEH hack has called the module's callback in main thread...
  004718B2h is D:\chentrah\chentrah-debug.exe, base 00400000h
  ..file "D:\chentrah\chentrah-debug.zd2", exists=True..
  dwarf2 line info: 195584 bytes..
  found 90 units.
<----=* ERROR! ---- (look below for details) *=---->
  Module's callback is done. Raising a language exception...
That was stack overflow! OH SHI--


2 февраля 2015
Ура! Прорвался-таки! :D
Великий Перетрях завершён, всё работает. Сколько я багов резал-перерезал, сколько их душ жучиных загубил... Но теперь все мои пляски с бубном работают стабильно. А ведь пол-архитектуры переколбасил, с добавкой значительных и важных кусков. И всего-то месяц с хвостиком заняло :roll:

Теперь все "тяжёлые" ресурсы при откате сессии сохраняются, откат мгновенный. Специально навалил тесту pk3 файлов от опен арены, чтобы давился, парся их подольше. Менеджер файлов опознаётся по комбинированному хешу всех своих файлов. Открытыми pk3 файлами владеет матка, остаются открытыми до выхода из программы (fmShareDenyWrite). Длл при перезагрузке эти потоки их подцепляет уже открытые. Список файлов не обновляется до перезапуска программы (это не баг, это фича).

До выкладки теста №18 со исходниками осталось:
1. Сделать класс - менеджер скинов с атласом мелких вариантов в одной здоровой текстуре и фоновой загрузкой полноразмерных. И визуальной демонстрацией этого, чтобы было понтово, как в анриле. Фигня вопрос, используя уже наработанное, слабаю за пару вечеров.

2. Удавить баг с форканием сессии - форкнутая получается глючная, работает только главменю на фоне HOM эффекта неочищающегося экранного буфера.

3. Удавить мелкий баг с просверкивающим в самый неподходящий момент неочищенным экранным буфером при перезагрузке длл. Всю красоту плавного затемнения портит.

4. Чтобы уже не откладывать - изменить формат сессии, добавить сигнатуру и возможность выбора уровня сжатия zlib через INI фафлы.

2 апреля 2015

Прогресс ползёт ни шатко, ни валко: на работе сдача проекта горит.

На скриншотах: всё тот же старый добрый DRR, нагибает HD 3000 видеокарту ноутбука :roll:

Изображение

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

Re: Cheb's Game Engine

Сообщение Cheb » 07.04.2015 16:58:00

7 апреля 2015

Прогресса пока нет, и не предвидится: на работе завершается большой проект, сроки - к концу марта.

Опубликовал вот пока что дорожную карту, кою буду иногда обновлять: http://chentrah.chebmaster.com/?what=tech

19 апреля 2015

На выходных пилю, строгаю классы камеры и сцены, а также класс вьюпорта, из которого выпну всё, оставив его тупым гуйным контейнером. Рендерным буфером будет заведовать класс камеры.
Голова пухнет. НЕНАВИЖУ МАТЕМАТИКУ :evil: . Но я прорвусь, потому что моя любовь к 3d графике сильнее моего отвращения к формулам векторных вычислений. 8)

Принял решение первой очередью запилить тулзу анимации готовых 3d моделей со скиннингом на основе константных объёмов, чтобы доказать этой упрямой личности fromhell что ружья кирпичом не чис... В смысле, что классическая скелетная анимация - это устаревшее говно для слабых машин, не годится оно в упор для моделей в которых важны, ээ, гибкость и форма:
Изображение
Отправлю Блендер лесом! :evil: Густым! :twisted:

10 мая 2015
Ноль прогресса, на работе дедлайны косяком. Вспоминаю свои былые достижения (2002 год):

анимация наведения по высоте
Изображение

анимация раздавления потолком
Изображение
Последний раз редактировалось Cheb 16.04.2018 19:25:50, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 11.05.2015 05:03:47

Bместо того, чтобы править свой последний пост, тебе нужно создавать новый. Тогда и теме будет "ап" ну и не обязательно будет писать дату жирненьким :)
успехов с дедлайнами, кстати!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 11.05.2015 11:35:10

Тогда и теме будет "ап"

Да просто неловко делать ап когда сказать, по сути, нечего.

а художники в команде есть?

Мой Хитрый План™ - сначала сделать полноценную работающую игру на минималистском наборе контента, а потом уже задумываться о наборе команды.
Слишком много зависит от того, насколько быстро я напрограммирую, а я медленный и неравномерный. Тут даже самые терпеливые разбегутся.

Как пример перед глазами - успех такой игры как Kingpin, за всё про всё имевшей три 3d модели: качок, жирдяй, девка. Всё. На этих трёх китах держится целая игра (текстур, правда, для них море).

Откуда, всё человекообразное можно загнать в *одну* модель. Только она должна быть зело мутабельной! То есть, существующие технологии не годятся, нужно писать свой редактор для этой одной модели.
Зато она одна тянет 90% мира: люди, эльфы, гномы, орки, гоблины и даже кентавры/драйдеры/ламии/русалки, если предусмотреть пришивание нижней половины отдельно.
А оутсорсить планирую всякий зверинец (т.е. всё не человекообразное).

успехов с дедлайнами, кстати!

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

Re: Cheb's Game Engine

Сообщение Cheb » 18.07.2015 08:03:15

18 июля 2015
Весь июнь и июль работал, ни на что времени не было. Но это не мешало мне *мыслить*. Надумал следующее:

1. Оптимизировать надо под *двух* ядерные процессоры как поддерживаемый минимум. Все НЕигровые ноутбуки и офисные гробики попадают в эту категорию.

2. Всё, что связано с СУБД, навсегда остаётся жёстко однопоточным. Иначе здохну, утопнув в модернизации, но так ничего и не добьюсь.
А конкретно: вся игровая физика и логика меню.

3. Под СУБД выделяется *отдельный* поток. Назовём его логическим. Закончив очередной кадр, логический поток уходит в спячку. Рендер, выполняющийся в основном потоке, будит его каждый кадр событием.

4. Когда рендер готовится к рисованию, он лочит те фреймы логики, которые ему нужны для работы, вызывая синхронизацию потоков. Это приводит к тому, что движок фактически 1.5 поточный. Такая организация позволяет: а) доделать прежде, чем седых волос у меня в бороде станет более половины (пока только 4 шт.) и б) не терять время, пока рендер ждёт SwapBuffers, вызов коей может занимать от трети до половины времени кадра.

5. *все* всплывающие фреймы игрового мира выполняются в логическом потоке. Если натыкается на фрейм, залоченный рендером, то пропускает его и считает следующий.
Примечание: рендеру могут понадобиться только два фрейма: PPSF и TFF. Промежуточные ему до лампочки.

6. Параллельно всему этому работает уже описанный ранее механизм фоновой загрузки ресурсов, с одной поправкой: все его потоки имеют слегка пониженный приоритет.

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

Re: Cheb's Game Engine

Сообщение скалогрыз » 18.07.2015 16:37:55

Cheb писал(а):1. Оптимизировать надо под *двух* ядерные процессоры ...

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

Re: Cheb's Game Engine

Сообщение Cheb » 19.07.2015 22:08:22

это как?

Это отмазка. Для полноценного развития движка под многоядерность, у меня не хватит сил и времени. Как бы ни была крута изобретённая мной парадигма, она не масштабируется. Нужны несколько человек, работающие над ней год-два на полный рабочий день чтобы это исправить. Получится серьёзный фреймворк.
Откуда, я вынужден оставить физику чисто одноядерной, как и планировалось, частично размазав на второе ядро простым вынесением части не влияющих на физику процессов.
Получается, что двухъядерный процессор для такой квазимоды - самое оно.
Большее число ядер будет бесполезно из-за отсутствия масштабируемости. Писать с нуля сил и времени нет.

Следствия:
- для мультиплеера буден обязателен мощный процессор, современный или с высокой тактовой частотой.
- не получится использовать свободные ядра для ИИ в сингле, как делает Фолаут.

К середине еавгуста планирую всё перелопатить, привести к окончательному виду и выложить болванку движка, на которой уже можно строить и опробовывать элементы физики и рендера.
Моя вторая проблема - ползучий фичуризис (первая - лень). Слишком долго делал, за это время появились многоядерные процессоры и 64-битные платформы, а я каждый раз бросался пилить поддержку вместо того, чтобы доделать. Когда начинал, было просто. Только Виндовс 98 и только 32 бита, процессор один - в страшном сне не могло присниться, что их может быть больше. Потом увлёкся линуксом, и вместо того, чтобы доделать, закопался в поддержке линукса. А ранние линукса года 2007-го - они были такие... Гигантский объём усилий сожрало, всё на хаках, на прямых обращениях к X серверу. А теперь всё равно всё это с нуля переделывать на gtk.

Поэтому я и решил, что поддержка линукса будет - но только когда саму игру доделаю, а пока только Win32.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 20.07.2015 06:13:27

а как так - "физика одноядерная"? может быть "физика однопоточная"? или более точнее "без параллельных вычислений"?

помнится, в начале 2000-х, когда стали появляться первые двуяедрные/двупроцессорные персоналки, статьи по игродельству пестрили всякими советами о том что нужно писать "два движка" - под одноядерные и многоядерные процессоры. Только это всё не чем заканчивалось, т.к. отлаживать два движка, хуже чем один. А правда одна, у кого руки прямые - нужно использовать потоки. А ОСь уже разберёться на каком ядре какой поток запустить.

ну а 32 vs 64 вообще не должна быть проблемой :) просто pointer-ы к integer-у не приводить и всё.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 20.07.2015 21:10:26

Всё упирается в цену допила созданной для движка СУБД. Всё она, родимая. Я на неё убил с 2006 по 2008, и работал тогда на фрилэнсе - т.е. времени было гораздо больше.

или более точнее "без параллельных вычислений"

Кхм. Точнее будет - однопоточная. Сложность - на пределе для меня, поддержка многопоточности утроила бы её. Много разных идей прокрутил, но понял, что парадигма тупо не распараллеливается.

просто pointer-ы к integer-у не приводить и всё.

Ага. Сначала отловить все такие приведения, потом отладить СУБД под 64 бита.
Потом допилить систему обработки исключений под 64 бита.
Потом сделать заново собственные тулзы для парсинга и обработки 64-битного экзешника. Отладить их.
Потом сделать парсер Dwarf2 для 64-битного экзешника. Отладить.
Потом то же самое, уже сделанное для линукс 32, сделать для линукс 64. Отладить.

Чувствуете, чем пахнет? Тонами муторной, кропотливой работы.

P.S. Насчёт тулзов. Открыть екзешник, выковырять dwarf2 блок во внешний файл. Прогнать екзешник через strip.
Можно не прогонять через strip, но это что совой об пень, что пнём об сову. Тогда сам екзешник при запуске должен открыть себя и выковырять dwarf2 блок. И размер конский.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 20.07.2015 21:21:32

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

Re: Cheb's Game Engine

Сообщение hinst » 27.07.2015 18:51:35

я так и не понял, нафига было в динамическую библиотеку что либо вообще выносить? Что мешало без динамических библиотек обойтись?
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Cheb's Game Engine

Сообщение runewalsh » 27.07.2015 22:20:03

hinst
Ну типа МОДУЛЬНОСТЬ, вынес компонент (им может быть в том числе какая-то механика, специфичная для небольшой игровой локации, которую, скорее всего, и загружать-то не придётся) в DLL и прямо на горячую подключаешь-отключаешь. Хотя так никто и не делает, лол. DLL всё же слишком низкий уровень.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Пред.След.

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

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

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

Рейтинг@Mail.ru