Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение Cheb » 28.08.2015 12:01:20

Для этого хорош vsync.

Тут маахонькая проблемка. Я открыл великолепный, надёжный способ непрямого измерения загрузки видеокарты, работающий даже когда частота кадров ограничена CPU. Это основа автонастройки уровня детализации (моя понтовая фича №2).
Но! Метод основан на точном измерении длительности SwapBuffers. Добавь в эту смесь Vsync - и всё идёт в разнос, т.к. длительность SwapBuffers начинает зависеть не столько от нагрузки, сколько от времени ожидания следующего интервала развёртки.
Посему, движок сразу выходит с ошибкой, если не может отключить Vsync (например, включена принудительно через панель управления nVidia).
А даже если бы разрешил, отключив этот способ измерения и используя одни FPS, частота кадров держалась бы ниже 60 из-за адаптивного принципа балансировки нагрузки.

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

Короче: частота кадров непрерывно плавает. Пока черновой вариант - движок пытаяется её стабилизировать на 70..80, чтобы проседания не приводили к резкому сбросу детализации.

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

Re: Cheb's Game Engine

Сообщение Cheb » 31.08.2015 02:07:58

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

Вот почему метод TCriticalSection.Enter не виртуальный? :evil:
Код: Выделить всё
procedure EnterCriticalSectionWv(var cs: TRtlCriticalSection); inline;
var
  oto: TThreadLoadKind;
begin
  oto:= NoteThreadOccupation(tlk_WaitingCriticalSection);
  EnterCriticalSection(cs);
  NoteThreadOccupation(oto);
end;

procedure EnterWv(cs: TCriticalSection); inline;
var
  oto: TThreadLoadKind;
begin
  oto:= NoteThreadOccupation(tlk_WaitingCriticalSection);
  cs.Enter;
  NoteThreadOccupation(oto);
end;

function NoteThreadOccupation(o: TThreadLoadKind): TThreadLoadKind;
var
  pes: PMotherSehState;
begin
  if not Assigned(Mother) or not Mother^.Safe then Exit(tlk_Working);
  pes:= GetExceptionState();
  if not Assigned(pes) then Exit(tlk_Working);
  {
    Assembly here is not only for the TSC but also to allow integer overflow
    when the range checking is on
  }
  asm
    {$ifdef cpu64}
      push rax
      push rdx
      push rsi
      push rcx
      pushf
      mov rsi, [pes]
      mov rcx, qword[rsi + TMotherSEHState.tlitsc]
      mov eax, 0
      rdtsc
      mov dword[rsi + TMotherSEHState.tlitsc], eax;
      mov dword[rsi + 4 + TMotherSEHState.tlitsc], edx;
      shl rdx, 32
      add rdx, rax
      sub rdx, rcx
      mov rcx, 0
      mov ecx, dword[rsi + TMotherSEHState.tlic]
      add qword[rsi + rcx * 8 + TMotherSEHState.tli], rdx
      popf
      pop rcx
      pop rsi
      pop rdx
      pop rax
    {$else}
      push eax
      push edx
      push esi
      push ecx
      push edi
      pushf
      mov esi, [pes]
      mov ecx, dword[esi + TMotherSEHState.tlitsc]
      mov edi, dword[esi + 4 + TMotherSEHState.tlitsc]
      rdtsc
      mov dword[esi + TMotherSEHState.tlitsc], eax;
      mov dword[esi + 4 + TMotherSEHState.tlitsc], edx;
      sub eax, ecx
      sbb edx, edi
      mov ecx, dword[esi + TMotherSEHState.tlic]
      add dword[esi + ecx * 8 + TMotherSEHState.tli], eax
      adc dword[esi + ecx * 8 + 4 + TMotherSEHState.tli], edx
      popf
      pop edi
      pop ecx
      pop esi
      pop edx
      pop eax
    {$endif}
  end;
  Result:= pes^.tlic;
  pes^.tlic:= o;
end;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 01.09.2015 02:08:01

>but also to allow integer overflow when the range checking is on
Код: Выделить всё
{$push}
  {$rangechecks off} {$overflowchecks off}
  ...unchecked code...
{$pop}
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 01.09.2015 10:17:50

