Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение Cheb » 23.11.2019 13:54:52

стандарт на векторные шрифты был в BGI графике

Забыл про эту фичу! Теперь уже не вспомню, почему не пользовался - в универе сделал приблуду для рисования графиков и печати в высоком разрешении на 9-иголочных принтерах (за 3 прохода на строку, с смещением бумаги на 1/3 иголки: никто так не делал, везде печать была в два прохода, хотя у принтеров команда прокрутки как раз шагами в 1/3 иголки оперирует). Но цифры на координатных осях я делал растровым.

в эмуляции стандартного эмуляции тестового вывода на EGA режиме ...

Это... Это что, Turbo Vision... с графикой?! :shock:
Совместить несовместимое. Добиться невозможного. Твой бур реально пронзает небеса!

...З.Ы.
ЙА В ОТПУСГЕ!!! :D :lol: :roll: :P

..так, срочно. Научиться пользоваться накупленными экшен-камерами, переставить свою симку в смартфон и научиться пользоваться им, забронировать себе место у окошка пока не расхватали... Что еще?..
Режим дня уже сдвинул: ложусь в 6, встаю в 12.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 765
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 28.11.2019 17:28:11

Времени почти нет, до вылета меньше суток. Слегка дострогал парадигму: ускоренные поля будут не фиксированными намертво под задачи, а ресурсами, которые можно выделять и освобождать (кроме нулевого, коий зарезервирован под флаги). В сериализации ускоренные поля по прежнему не участвуют (кроме флагов - впрочем, те вручную в поток пихаются).
Для эффективности надо будет (потом, когда взлетит) группировать объекты в менеджере памяти не по размерам, а по классам хитрым образом. Например, у TBearAss и потомков - отдельный пул. Тогда ускоренные поля гораздо эффективнее сгруппируются.

Как результат - снялось искусственное ограничение на 4 вложенных обходчика. На сколько ускоренных полей (31 шт.) хватит - столько и можно накрутить.
Потому что выходит, что обходчику десериализации может понадобиться дочерний обходчик подсчёта ссылок, чтобы удалить пропущенные при чтении объекты (может случиться, если в текущей версии было удалено поле, где была ссылка на него: "пропустить" означает "прочитать, но засунуть в отдельный массив вместо поля, которого нету"). Но сначала надо убедиться, что на такой объект нет ссылок с других мест.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 765
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Alex2013 » 29.11.2019 14:54:59

Cheb писал(а):
в эмуляции стандартного эмуляции тестового вывода на EGA режиме ...

Это... Это что, Turbo Vision... с графикой?! :shock:

Это еще что !
Turbo Vision с графикой ? Ха! А как тебе Super Vision ?
ИзображениеИзображение
Хотя это уже вторая половина 90-х но под виндовс почти никто ничего не писал (Огромный парк 286-х а то и Искр1030 не располагал к излишествам. Первые примитивные поделки в 16-ти разрядном BP а позже и Дельфи не в счет ) Ситуация вообще была довольно забавная: даже в игровых компьютерных клубах до начала нулевых играли в основном в Дос игры да обычно уже "в окошках" но игры вполь до эры 3д ускорителей уровня Riva TNT1-2 в основном были сугубо досовские ( Даже "первое пришествие" ВиАр в виде шлема VFX1 было еще в дос-эпохе ) .
Alex2013
долгожитель
 
Сообщения: 1598
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 30.11.2019 21:28:03

А как тебе Super Vision ?

Да... Воистину. Вот это - фреймворк. Не то,что нынешнее племя.
Я во времена оны сделал только приложение к лабораторным по теории связи - причём, не целиком, а только нормальный интерфейс к уже имевшейся расчётной части. ИЧСХ тоже для ДОС (VGA 640х480х16, ЕМНИП). А недавно меня по приколу стали искать гуглом - и нашли, как соавтора методички к лабораторным под авторством того профессора, которому я это делал. Причём, за 2003 год - а закончил я МИИТ в 2000-м. ЛОЛ :lol:


