Страница 36 из 42

Re: Cheb's Game Engine

СообщениеДобавлено: 23.11.2019 13:54:52
Cheb
стандарт на векторные шрифты был в BGI графике

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

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

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

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

..так, срочно. Научиться пользоваться накупленными экшен-камерами, переставить свою симку в смартфон и научиться пользоваться им, забронировать себе место у окошка пока не расхватали... Что еще?..
Режим дня уже сдвинул: ложусь в 6, встаю в 12.

Re: Cheb's Game Engine

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

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

Re: Cheb's Game Engine

СообщениеДобавлено: 29.11.2019 14:54:59
Alex2013
Cheb писал(а):
в эмуляции стандартного эмуляции тестового вывода на EGA режиме ...

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

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

Re: Cheb's Game Engine

СообщениеДобавлено: 30.11.2019 21:28:03
Cheb
А как тебе Super Vision ?

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


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

..чтоб все так жили.

Re: Cheb's Game Engine

СообщениеДобавлено: 01.12.2019 10:48:24
debi12345
Хм, какие коварные, на нюансах, варианты ответов в тесте "что такое осушение" :mrgreen:

Re: Cheb's Game Engine

СообщениеДобавлено: 01.12.2019 18:57:09
Cheb
..а я не читал, потому что украинского не знаю от слова совсем, а дешифровывать на интуиции было лень :(
Действительно, какие зловеще похожие ответы.

Re: Cheb's Game Engine

СообщениеДобавлено: 01.12.2019 23:08:44
debi12345
Я за наименее зловещий вариант - "с поверхности и из верхнего слоя грунта" ))

Re: Cheb's Game Engine

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

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

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

Re: Cheb's Game Engine

СообщениеДобавлено: 06.12.2019 02:32:09
Cheb
почти классический "неубиваемый"

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

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


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

Re: Cheb's Game Engine

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

Re: Cheb's Game Engine

СообщениеДобавлено: 12.12.2019 02:39:15
Cheb
Окей, смотрите алгоритм на вменяемость:

Диспечер памяти инстансов работает с фиксированными размерами (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;

Re: Cheb's Game Engine

СообщениеДобавлено: 12.12.2019 04:48:25
Alex2013
ИМХО: Перфекционизм + "Магические числа" = "нерабочий код"

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

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

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

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


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

Re: Cheb's Game Engine

СообщениеДобавлено: 12.12.2019 15:05:25
Cheb
А еще базовый "старый код" местами остается "в стратегическом резерве" почти до самого релиза.

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

Это.

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

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

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

Re: Cheb's Game Engine

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

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

Re: Cheb's Game Engine

СообщениеДобавлено: 13.12.2019 00:12:50
Cheb
Я-ХУУУ! :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: