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
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

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

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

(Суть прикола если кратко была в расчете "метрики элемента" глобально вместо ее расчета для каждого элемента в отдельности . Причем считал "в основном цикле" и все что нужно было это добавить дополнительные поля в класс... Но нет "дурилку перемкнуло" ! "Дохтор Ватсон ну зачем же огорчать мисс Хадсон " Блин !!!! )
Alex2013
долгожитель
 
Сообщения: 2438
Зарегистрирован: 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
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

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

А ты вообще уверен что этот код срабатывает ? В LCL полно такого что вызывается только при "очень специальных случаях " то есть почти никогда.
Alex2013
долгожитель
 
Сообщения: 2438
Зарегистрирован: 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
энтузиаст
 
Сообщения: 930
Зарегистрирован: 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
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 06.11.2021 13:09:40

Унификация кросс-екзешного API: вот ищо один пополз :evil: Тапком яго! :twisted:

Код: Выделить всё
  function GetMotherTLS(): PMotherTLS;
  var
    T: TThreadId;
    p: PMotherTLS;
    i: integer;
  begin
    T:= GetCurrentThreadId();

    // 1. try finding it in cache (no critical section)
    Result:= nil;
    with Mother^.TLSCache do
      for i:= 0 to TMotherTLSCacheSize - 1 do
        if ThreadId[i] = T then begin
          Result:= PLS[i];
          break
        end;
    if Assigned(Result) and (Result^.ThreadId <> T)
      // race conditions: cache got updated while we were reading from it
      then Result:= nil;

    // 2. if not found in cache, search through the pointer chain
    if not Assigned(Result) then begin
      EnterCriticalsection(Mother^.TlsCriticalSection);
      Result:= @Mother^.MainThreadTLS;
      while true do begin
        if Result^.ThreadId = T then break;
        if not Assigned(Result^.Next) then begin
          // end of the chain reached, allocating
          VerboseLog('  Allocating exception state for thread ID=' + IntToHex(T, 8) + 'h...');

// Мудятел. Патентованый.
// Если эта байда выполнится в DLL - *чей* диспетер памяти этот блок выделит?
// Вот, а потом неделями мучаемся, жрём кактус отладки - почему падает.
// Зла на себя не хватает.

          //Result^.Next:= new(PMotherTLS);
          Result^.Next:= {$ifdef discretedll} Mother^.Memory.Get(SizeOf(TMotherTLS)) {$else} new(PMotherTLS) {$endif};
          Result:= Result^.Next;
          FillChar(Result^, SizeOf(Result^), 0);
          Result^.ThreadId:= T;
          Result^.events[High(Result^.events)].eType:= deke_Terminator;
        {$ifdef CPUX86_64}
          asm
            mov rbx, qword[Result]
            mov ax, ss
            mov word[rbx + TMotherTLS.StackSegment], ax
          end['rax', 'rbx'];
        {$endif}
        {$ifdef CPU386}
          asm
            mov esi, dword[Result]
            mov ax, ss
            mov word[esi + TMotherTLS.StackSegment], ax
          end['eax', 'esi'];
        {$endif}
          break;
        end;
        Result:= Result^.Next;
      end;

      // 3. update cache. A horrible race but we take care of that at step 1.
      with Mother^.TLSCache do begin
        for i:= TMotherTLSCacheSize - 1 downto 1 do begin
          ThreadId[i]:= ThreadId[i - 1];
          PLS[i]:= PLS[i - 1];
        end;
        ThreadId[0]:= T;
        PLS[0]:= Result;
      end;
      LeaveCriticalsection(Mother^.TlsCriticalSection);
    end;
  end;


Добавлено спустя 11 часов 38 минут 19 секунд:
Это не фичакат, это резня :twisted:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Alex2013 » 07.11.2021 23:33:00

Как вообще проект движется ?
Зы
Я как минимум в любительских проектах давно взял на вооружение "принцип Илона Маска" то есть каждый этап разработки должен быть по возможности "демонстративен", камеральные работы "по плану" не заменят живого бета-тестирования, да и если стимул нагляден "как морковка перед ослом", то лень сопротивляться заметно меньше - может попробуешь сделать хотя бы "лайт версию "? И плевать, что "с заглушками", всем все равно будет интересно увидеть ХОТЬ ЧТО-ТО новое!
Последний раз редактировалось Alex2013 11.11.2021 17:06:22, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2438
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 11.11.2021 13:13:48

Текущий перетрях не позволяет никаких "лайт версий", увы. Отрезаю телегу от морды лошади, мастерю оглобли, чтобы впрячь сзади.
Режу безжалостно, всё лишнее уже в помойке. Дальше уже некуда.
Менеджмент модулей и организация основного цикла делаются заново с нуля. Организация фоновых задач - аналогично. И управление многопоточностью там же. И обработка исключений.
Хотелось бы, чтобы оно хотя бы компилировалось - но даже до этого пока далеко.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 26.11.2021 16:47:03

Изменения форматирования: раньше я вручную выравнивал код на 80 символов, разбивая на строки - но это стало *очень* неудобно с ростом длины имён полей и методов.
Я исследовал разные альтернативы, включая механизм автоформатирования в лазарусе (слишком дубовый) и редактирование кода в Notepad++ с пропорциональным шрифтом (неудобно искать ошибки компиляции вручную в коде). Альтернативы Лазарусу нет, увы. Устаревший SynEdit неспособен к автопереносу длинных строк по ширине окна редактора. Какая дремучесть.
Нашёл компромисс, выставив ширину листа в 120 символов - и на неё теперь выравниваю когда что-то правлю. По прежнему вручную.

Добавлено спустя 43 минуты 6 секунд:
Вместо порнографии 100500 булевых флагов состояния, каждая реакция на которые должна быласодержать полную пляску с бубном, машина состояний движка сводится к *одному* перечислимому, которое может двигаться *только* вперёд, только посредством специальных методов, основанных на InterlockedCompareExchange.
Код: Выделить всё
  TMotherStage = (
     // EMos monitor this and react accordingly
     mstg_Uninitialized,
     mstg_MotherInit,
     mstg_EngineInit,
     mstg_Running, // the module manager is ready to load EMos and begins to do so
     mstg_Restart, // EMos shutdown normally, cleaning opened assets up. The application restarts self before it
      // terminates.
     mstg_NormalShutdown, // EMos shutdown normally, cleaning opened assets up
     mstg_EmergencyShutdown, // EMos do their best to save their sessions, do not clean up.
     mstg_HardCrash // All engine subsystems shut down without regard to EMos or cleaning up.
  );


Добавлено спустя 5 часов 2 минуты 49 секунд:
Наступает момент, когда от попытки держать всё в голове оная начинает болеть и пухнуть и приходится браться за дедовский, физический карандаш:
http://chentrah.chebmaster.com/images/c ... _graph.jpg
http://chentrah.chebmaster.com/images/cge/sync_algo.jpg
...ииии вылезает необходимость пары новых функций API матки для работы с событиями-будильниками, ибо они являются классами, а классы через границу модуля не ходят: теряют физический смысл.

Добавлено спустя 3 минуты 58 секунд:
З.Ы. 1 и 2 перепутаны местами. Старею, маразм.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 03.04.2022 14:19:19

Рефакторинг ползёт с энергией беременной улитки - до компилируемости всё ещё далеко.

Изменения парадигмы:
1. DLL модулей присасываются к диспетчеру памяти екзешника-матки - что, как минимум, позволит обмениваться строками и массивами в функциях кросс-модульного API. Как максимум - быстрое и грязное перекидывание куска объектного графа из одной DLL в другую (перебросить как сырой блоб, поправить указатель на VMT - и больше ничего не нужно, все менеджед типы остаются валидными, т.к. диспетчер памяти у всех - общий)

2. Жёсткая проверка версии компилятора между маткой и модулями

3. Необходимость аккуратного завершения модуля (раньше было пофиг, диспетчер памяти дох вместе с его DLL).