З.Ы. Основная DLL Чентры по прежнему не компилируется. Возможно, обстановка не способствует кодингу?
chentrah_nov30.jpg

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

Re: Cheb's Game Engine

Сообщение debi12345 » 01.12.2019 10:48:24

Хм, какие коварные, на нюансах, варианты ответов в тесте "что такое осушение" :mrgreen:
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5330
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Cheb » 01.12.2019 18:57:09

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

Re: Cheb's Game Engine

Сообщение debi12345 » 01.12.2019 23:08:44

Я за наименее зловещий вариант - "с поверхности и из верхнего слоя грунта" ))
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5330
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Alex2013 » 02.12.2019 03:47:21

Там еще и очень хитрая система оценок с учетом времени ответа и коэффициента сложности + полный лог на весь тест + само сбой все перемешивается ( и варианты ответов и вопросы в теме причем каждый раз показываются НЕ ВСЕ ВОПРОСЫ - есть тупо запомнить последовательность и сами вопросы и ответы не выйдет + можно вопросы пропускать (ответы "на обум" то же вычисляются, так что лучше если не знаешь пропускать ) + рабочая база вопросов шифруется )

За то есть "режим обучения" с показом верного ответа и режим "самостоятельной работы" - ввел свои данные и вперед ! (но лог и запись результатов в бд капают и перекрыть никак не выйдет )

Но сами варианты ответов достаточно забавны например тут качестве одного из ответов ответа идет "повышение плодородия... БОЛОТ " :mrgreen:
Зы
Это наверное единственная программа где у меня есть "пароль разработчика "(почти классический "неубиваемый" если даже кто-то левый захочет и сможет изменить исходник ) причем чтобы он сработал нужно нажать не Enter... а ЕSC! 8)
Alex2013
долгожитель
 
Сообщения: 1598
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 06.12.2019 02:32:09

почти классический "неубиваемый"

Типа секретного iddqd, да?..
Считайте, что моё восхищение взорвалось, как скаутер в "Дрэгонболе", которым пытались померить чей-то уровень запредельной крутизны.

..я гребу и рефакторю, гребу и рефакторю, а Чентра всё ещё не компилируется.
Тоже извращение. Чичен-Ица - ладно, меня бы оттуда привезли в виде хорошо прожаренной тушки. Но мог бы взять тур на Исла Мухерес или тот же Косумель... Но нееет, один извращенец сидит и кодит, вчера даже в море поплавать забыл.
chentrah_dec05.jpg


Ладно, хоть крутую шляпу купил - не на уровне "Гильгамеш Вульфенбах - вумный парниша", конечно, но тоже неплохо.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 765
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Alex2013 » 06.12.2019 05:33:53