Нуууу, мне ещё было приятно стряхнуть пыль со своих старых, ненужных умений писать на асме. Ностальгия, туды её за ногу.
До смешного дошло: сначала вместо mov esi, [pes] написал lea esi, [pes] , потом долго искал почему падает, а потом ещё дольше бил себя по голове за тупость. :oops:
(для справки: сия замечательная команда делает *два* обращения к памяти, и в регистр попадает не значение переменной-указателя, а значения указателя, на который указывает переменная-указатель.
Т.е. lea - это хорошая, годная команда. Просто надо уметь её готовить. :roll:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 02.09.2015 12:13:14

Я просто оставлю это здесь:
http://chebmaster.com/downloads/chentrah_test019.zip

Клавиши: 1..3 выбирает режим синхронизации логики, 4..0 задаёт длительность выполнения логики (искусственный sleep), F11 полноэкранный, F12+Q переключает на ручное управление нагрузкой (колесом мыши). F5 - создать точку отката, F9 - откатить сессию.

Легенда диаграммы потоков (подробнее см. где-то в chentrah.ini):
серый - спит
белый - ждёт критической секции или события
зелёный - пашет
голубой - логика
розовый - рендер в главном потоке (это вычитается из логического потока, отъедая его свободное время)
красный - видеодрайвер делает SwapBuffers.
жёлтый - обработка оконных сообщений
коричневый - рисование всякой фигни типа курсора мыши, текста консоли и счётчика кадров. Этим уже занимается экзешник-матка.

Сфера низкополигональная потому что рисуется на соплях glTexCoord2f /glVertex3f , гвоздями прибит самый нижний LOD чтобы не сильно влияло на тайминги. Классы мешей и VBO пока не сделаны. При переключении сессий иногда виснет, потом разберусь. Дебажная версия после вопроса о выборе языка выходит (не умеет перезапускать себя)
Последний раз редактировалось Cheb 16.04.2018 19:26:26, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 02.09.2015 16:03:23

k-kowai
Первое — сплеш, да? Не надо так пользователей пугать. Пылью веков подавятся ещё.
Esc → «Выбрать другой модуль» → «Выход» виснет.
Вложения
best splash evah.png
best splash evah.png (9.38 КБ) Просмотров: 34045
artgndbv.jpg
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение скалогрыз » 02.09.2015 16:46:24

Cheb писал(а):F11 полноэкранный

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

Cheb писал(а):F5 - создать точку отката, F9 - откатить сессию.

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

Re: Cheb's Game Engine

Сообщение Cheb » 02.09.2015 16:59:17

Не надо так пользователей пугать.

Это просто везение. :mrgreen: Там четыре шуточных сплэша, у каждого вероятность где-то по одному проценту. См. modules/chentrah/img/splash


Esc → «Выбрать другой модуль» → «Выход» виснет.

:shock: Это ж сколько лет я туда не лазил.
Зарррразный говнокод!

А, понятно. Синий экран смерти и системное меню екзешника ничего не знают о многопоточности. Наверно, пытается выгрузить DLL когда её потоки ещё работают. Бум допиливать.

сначала распахивается окно на весь декстоп

Точно такое же поведение как у файрфокса. :mrgreen: А ещё при попытке развернуть окно на весь экран происходит переход в полноэкранный режим.

в полноэкранном режиме судя по всему, освещение ярче, чем в окном,

А qf какой при этом? ЕМНИП выше 120 там включается шейдер, а до 120 - без шейдера. В полноэкранном qf будет ниже за счёт размазывания того же быстродействия на бОльшую площадь.

при "откате" сферы и фон почему-то моргают в течении первых нескольких секунд.

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

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

Re: Cheb's Game Engine

Сообщение скалогрыз » 02.09.2015 17:08:58

Cheb писал(а):Вообще, если можно, запустить дебажную версию, а потом лог в студию.

интересное явление. Иногда восстановление точки не прокатывает, и останавливается на гордом "Загрузка 8/9"
логи прилагаю.
Вложения
logz.7z
(53.56 КБ) Скачиваний: 1138
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 02.09.2015 17:22:34

Вложения

Спасибо :)

Иногда восстановление точки не прокатывает, и останавливается на гордом "Загрузка 8/9"

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

Re: Cheb's Game Engine

Сообщение runewalsh » 02.09.2015 17:39:33

Да, кстати, у меня тоже загрузка повисла в самый первый раз, воспроизвести не удалось.
>ロージン
Это «канифоль». Если хочешь loading, ローディング, а лучше что-нибудь пооригинальнее, как в Тохо сделано «Girls are now (praying / preparing / чотам)...».
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 02.09.2015 17:54:42

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

Re: Cheb's Game Engine

Сообщение скалогрыз » 02.09.2015 17:56:25

Cheb писал(а):При парсинге лога мозг опух, пришлось отложить до завтра.

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

Добавлено спустя 11 минут 34 секунды:
runewalsh писал(а):Первое — сплеш, да? Не надо так пользователей пугать. Пылью веков подавятся ещё.

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

Re: Cheb's Game Engine

Сообщение runewalsh » 02.09.2015 18:24:04

скалогрыз
Я об окошках Win9x.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 05.09.2015 01:53:15

По отзывам трудящихся я обнаружил многия говнокоды. Я их давил, давил, давилдавилдавил! :twisted:

Подробнее расскажу с выкладом результатов и отвечу на комментарии завтра. Сегодня мозг опух от стахановского труда. :shock:

Добавлено спустя 19 часов 58 минут 51 секунду:
Сражался с говнокодами аки Лаокоон со змиями. Довёл до состояния когда игровой модуль гарантированно падает.
Мозг опух. Продолжу завтра.

Добавлено спустя 14 часов 11 минут 39 секунд:
Обновил:
http://chebmaster.com/downloads/chentrah_test019.zip

