Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение Cheb » 11.07.2021 21:14:58

debi12345 писал(а):и все эти бзыки - именно от файловой системы

Воблин :( из за такой мелочи... А я её любил.

По проекту: напрочь заьбыл, что собирался делать, прошёлся по коду свежим взглядом...
Я ДИБИЛ :evil:

Ну как... Как можно было бросаться юзать фичу, не убедившись в её надёжности?
threadvar - страшное гуано, все подводные камни записываются к ней на мастер-класс.
Потому что работать не то, что нормально - просто не падая - оно будет только в том исполняемом модуле, для RTL которого родное, и в котором создаются потоки, которые в своих методах вызывают инициализацию для своего потока.
Берём два, их за ногу (или более) модулей, потоки, создаваемые и там и там... Хряп-ии-хряп-ииихряп-дап-ди-хряп!

Только собственный TLS, только созданный своими руками.

Следствие: план расширить Чеперси на работу в разных потоках накрывается... Чем-то неприличным.
И дальше, как говорится,
-- Ну что это? Комета?
-- Хуже! он сказал: "думайте сами"!

Как Чеперси то размножить?
а) оформить её в виде инклюда чтобы вызвать дублирование её кода
б) грузить одну ДЛЛ несколько раз (копируя для этого) чтобы вызвать дублирование кода

В общем, оказалось, что благие намерения (запихать все модули в екзешник, отказавшись от ДЛЛ кроме отладки) создал в 10 раз больше работы, чем создание костыля для линукс, заткнувшего бы баг в RTL (исключения в потоках в ДЛЛ не ловятся, блоки try не работают), которого я пытался избежать.
От фпц 2.6.4 я всё равно откажусь (уже скоро), аналогичную проблему в винде уже решили (с версии 3.2). А может, и для линукса решили: в дебиан упорно держится версия 3.0.4.

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

Re: Cheb's Game Engine

Сообщение Alex2013 » 11.07.2021 21:46:24

О это "чудное чуство" посещает меня с завидной регулярность... Свежий приступ "посыпания головы пеплом" был буквально на днях . Но тупо взял тетрадь да расписал свой "запор в проекте" по шагам и обнаружил сразу несколько вариантов возможного решения. Но нескольким днями ранее облом был еще более жуткий смотришь и думаешь ВОТ ЧЕМ НУЖНО БЫЛО ДУМАТЬ чтобы написать ТАКОЕ. ( Когда писал все разумеется казалось "удивительно логичным". )

(Суть прикола если кратко была в расчете "метрики элемента" глобально вместо ее расчета для каждого элемента в отдельности . Причем считал "в основном цикле" и все что нужно было это добавить дополнительные поля в класс... Но нет "дурилку перемкнуло" ! "Дохтор Ватсон ну зачем же огорчать мисс Хадсон " Блин !!!! )
Alex2013
долгожитель
 
Сообщения: 2215
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 12.07.2021 08:51:47

Наткнулся на очень интересного поросёночка в system.inc:

Код: Выделить всё
Procedure HandleErrorAddrFrame (Errno : longint;addr : CodePointer; frame : Pointer);[public,alias:'FPC_BREAK_ERROR']; {$ifdef CPUI386} register; {$endif}
begin
  If codepointer(ErrorProc)<>Nil then
    ErrorProc(Errno,addr,frame);
  errorcode:=word(Errno);
  erroraddr:=addr;
  errorbase:=frame;
{$ifdef FPC_HAS_FEATURE_EXCEPTIONS}
  if ExceptAddrStack <> nil then
    raise TObject(nil) at addr,frame;
{$endif FPC_HAS_FEATURE_EXCEPTIONS}
  Halt(errorcode);
end;


Вот это вот:
raise TObject(nil) at addr,frame;
raise... at? :shock:

Добавлено спустя 9 минут 27 секунд:
аналогично Procedure RunErrorToExcept (ErrNo : Longint; Address : CodePointer; Frame : Pointer); в sysutils.inc:
Raise E at Address,Frame;

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

Re: Cheb's Game Engine

Сообщение Alex2013 » 12.07.2021 11:10:25

А ты вообще уверен что этот код срабатывает ? В LCL полно такого что вызывается только при "очень специальных случаях " то есть почти никогда.
Alex2013
долгожитель
 
Сообщения: 2215
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 12.07.2021 13:27:51