У мну примерно те же проблемы ... Мучаю ОpenVr и OculusVR . "а каменный цветок все не выходит и не выходит".... :roll:
Блин самое обидное что мне от ОpenVr (или OculusVR) всего то ничего нужно, прсто вывести на вр-шлем свой "виртуальный экран" (есть куча способов сделать это через внешний софт, однако это будет грызть и без того "погрызенный" (WMR-софт+SteamVR-софт+ ОpenVr (или OculusVR)) и "битый молью комп" (где WMR по идее вообще работать недолжен ).
Alex2013
долгожитель
 
Сообщения: 1598
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 12.12.2019 02:39:15

Окей, смотрите алгоритм на вменяемость:

Диспечер памяти инстансов работает с фиксированными размерами (28 штук в диапазоне от 64 до 16384 байт). Для каждого размера выстраивается очередь-карусель из 128-килобайтных пулов: выделение идёт в первый пул очереди, пока тот не заполнится, после чего он выпинывается из очереди в астрал. Первым становится следующий, или создаётся новый, если очередь кончилась. Если ранее заполненный пул становится недозаполненным за счёт деаллокации - он возвращается в очередь, дописывая себя в её конец. Если пул становится пустым, и он - не первый, то он удаляется, его место в очереди схлопывается.

(там ещё один уровень выделения памяти под сами пулы, который здесь не рассматриваем).

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


..до компилируемости - по прежнему полтоны методов, от которых пока есть одни заголовки..

З.Ы. Сами пулы не обсуждаются: они ведают ускоренными полями, жизненно важными для работы всего цирка с клоунами, и выровнены так, что объект получает инстанс своего пула, просто очистив младшие 17 бит Self. Это важно, т.к. для обращения к пулу не нужно лазить к памяти по Self и кеш остаётся девственно чистым.

Код: Выделить всё
//раньше за флагами лазило в поле CpsMask, лежащее прямо в инстансе,
//что было душераздирающе неэффективно

function TChepersyObject.GetFlag(bit: integer): boolean;
begin
  Assert((bit >= 0) and (bit <= 31), 'Invalid flag index=' + IntToStr(bit));
  Result:= 0 <> (GetMask and (dword(1) shl bit));
end;

function TChepersyObject.GetMask: dword;
var
  i, cidx: integer;
  chunk: TChepersyMemoryManagerChunk;
begin
  chunk:= GetMemoryManagerChunk;
  cidx:= chunk.GetChunkInd(Self);
  Result:= chunk.AcceleratedField[CPS_AFK_MASK, cidx];
end;

function TChepersyObject.GetMemoryManagerChunk: TChepersyMemoryManagerChunk;
begin
  ptruint(pointer(Result)):= ptruint(pointer(Self)) and CpsMMChunkAddrMask;
end;

function TChepersyMemoryManagerChunk.GetChunkInd(o: TChepersyObject): longint;
begin
  Result:= (
    (Self.GetChunkInd(ptrint(pointer(o)) - ptrint(pointer(Self))))
    shr CpsMMAllocGranPoT //6, получаем смещение в 64-байтных кусках
  ) div f_SizeGran; //размер ячейки данного пула в 64-байтных кусках
end;

function TChepersyMemoryManagerChunk.GetChunkInd(delta: longint): longint;
begin
  Result:= (delta shr CpsMMAllocGranPoT) div f_SizeGran;
end;

function TChepersyMemoryManagerChunk._GetAccField(
                                    kind: TCpsAccFieldKind; idx:integer): dword;
begin
  Assert((idx >= f_IdxLow) and (idx <= f_IdxHigh)
         , 'index out of bounds in TChepersyMemoryManagerChunk._GetAccField()');
  if not Assigned(f_Acc[kind].values) then Exit(0);
  if 0 = (f_Acc[kind].mask[idx div 32] and (dword(1) shl (idx mod 32)))
    then Exit(0); // also guarantees no reading past arrays end
  Result:= f_Acc[kind].values[idx];
end;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 765
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Alex2013 » 12.12.2019 04:48:25

ИМХО: Перфекционизм + "Магические числа" = "нерабочий код"

1) По Перфекционизму : Извини, в суть конкретной проблемы, сходу не вник. Однако, что-то похожее (то есть многоуровневую и заведомо сложную логику ) я делаю только после того как есть хоть что-то рабочие, и только если "первое приближение" сильно не устраивает меня или в плане функциональности или в плане быстродействия .

А еще базовый "старый код" местами остается "в стратегическом резерве" почти до самого релиза. Суть приема в том, что если где-то, что-то начинает вести себя "подозрительно" то я могу окатить сложные решения, до уровня почти полного примитива который однако ЗАВЕДОМО РАБОТАЕТ. Таким образом при тестировании очередного расширении кода, я могу исключить почти все "лишнее сущности" .

То есть я вынужденный пользователь идей "прогрессивного программирования " (по аналогии с прогрессивным JPG-сжатием, суть котрого в постепенном увеличении качества картинки по мере ее загрузки ) По чему вынужденный ? А потому, что перфекционизм( в виде красивой идеи сходу написать, идеальный код со всем функционалом ) моем случае почти не работает . Моя проблема в том, что при попытке сразу писать код "как надо", я достаточно быстро( как говорят авиа диспетчеры ) "теряю картинку"

