Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение debi12345 » 20.01.2020 18:31:02

А если осилю таки отдельные запираемые пулы в менеджере памяти для отдельных слоёв... (делаешь память конкретного слоя только для чтения

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

Re: Cheb's Game Engine

Сообщение Cheb » 23.01.2020 20:40:17

Поразившись, что ANGLE так страшно тормозит (деваять fps! девять!) обнаружил у себя позорнейший косяк в коде. Гуйный класс TBackground (монотонный серый задник позади всего) плодился и размножался при каждой загрузке сессии, и его уже был почти легион :oops:

Добавлено спустя 14 часов 25 минут 48 секунд:
Картина маслом "приплыли" :(
На малине, исключения в потоке в длл не ловятся, пробамбливают до основного потока экзешника-матки, который затем падает при попытке вывести бектрейс.
Код: Выделить всё
try
sleep(2000);
AddLog('Едриии..');
byte(nil^):= 0;
except
Die('..ить.');
end;

даёт
[frame #64, 09:38:19.903, Fri, 24.01.2020]

(thread #0) Едриии..
72431C34h is /home/raid2000/chentrah/temporary-files/bin/lib_hub-armv7l.so, base 722BF000h
..file "/home/raid2000/chentrah/temporary-files/bin/lib_hub-armv7l.zstabs", exists=True..

[frame #76, 09:38:20.318, Fri, 24.01.2020]
found 47112 Stabs and 863 Kbytes of strings. Base 722BF000h, image base NIL.


А должно было зажурналировать "ить" в том же потоке №0, затем отработать всю цепочку аварийного завершения.

Добавлено спустя 18 минут 49 секунд:
З.Ы. А нет, снова ССЗБ. В линуксе таки нужен собственный обработчик сигналов чтобы перехватывать и поднимать исключения в потоках длл. А я (когда-то давно) убедился, что исключения в линуксе ловятся без бубна (в основном потоке) - и на этом успокоился, закомментировав начала хака исключений с примечанием "нафиг не нужно".

Вывод: линуксовая версия ещё сильнее откладывается.
Малина потерпит. Я теперь знаю на практике, что всё на ней собирается, GLES рисует, DLL модуля грузится и подёргивается - и уверен, что с недостатками разберусь в своё время.

Добавлено спустя 1 час 6 минут 12 секунд:
З.Ы. Если интересно, это эти вот поросятки (в фпц 2.6.4)
SignalToRunerror
HandleErrorAddrFrame
RunErrorToExcept
, наивно пытающиеся поднять по адресу исключения класс исключения... определённый в екзешнике-матке. Как при этом должно расколбасить длл-у, для которой эта штука - даже не наследник её длл-льного TObject, а вообще неведома зверушка - то никого не колышет.
Буду копипастить с внедрением моего собственного механизма GetExceptionState().

Добавлено спустя 5 часов 46 минут 26 секунд:
Для сравнения, как оно должно работать (отладочная версия для вин32):
(thread #0) Едриии..
(thread #0) <----=* ERROR! ---- (look below for details) *=---->
(thread #0) CONTROL LOGIC THREAD CRASH!
(thread #0) Execute ended
The thread manager found that thread #0 has crashed. Processing its error messages...
00487462h is D:\chentrah\debug-chentrah.exe, base 00400000h
..file "D:\chentrah\debug-chentrah.zstabs", exists=False..
..file "D:\chentrah\modules\chentrah\bin\lineinfo\debug-chentrah.zstabs", exists=True..
found 48352 Stabs and 830 Kbytes of strings. Base 00400000h, image base 00400000h.
The thread manager found that one or more threads have crashed. Will die in their stead now.
Found a screened exception, going BSOD...
================== 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 Vilation,
Attempt to write to the NULL address
mo_threads.pp:758 (TDummyThreadManager.InitializeChepersy) 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.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 31.01.2020 00:54:23

Бооооль. Мой мосх :cry:
Точно помню, год назад я отлаживал хитровывернутую систему передачи фокуса ввода для клавиатурной навигации по "резиновым" таблицам с произвольным расположением элементов. Весь гуй основан на этих резиновых таблицах (дочерний элемент может занимать несколько строк или столбцов, отдельные строки и столбцы могут скрываться, всё имеет хитровывернутые формулы масштабирования). А потом, значит, я поверх этого пытался приторочить костыль для прокручиваемых списков произвольной длины, но посередине ушёл в рефакторинг.
Хоспади, я же всё позабыл. А оно нифига не работает и глючит по странному. Как теперь понять, что тут значит что?
chentrah-mindfuck.png


И это после тгго, как я взорвал мосх, утрясая сюжетный паззл для 15..17й глав "Танцуй-танцуй заварушки".
.. можно я потом, а?.. По работе тоже надо хитровывернутое :cry:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 01.02.2020 19:17:35

Переделал формат списков файлов в конфиге: вместо доисторического, где каждый элемент надо было задавать, как ключ, к имени которого добавлялось "_0", "_1" и так далее - теперь обычные списки, разделённые точкой с запятой. Попутно исправил баг в своей функции Explode(): не делала trim() последнего элемента в массиве.

Добавлено спустя 23 часа 29 минут 13 секунд:
Наконец-то почесался посмотреть ворнинги, тысячи их.
Волосы на голове зашевелились.Изображение
Стопицот случаев Local variable "<имярек>" does not seem to be initialized, где рекомая переменная - указатель или массив, с которым идёт активная работа по принципу "пока Assigned()".Изображение
Как оно вообще выполнялось-то? :shock: Это работать вообще не должно было Изображение

Добавлено спустя 10 минут 55 секунд:
В частности,
Код: Выделить всё
  procedure CollateWarningsFromAllThreads;
  //ONLY call this from the main thread
  var
    pes: PMotherSehState;
    FoundAny: boolean = false;
    tn: Utf16String;
    i: integer;
    event, main_thread_event: PDyingEventRec;
  begin
    pes:= @Mother^.ExceptionState;
    while Assigned (pes^.Next) do begin
      pes:= pes^.Next;
      if pes^.events[0].eType <> deke_None then begin
        FoundAny:= true;
        break;
      end;
    end;

    //just a reminder: this shit is displayed backwards,
    //  from the last lines to the first!

    if not FoundAny then exit;
    with Mother^.ExceptionState do begin
      pes:= @Mother^.ExceptionState; // the one for the main thread

      if pes^.events[0].eType <> deke_None then AddTextDyingEvent(pes, RuEn(
          #10#13'Основной поток:',
          #10#13'Main thread:'
      ));

      main_thread_event:= @events[0];
     
// ОХЩИ, здесь должон был быть main_thread_event, а не event
// В результате оно не только гуляло по мусорным указателям,
// но и затирало список основного треда вместо того, чтобы дописывать ему в конец!
      while Assigned(event) and not (event^.eType in [deke_None, deke_Terminator])
      do begin
        inc(event);
        if event^.eType = deke_Terminator then event:= nil
      end;

      while Assigned (pes^.Next) do begin
        pes:= pes^.Next;
        if pes^.events[0].eType = deke_None then continue;
        event:= @pes^.events[0];
        while Assigned(event) and Assigned(main_thread_event)
          and not (event^.eType in [deke_None, deke_Terminator])
          and not (main_thread_event^.eType in [deke_Terminator])
        do begin
          MOVE(event^, main_thread_event^, sizeof(event^));
          inc(main_thread_event);
          if main_thread_event^.eType = deke_Terminator
                                                  then main_thread_event:= nil;
          inc(event);
          if event^.eType = deke_Terminator then event:= nil
        end;

        if pes^.ThreadTitle <> ''
          then tn:= pes^.ThreadTitle + ':'
          else tn:= RuEn('Поток ID=', 'Thread ID=') + IntToHex(pes^.ThreadId, 8) + 'h :';
        AddTextDyingEvent(@Mother^.ExceptionState, tn);

        ClearDyingEvents(pes);

      end;
    end;
  end;

- а я ещё думал, чего у меня обработка ошибок работает через анус :oops:

Добавлено спустя 32 минуты 55 секунд:
З.З.Ы. Приведённый кусок кода разрабатывался как особо безопасный, для использования внутри системных колбеков SEH / SIGSEGV, ради чего не использует никаких строк, никаких аллокаций, только пред-выделенные, пред-форматированные буфера с затычкой-терминатором в конце. :lol:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 07.02.2020 13:58:50

Наконец-то нашёл текущий снапшот библиотеки Vampyre Imaging с последними исправлениями , он хитро запрятан по адресу https://sourceforge.net/p/imaginglib/co ... ault/tree/ (наверно, чтобы никто не догадался). На главной и везде-везде-везде ссылки ведут на 0.26.4, свежак 2009-го года, которым я пользовался до сих пор и из которого столько пыли выбил, патчя его сам (имела свой аналог ptruint, но объявляла его, как cardinal, для примера).

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

Гуй требует переосмысление в парадигме обработки передачи фокуса контролам. Фокус передаётся по движению мыши, которое кодируется, как нажатие клавиши с кодом 0, передаётся верхнему элементу дерева, который пихает его по очереди всем детям, в рект которых укладывается указатель мыши (X, Y кладутся в глобальные переменные процедурой, рассылающей ивенты ввода), а те - своим детям, и так - пока не упрётся в элемент, который ответит "я обработал, не пихайте дальше". Некоторые элементы при этом могут взять себе фокус ввода, для чего обращаются к корню дерева "найди текущего владельца фокуса и отними его".

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

Re: Cheb's Game Engine

Сообщение Cheb » 09.02.2020 01:17:37

Разгребаю ГОВНИЩЕ в гуйных классах. Слов нет, только "но я же не пью!" и "а можно мне такой травы?" :oops:
Начинаю тихо бояться себя.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение debi12345 » 09.02.2020 16:23:37

Начинаю тихо бояться себя.

А я чаще смеюсь на до собой - "Нужно быть полным дятлом, чтобы вторая итерация проекта была в 4+ раз проще и компактнее чем первая, причем это повторяется из проекта в проект". Вот что, кроме дедлайнов вынуждающих выдать "результат", мешает сразу продумывать и делать проекты на уровне 2-х итераций ? Неужели какие-то демоны ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5535
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Cheb » 09.02.2020 23:05:08

Я к конкурсу пытался успеть :oops:

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

Re: Cheb's Game Engine

Сообщение Cheb » 12.02.2020 11:43:29

Долго чесал межушную кость, пытаясь понять, почему не работает наследование. Метод виртуальный?.. Виртуальный. У потомка переопределён? Переопределён. Даже запись в лог в него вставил. Кликаю по кнопке. Метод потомка? Не, не слышали. Срабатывает чистый метод предка.
Потом копал вглубь. Оказалось, система сообщений у меня в гуе построена на строковых идентификаторах с использованием MethodAddress.
И так получилось, чтоя забыл, что методы-обработчики надо обхявлять, как published, и засунул его в public. При сборке - нуу, может и упоминается где-то среди 240 вонингов . При выполнении - молча находит метод предка.

Пятидюймовые дискеты на полке уже, кажется, обзавелись trollface'ом. Страшно чешется узнать, что же на них. Уж лет пятнадцать собираюсь, но никак не могу найти, куда я дел, мать его, пятидюймовый дисковод. Точно помню, что из ретро-машины в своё время вывинтил, заботясь, чтобы не запылился. И где! Где теперь эта сволочь! Периодически совершаю набеги на разные шкафы и начинаю рыть. Сегодня нашёл: фотоаппарат ФЭД-4 россыпью (в молодости пытался чинить заклиненную шторку), разбитый фотоаппарат "Смена", усройство масштабно-координатное "мышь" для ДВК3/ДВК4 в заводской упаковке с инструкцией и принципиальной схемой но без шарика, робота, которого сделал в детстве из механизма от будильника (ездил по нарисованной чёрной линии), 12-миллиметровую железную дорогу в ужасном состоянии, процессор Z80 с погнутой ножкой, бумажный автомобильчик, какие любил клеить в детстве, набор шашек, фоторезистой 1977 года изготовления, пачку 3-дюймовых дискет с мамиными рабочими материалами, видеокамеру VHS-C без аккумулятора...
НУ ГДЕ ЭТА ПЯТИДЮЙМОВАЯ СВОЛОЧЬ ПРЯЧЕТСЯ!!!
У меня даже не один был, кроме основного 1.2-мегабайтного - ещё штуки четыре 360-киобайтных советтских должно быть, выковырянных из "искр 1030".
:evil: :evil: :evil: :evil:

Добавлено спустя 14 часов 6 минут 23 секунды:
Наконец-то. Все глюки и непонятки позади, осталось сидеть и выстругивать. Основы меню работают почти идеально, не хватает только автоповтора, без которого неудобно прокручивать длинные списки.

chentrah-ledtronulsya.png


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

Пред.

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

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

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

Рейтинг@Mail.ru