Сегодня разгрёб управление энергосбережением (а по факту - вентиляторосбережением)
Код: Выделить всё
  function TBasicFramework.PowerSavingFromFocus: TPowerSavingLevel;
  begin
    if not Self.f_focus
      then Result:= psl_Harsh
      else if Mother^.Display.MouseIsBeyondOurWindow
        then Result:= psl_Minimal
        else Result:= psl_None;
  end;
 
  function TServerFramework.PowerSavingFromFocus: TPowerSavingLevel;
  begin
    Result:= psl_None;
  end;   
 
  procedure TAbstractFramework.ChoosePowerSavingLevel;
  var n: TPowerSavingLevel;
  begin
    n:= psl_None;
    with Mother^.PowerSaving^ do begin
      BecauseOfNotHavingFocus:= Self.PowerSavingFromFocus();
      if n < RequestedByEmo then n:= RequestedByEmo;
      if n < BecauseOfBatteryStatus then n:= BecauseOfBatteryStatus;
      if n < BecauseOfNotHavingFocus then n:= BecauseOfNotHavingFocus;
      Acknowledged:= n;
    end;
  end;   
 
  procedure TAbstractFramework.ApplyPowerSavingLevel;
  begin
    with Mother^.PowerSaving^ do Current:= Acknowledged; // a stub, does nothing
  end;
 
  procedure TWinApiFramework.ApplyPowerSavingLevel;
  // is called mid-frame before the main thread tasks
  var
    useTbp1: boolean;
  begin
    with Mother^.PowerSaving^ do begin
      if Current <> Acknowledged then begin

        useTbp1:= Acknowledged <> psl_Harsh;

        if not useTbp1 then begin
          if Mother^.Timer.ActiveTBP1 then begin
            if Verbose(vla_Framework) then AddLog('Calling timeEndPeriod(1)...') ;
            if timeEndPeriod(1) = TIMERR_NOERROR then begin
              Mother^.Timer.ActiveTBP1:= false;
              if Verbose(vla_Framework) then AddLogOk
            end else
              if Verbose(vla_Framework) then AddLog('FAILED');
          end;
        end else begin
          if not Mother^.Timer.ActiveTBP1 then begin
            if Verbose(vla_Framework) then AddLog('Calling timeBeginPeriod(1)...') ;
            if timeBeginPeriod(1) = TIMERR_NOERROR then begin
              Mother^.Timer.ActiveTBP1:= true;
              if Verbose(vla_Framework) then AddLogOk
            end else
              if Verbose(vla_Framework) then AddLog('FAILED');
          end;
        end;
      Current:= Acknowledged;
    end;
  end; 

  procedure TWinApiFramework.CheckBatteryStatus;
  //needed this for limiting rendering settings when laptop runs on battery
  var
    ps: SYSTEM_POWER_STATUS;
    s: TFileStream;
    u: Utf8String;
  begin
    if Now() < BatteryStatusCheckMoment then Exit; //check every 10 seconds
    if not GetSystemPowerStatus(ps) then begin
      if Mother^.State.BatteryRemaining <> 255
        then AddLog(RuEn(
          'Не удалось получить от ОС состояние электропитания. Заряд батареи НЕ учитывается!',
          'Failed to get power status from the OS. The battery charge is NOT accounted for!'));
      Mother^.State.BatteryRemaining:= 255;
      BatteryStatusCheckMoment:= Now() + (5 * 60) / SecondsPerDay; //check again five minutes later
    end
    else if ps.ACLineStatus > 0 then begin
      BatteryStatusCheckMoment:= Now() + 10 / SecondsPerDay; //check often: what if it gets unplugged?
      Mother^.State.BatteryRemaining:= 255;
    end
    else begin
      Mother^.State.BatteryRemaining:= ps.BatteryLifePercent; //it's an unsigned byte, LOL.
      BatteryStatusCheckMoment:= Now() + 30 / SecondsPerDay;  //check two times a minute
      if Mother^.State.BatteryRemaining < 15 then begin
        WriteLastWill(RuEn(
          'Аварийный выход: батарея ноутбука щас сдохнет!%n',
          'Emergency shutdown: laptop battery is dying!%n'));
        AdvanceMotherStage(mstg_NormalShutdown);
      end;
    end;

    if (PrevBatteryRemaining <> Mother^.State.BatteryRemaining)
    then begin
      if Mother^.State.BatteryRemaining > 100
        then AddLog(RuEn('Питание от сети.', 'AC power.'))
        else AddLog(RuEn('Заряд батареи %0%.', 'Battery charge %0%.')
                    , [Mother^.State.BatteryRemaining]);
        PrevBatteryRemaining:= Mother^.State.BatteryRemaining;
    end;

    //Disable higher-resolution waits for better battery life
    if Mother^.State.BatteryRemaining <= BATTERY_THRESHOLD_FORCES_POWER_SAVING then begin
      Mother^.PowerSaving^.BecauseOfBatteryStatus:= psl_Harsh;
    end
    else if Mother^.State.BatteryRemaining <= 100 then begin
      Mother^.PowerSaving^.BecauseOfBatteryStatus:= psl_Minimal;
    end else begin
      Mother^.PowerSaving^.BecauseOfBatteryStatus:= psl_None;
    end;
  end;


Я тут затеялся играть в Factorio на своём любимом ноутбуке, вместо игрового компа - и чуть не доигрался. Хряп! - и ноут вырубается. Я: ааааа, моя прелесть! Я убил его! :cry: К счастью, он оказался живой. Логи SpeedFan'а: вентилятор не тянет выше 4200 оборотов, температура проца: 88... 89... 90... 91... Лог обрывается :shock:
Никогда больше! :evil: Ведь лишиться мог бесценного артефакта 2012 года. Сколько батарей и вентиляторов заменил, сколько я камлал его машинному духу, с помазанием Thermal Grizzly Kryonaut'ом и изопропанолом... И чуть не запорол, стоеросина еретическая :oops:
Почему он не троттлил-то? Глюк драйвера?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 04.04.2022 22:32:02

Cheb писал(а):Почему он не троттлил-то?

У меня ещё более старый ноутбук (2011 года, кажется) тоже отключает сам себя при 90°, вряд ли в этом что-то страшнее обычного хард ресета, превентивная мера.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 562
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 22.04.2022 12:24:07