Разумеется, подобный способ решения проблем не панацея, а иногда вообще здорово мешает очередным итерациям рефакторинга . Но как можно убедится по моим проектам на этом фруме ВСЕ МОИ СБОРКИ непросто компилируется но и что-то делают (пусть иногда и с багами, глюками и явными тормозами ) .


2) По "магическим числам"
Разумеется выражение вроде (dword(1) shl bit)) КРАСИВЫ, а иногда необходимы но ИМХО лучше их избегать или хотя бы заменять специфически названой константой . И не из за призрачного ускорения, а просто чтобы не путаться.
Зы
Сказать большего по приведенному коду без понимания его логики трудно , а что бы понять логику (ИМХО) нужно значительно больше информации.
Alex2013
долгожитель
 
Сообщения: 1598
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 12.12.2019 15:05:25

А еще базовый "старый код" местами остается "в стратегическом резерве" почти до самого релиза.

Это я пошёл в "последний и решительный", запиливая фичу, которой грезил в 2010-м, но трусил реализовать из-за сложности.
Нууу... Я наверно должен для отладки имплементировать тупую затычку, где вместо ускоренных полей будет массив из 32-х dword'ов в каждом объекте. Да, идея стоящая, возьму на вооружение.
Но смысл имеют именно ускоренные поля, как главная киллер-фича системы.
а иногда вообще здорово мешает очередным итерациям рефакторинга

Это.

выражение вроде (dword(1) shl bit)) КРАСИВЫ, а иногда необходимы

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

Вкратце, ускоренные поля - это до 32-х (что перебор) dword'ов, хранящихся вне инстанса, сгруппированных для всех инстансов пула. Что жизненно важно чтобы не тревожить память самого инстанса при обходе дерева, а также для имплементации моей модели мультиплеера: лагокомпенсация, прикрученная к дедовскому локстепу, требует расслоения физики на слои, которые тикают с разной скоростью, обгоняя друг друга - и я сиииильно подозреваю, что существующие ММО игры работают на схожем принципе: вспоминаем глюки рандомными дисконнектами из WoW игроков с определённой моделью атлонов, в которых оказался нарушен стандарт на побитовую точность вычислений с вещественными числами в каких-то редких комбинациях чисел.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 765
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 12.12.2019 20:51:53

Alex2013 писал(а):Разумеется выражение вроде (dword(1) shl bit)) КРАСИВЫ, а иногда необходимы но ИМХО лучше их избегать или хотя бы заменять специфически названой константой

Учитывая, что bit — не константа, X and (1 shl bit) — самое что ни на есть идиоматичное и немагическое извлечение bit-го бита из числа X. Как ты это собираешься сделать по-другому, через const Masks: array[0 .. 31] of dword, что ли? Это не красивее и потенциально медленнее (у меня на 10%).
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 434
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 13.12.2019 00:12:50

Я-ХУУУ! :D ОНО СКОМПИЛИРОВАЛОСЯ! :D И даже подёргивается! 8)