Это не LCL, это RTL на самом глубинном уровне, та часть, что поднимает Run-time error.
А уже та - делает финт ушами "если платформа поддерживает исключения - поднять исключение".
Когда у тебя в программе вылезает EAccessViolation - это потому, что коллбеку от линуксятины прилетел SIGSEGV, RTL его окучила и подняла этот самый EAccessViolation, ориентируясь на указанный линуксятиной адрес и фрейм стека.

Добавлено спустя 17 минут 37 секунд:
sysutils устанавливает ErrorProc:=@RunErrorToExcept; где RunErrorToExcept(номер ошибки, адрес, фрейм стека) - простыня case и прочей эвристики, подбирающие класс исключения и текст ругани по коду ошибки.
Всякоразные системно-специфичные обработчики сигналов парсят эпос, рассказанный операционной системой, в код ошибки, адрес и фрейм стека, после чего вызывают HandleErrorAddrFrame(номер ошибки, адрес, фрейм стека), коя пасует мяч ErrorProc, если та не nil, иначе - банальный Halt(номер ошибки).

У многих платформ (например, win32 SEH, которая больше не используется с фпц 3.2) обработчик сигнала обязан вписать адрес, откуда продолжать, в запись, содержащую все регистры процессора. На некоторых юниксовых платформах обработчик сигнала вписывает туда адрес HandleErrorAddrFrame, а в соответствующие регистры - параметры, передаваемые ей.
Мой (давний, отлично работающий на x86) хак для виндовс тупо подставляет EIP/RIP на адрес процедуры, передающей мяч по цепочке DLL модуля, в коллбек, который поднимает исключение. Только благодаря ему я мог обойти баг с неработающим перехватом исключений в потоках в DLL в фпц 2.6.4 и двигать проект вперёд, не дожидаясь, пока пофиксят (пофиксили только в 3.2.0).
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 898
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 30.07.2021 16:43:10

(на работе по прежнему критический период, не могу отвлекаться на проект)
Чёрт побери, мне не только менеджмент модулей переделывать придётся, но и управление потоками! Вплоть до самого понятия "фоновая задача". Потому что если несколько модулей начнут каждый плодить фоновые потоки и бодаться за ядра... :x

- потоки для фоновых задач переходят в ведение екзешника-матки.
- само понятие "фоновая задача" переходит в ведение екзешника-матки. который будет уметь некоторые базовые плюс "фоновая задача X модуля Y", где модуль предоставляет точку входя для их вызова. Таким образом, крах фоновой задачи в модуле - это не крах модуля, а цепь событий "фоновая задача йокнулась", которую модуль может обработать в цивилизованной форме. Включая попытки авто-повтора или выход с аварийным сохранением.
- синхронизация потоков для актуализации ассетов и рендера отправляется в анус.
- ассеты могут актуализовываться *только* посредством фоновых задач.
- рендер отвязан нахрен от логики, логика крутится в своём выделенном потоке и периодически сочиняет командный буфер, который сдаёт основному потоку для рендера.
- создание ресурсов OpenGL типа текстур - только в "фоновых задачах основного потока", которые выполняются после рендера, но перед принудительной синхронизацией CPU и GPU. Побочка - задержка до двух кадров между созданием ассета в логике и его готовностью к использованию. Пофиг, т.к. в движке давно уже прошита фоновая подгрузка а-ля третий анрил.
- на двухъядерных процессорах (напр. ископаемый Core 2 Duo 1.6GHz), потоков - три: основной, выделенный логики и фоновых задач, имеющий пониженный приоритет.
- при загрузке доп. модулей с их логикой в выделенном потоке, екзешник-матка уменьшает количество активных фоновых потоков (перестаёт использовать некоторые).
- обмен информацией между модулями - посредством отправки сериализованных объекттых деревьев по адресу "айди вон того модуля" через API матки.
- отдельный модуль может быть:
-- выделенным сервером
-- аналогом выделенного сервера для нужд ИИ (всплывающие слои используются для симуляции вперёд на пару секунд, что дарит крайне ограниченному числу ИИ-акторов эпическую хитрожопость)
-- подсистемой сетевого обмена (занимается приёмом/рассылкой пакетов в сетевой игре)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 898
Зарегистрирован: 06.06.2005 15:54:34

Пред.

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

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

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

Рейтинг@Mail.ru