runewalsh писал(а):вряд ли в этом что-то страшнее обычного хард ресета, превентивная мера.

Страшно - изнашивается электроника на повышенных температурах. Вдвое за каждые 10 градусов, ЕМНИП.
А перегретый проц мог нагреть ещё кучу всего по соседству.
Я хочу ещё десять лет этим ноутом пользоваться, как моим основным рабочим инструментом. Он у меня любимый (до нездоровой одержимости). И он ремонтопригодный своими руками, что самое ценное.
Это были не просто 10 лет, это были 10 лет в режиме 24/7 (в основном, в режиме десктопа). Батарея уже седьмая, ЕМНИП (и недавно купил ещё одну), вентилятор - третий донашивает (и ещё два ползут с алиэкспресса). Он - как советский трактор: при наличии прямых рук и такой-то матери бессмертен (а особо бессмертен за счёт того, что ещё один точно такой же пылится, давно купленный на авито за 11 т.р.)

По ходу купил Orange Pi PC на замену своей Raspberry Pi 2 B+. Формально, это - замена шила на мыло, т.к. характеристики у них абсолютно одинаковые: Cortex A7 4 ядра 1.2 ГГц, Mali 400 - мой заявленный минимум для моей игры мечты. Но мне важно поддерживать и импортозамещающую платформу (мало ли, какие у неё эндемичные тараканы). Малина теперь - контрабандный товар, стоит от $250, если вообще найдёшь. А апельсин - всего $100. Как говорится, почувствуйте разницу!
Orange Pi 3 имеет Pci-E M2 разъём для подключения полноценного SSD диска - что делает её полноценным десктопом. Но цена в $300 меня отпугнула (картинка: жаба высовывается из тёмной подворотни и показывает пудовый кулак).

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

Кстати, о контрабанде. Одинокий трактир на побережье, откуда родом Джим Хокинс, почти без постояльцев, то, как он описывает удобные подходы с моря... Предполагалось, что даже ну самый тупой читатель той эпохи просечёт: их семья - потомственные контрабандисты. Но реалии изменились, современный читатель не замечает очевидно вписанное между строк (а слона-то я и не приметил). Некоторые таки замечают и наматывают целые теории заговора вокруг "Таинственного острова". :mrgreen:

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

Re: Cheb's Game Engine

Сообщение Alex2013 » 22.04.2022 16:04:00

1 ИМХО сейчас важен "не заявленный минимум", а заявленный максимум .
(У всех "живых юзргов" конфиг приближается к среднему и поддержка чего-то заметно что слабее например планшетного Intel Cherry Trail (Intel Atom X5-Z830) особого смысла не имеет )
2 А Максимум сейчас (имхо) упирается в поддержку ВиАр (Реально другой тех-уровень и "играбельность по максимуму" сейчас дает только ВиАр)
(Прадон я уже писал в этой теме что-то похоже несколько лет назад но сейчас это уже "совсем актуально").
Зы
Если есть около 300$ но жаба давит потратить их на "ненужный SSD" купи Окулус Квест 2 ! Это кроме шуток "кусочек будущего" который можно потрогать руками . (По сути это современный "комбайн- беларусь" (старая советская ЧБ телерадиола "3 в одном" ) и даже круче) Есть Автономный ВиАр (довольно неплохой уровня ВиАр мода Дум3 ) проводной ВиАр (тут все серьёзно и упирается только в производительность компа ), "проводной ВиАр без провода" (по ВиФи 6 неплохо), черно-белая Дополнения реальность ( реальный фон Чб(стерео) а вр объекты цветные ),"ходули для рук "контроллеры" , "ручное управление" в стиле хололинз . Недостатков хватает но я ни разу не пожалел что потратил все накопленное на покупку нового монитора.
(Даже в теперешние "смутные времена" потраченного не жаль )
Последний раз редактировалось Alex2013 23.04.2022 13:15:06, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2438
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 23.04.2022 02:46:13

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

З.З.З.Ы. Насчёт максимума... Мне очень хочется сделать игру, про которую можно будет пафосно заявить: "Системные требования? Их нет!" Ибо расчётный минимум - Core 2 Duo / Athlon X2 / GeForce 8400 GS / Radeon HD 2600
..а такого антиквариата только в музеях.
Мои друзья на работе куда более мощные пришурупливают на стенку в качестве декорации.

Добавлено спустя 1 час 32 минуты 1 секунду:
Увеличить системные требования - ничего не стоит. А вот уменьшить... Невозможная задача. Лучше с самого начала закладывать.
Последний раз редактировалось Cheb 24.04.2022 00:03:58, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 930
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

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

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

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

Рейтинг@Mail.ru