Going to load module #0
[frame #2, 22:58:07.035, Чт, 12.12.2019]
Going to load module #0
[frame #4, 22:58:07.041, Чт, 12.12.2019]
Chentrah hub menu version 0.00.4758 for Win32-i386,
compiled at 22:57:44 on 2019/12/12 using Free Pascal 2.6.4.
Line info...
found 42069 Stabs and 929 Kbytes of strings. Base 0A9E0000h, image base 10000000h.
[frame #5, 22:58:07.116, Чт, 12.12.2019]
AC power.
[frame #7, 22:58:07.150, Чт, 12.12.2019]
(thread #0) <----=* ERROR! ---- (look below for details) *=---->
found 48142 Stabs and 830 Kbytes of strings. Base 00400000h, image base 00400000h.
================== Error message: ==================
Module logic thread #0:
Mother has passed an unhandled exception to the module in thread Module logic thread #0
Call stack:
<not found>
SEH caught C0000005h, Access Violation,
Attempt to read from the NULL address
mo_cps_memman.inc:535 (TChepersyMemoryManager.CreateNewBlock) in _hub.dll
====================================================
THE MODULE HAD BEEN UNLOADED.
PRESS "SPACE BAR" TO RESTART THE MODULE,
"F12" + "BACKSPACE" TO CHOOSE ANOTHER MODULE
OR "ESC" TO EXIT THE PROGRAM.


Учитывая, что bit — не константа,

Воистину, у меня там типа
Код: Выделить всё
const
  ASSET_MASK_BIT = 19;
  ASSET_MASK = dword(1) shl ASSET_MASK_BIT;

и
Код: Выделить всё
Self.SetFlag(ASSET_MASK_BIT);// в девичестве CpsMask:= Self.CpsMask or ASSET_MASK;


и специальные классы-обходчики (в девичестве - процедура обхода со специальными колбеками), позволяющие выковырять объекты из дерева по маске, как изюм из булки:
Код: Выделить всё
type
  TAssetFinder = class(TSimpleAbstractTraverser)
  public
    function OnNewlyEncountered(var o: TChepersyObject): boolean; override;
  end;

  function TAssetFinder.OnNewlyEncountered(var o: TChepersyObject): boolean;
  begin
    if Assigned(o) //TChepersyObject(p).Exists()
      and (o is TGenericAsset)
      and TGenericAsset(o).Actualized
    then begin
      TAssetManager.ToStore.Add(TGenericAsset(o));
    end;
    Result:= Yes; // continue working
  end;
{
  procedure FindAssetsWalkProc(p:pointer);//o: TChepersyObject);
  begin
    if Assigned(p) //TChepersyObject(p).Exists()
      and ((TChepersyObject(p).CpsMask and ASSET_MASK) <> 0)
      and (TChepersyObject(p) is TGenericAsset)
      and (TChepersyObject(p) as TGenericAsset).Actualized
    then begin
      TAssetManager.ToStore.Add(TChepersyObject(p) as TGenericAsset);
    end;
  end;
}
  procedure WalkSessionToListAssetsToStore;
    { Is used when not really saving the session (like in the case of a
        rollback). Otherwise the saving routine itself serves this role. }
  var
    t: TAssetFinder;     
  begin
    if Mother^.Debug.Verbose then AddLog(
                       '  Parsing the data tree to mark assets for storing...');
    //if not CpsWalkGraph(Module.Logic, @FindAssetsWalkProc)
    //then begin
    try
      t:= TAssetFinder.Create(Module.Logic, ASSET_MASK);
      t.Go;
      FreeAndNil(t);
    except
      Mother^.State.StateTrashedRestartRequired:= Yes;
      Die(GetChepersyErrorLog());
    end;
    if Mother^.Debug.Verbose then AddLog(
                       '  Ok, found %0.', [Length(TAssetManager.ToStore.List)]);
  end;


Добавлено спустя 3 часа 30 минут 49 секунд:
Вы таки не поверите: после исправления одного (одного!) ляпа, оно запустилось и пошло!
И... И я взвыл в тоске, вспомнив, что перед тем, как зарылся в рефакторинг СУБД, я полностью развинтил и перепахал механизм служебного гуя системы переключения модулей, намереваясь выпилить костыльные костыли и переделать эти меню с нуля на обычном гуе, оформив, как служебный игровой модуль. А перед этим развинтил и перепахал обычный гуй, намереваясь устроить его рефакторинг.

И теперь движок рисует серый квадрат Малевича, на внешние раздражители не реагируя. А Я ЗА ЭТИ ДВА ГОДА ЗАБЫЛ, КАК ОНО ТАМ УСТРОЕНО, И ЧТО ВООБЩЕ СОБИРАЛСЯ ДЕЛАТЬ!!! :cry: :cry: :cry: :lol:

Скриншот: отладочный вывод всех 28 фиксированных размеров диспетчера памяти
Изображение

P.S. Цитирую свой пост от 9 октября 2018-го:
на следующие выходные добью перетрях системы гуя и займусь оконным менеджером для линукса. Надо, наконец, обеспечить полноэкранный режим и захват мыши.

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

Пред.След.

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

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

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

Рейтинг@Mail.ru