ставбте по чистому, там куча исходников была переименована. Порядок наводил в этой авгиевой гаврюшне.

Добавлено спустя 22 минуты 8 секунд:
Перелопатил системные меню и обработку исключений.
Заметьте, что у этой версии режим разработчика по умолчанию выключен, и она показывает скример об ошибке вместо синего экрана смерти (там ещё мой аватар должен прилетать !внезапно!, шмякаться об экран и сползать из поля зрения. Потом доделаю :mrgreen: )

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

скалогрыз писал(а):очевидно, нужна утилита просмотра лога,

Не. Офонарел от того, какие коленца говнокод выкидывал, и повис при попытке придумать, как это исправить :mrgreen:

Иногда восстановление точки не прокатывает, и останавливается на гордом "Загрузка 8/9"

Весьма элегантный дедлок при актуализации ресурсов :oops:
До этой части руки пока не дошли, буду перетряхивать всерьёз и с песней.

Короче, ресурсы (assets) делятся на два вида: обязательные (necessary) и необязательные (optional). Пока все обязательные не будут актуализированы, модуль стоит на паузе и отображает индикатор загрузки. По идее, в таковых должны быть только нижние лоды, чтобы игра начиналась как можно сразу, а потом в фоне подгружала текстуры нормального разрешения (идею я честно скоммуниздил у Unreal Engine).
Но! Необязательные ресурсы начинают актуализироваться только когда обязательных не осталось. А ресурсы могут зависет друг от друга и ждать друг друга. Например, картинка (точнее, её фоновая задача) ждёт файловый менеджер, а файловый менеджер ждёт пока пропарсятся все pk3 файлы.
В данном случае каким-то образом получалось, что текстура (обязательная) ждёт картинку (необязательную) - и здравствуй, жопа, дедлок. :oops:

при "откате" сферы и фон почему-то моргают в течении первых нескольких секунд.

Вы таки не поверите, какой *страшный* говнокод там обеспечивал этот эффект "мгновенное зачернение с последующим плавным проявлением". Причём, размазанный вдоль всей программы, с частями в игровой DLL. Переделал с глобальной переменной на функцию API матки, и добавил пару костылей (в частности, пропускается первый SwapBuffers после начала затемнения)

в полноэкранном режиме судя по всему, освещение ярче, чем в окном,

Это обман зрения. Кубмапа очень тёмная, теряется на фоне соседних белых окон.

P.S. При отключённом режиме разработчика сообщения консоли не показываются на экране, пока не включишь её (ScrollLock). А механизм "всплывающих уведомлений" я пока не сделал.

Добавлено спустя 13 часов 5 минут 46 секунд:
Отчаялся, и с тяжёлым сердцем решил бросить поддержку Windows 98 :cry: :cry: :cry:

Причина: древнедрайверы OpenGL - это глюкавая дыра, которая высосет все мои производительные силы и не подавится.
Сейчас пробовал на целевой машине с Windows XP (98-я упала, лень переустанавливать). И что вы думаете? С детонатором 93 от 2006-го сказало: а OpenGL 2.1 - где? Переставил на детонатор 165 от 2007-го. Вроде, бы 2.1.1, да? А вот хрен. Сказало: а GL_ARB_framebuffer_object - где?
Нет, там есть GL_EXT_framebuffer_object, но я прикинул разницу между ними, и сразу приувял :(
Раньше был мой самописный модуль для OpenGL, который пытался прозрачно для программы разрулить эти два расширения, загружая функции не под своими именами. Но писать собственные заголовки OpenGL, ручками добавляя каждую новую функцию когда понадобится - это слишкомм жёсткий мазохизм даже для меня. Перешёл на заголовки, цельнотянутые с фри паскаля. Ну, и как побочный эффект потерял шаманистику с FBO.

З.Ы. Зачем свои заголовки: DLL игрового модуля ничего не знает о DLL OpenGL. Обращается к матке, та уже обращается к оглю и возвращает адрес функции. Смысл: 1. полностью системно-независимый код игрового модуля. 2. Более гибкий механизм загрузки нужной OpenGL DLL. Кажется, в линуксе раньше был с этим эпический геморрой.

Вообще, движок устроен так, что умеет пробовать несколько разных DLL пока не найдёт такую, которая загрузится. В былые времена, в линуксе надо было перебирать:
libGL.so
libGL.so.2
libGL.so.1.2
libGL.so.1
, OpenGL 2.0 могла оказаться под любым из этих имён, в зхависимости от желания левой пятки сосдателей дистрибутива. А также,
libopenal.so
libopenal.so.0
libopenal.so.1
И даже если это всё в прошлом, надо перебирать
xinput1_3.dll
xinput9_1_0.dll
(геймпад Xbox 360), ибо в висте и семёрке по дефолту идёт другая версия, чем накатывается установкой всяческих игр с редистом директикса.
Последний раз редактировалось Cheb 16.04.2018 19:26:52, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

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

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

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

Рейтинг@Mail.ru