Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение Mirage » 29.05.2017 14:23:18

Это можно записать компактнее:
Код: Выделить всё
function InvSqrt(x: Single): Single; inline;
const
  THREE_HALFS = 1.5;
var
  yi: Integer absolute Result;
begin
  Result := x;
  yi := $5f3759df - ( yi shr 1 );
  Result := Result * (THREE_HALFS - (x * 0.5 * Result * Result));
end;


Что касается линий с шириной, то это классный пример задачи тривиальной на вид и сложной (в общем виде не решается) на самом деле.
Острые углы поддерживаешь уже? А совсем острые? :)
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 29.05.2017 16:03:21

можно записать компактнее:

:oops:

Острые углы поддерживаешь уже?

Не, забил. Угол больше 90 градусов - рисуются несоединённые отрезки, накладенные один на другой. То же при длине отрезка меньше двух ширин.
Мне важно было по быстрому получить гуйный инструмент, котрый пойдёт на GLES. В конце концов, это не сферический конь на все случаи жизни, а инструмент для рисования конкреитных кнопок, чекбоксов и прочего съестного припаса. (я даже больше скажу: поскольку это порт поделиЯ на основе glBegin..glEnd, меши генерируются заново и уничтожаются каждый кадр, каждая фитюлька - отдельный дип). Но теперь хотя бы состояние текстуры не дёргает.

И таки я своего добился. После выпалывания последних glDisable(GL_TEXTURE_2D) (переделал неошкуренные меши использовать белый тексель из текстуры шрифта), матка таки поднялась и пошла под GLES. Правда, окно - квадрат Малевича, но по крайней мере не падает (а у меня там всё увешано гирляндами glGetError ).

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

Re: Cheb's Game Engine

Сообщение Mirage » 29.05.2017 18:45:44

Зачем один дип на кнопку? А если много кнопок? Можно один дип на тип примитива.
Т.е. UI рисует посредством отрисовки текстов, линий, фигур и т.п. Вот эти тексты, линии и фигуры собираются, батчатся и отрисовываются одним дипом.
Можно даже что-то типа канваса замутить для абстракции. И через него рисовать текст и примитивы.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 29.05.2017 19:23:00

А если много кнопок? Можно один дип на тип примитива.

Для этого нужно реорганизовывать, усложняя и вводя менеджер рендера. Вся структура классов гуя заточена под немедленное рисование по одному. В том числе любой вьюпорт со сценой - это ничем не выдающийся потомок TRectControl (владеющий своими FBO с текстурою). Можно его запихать в типовую резиновую таблицу, можно накласть один на другой, или даже прослоить бегущей строкой текста между ними.

Система удобна гибкостью, и пока она имеет вес пера (а она имеет) - я даже не почешусь оптимизировать.

Т.е. UI рисует посредством отрисовки текстов, линий, фигур и т.п. Вот эти тексты, линии и фигуры собираются, батчатся и отрисовываются одним дипом.

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

Добавлено спустя 9 минут 28 секунд:
Примерно, как главное меню игрового модуля:
(торчат таки уши того, что я веб-разработчик по профессии, да)
Код: Выделить всё
const
  bw = 300;
  bh = 40;

class procedure TModuleMainMenu.AddCaption(table: TTable);
var
  text: ttextrect;
begin
  text:= TTextRect.Create(Mother^.Module.NameW,bw * 3,bh * 2);
  text.FontHeight:= GuiHeadlineFontHeight;
  table.NewCell(text, 0, table.NewRow(bh * 2), table.ColumnCount);
end;

constructor TModuleMainMenu.Create(what: UnicodeString = '');
var
  i, j: integer;
  cind: array[0..2] of integer;
  rind: integer;
  ctable: array[0..2] of TTable;
  buttons: array[0..2] of TControlArray;
  maxbuttons: integer;
  text: ttextrect;
begin
  inherited Create(bw * 3, 200, 10, 10);

  for i:= 0 to High(cind) do cind[i]:= NewColumn(1.0);

  AddCaption(Self);

  buttons[0]:= ListGameButtons;
  buttons[1]:= ListSettingsButtons;
  buttons[2]:= ListSystemButtons;

  maxbuttons:=0;
  for i:=0 to High(buttons) do maxbuttons:= math.max(maxbuttons, Length(buttons[i]));

  ChangeSize(bw * 3, 200 + bh * maxbuttons * 2);

  rind:= NewRow(bh * maxbuttons * 1.4);
  for i:=0 to High(ctable) do begin
    ctable[i]:= TTable.Create(280, bh * maxbuttons * 1.4, 10, 0);
    ctable[i].NewColumn(1.0);
    NewCell(ctable[i], cind[i], rind);
    for j:= 0 to High(buttons[i]) do
      ctable[i].NewCell(buttons[i][j] as TRectControl, 0, ctable[i].NewRow(20));
  end;


  NewCell(TButton.Create(RuEn('<< Продолжить','<< Continue'),bw,bh,Self, 'Kill'), 0, NewRow(40), 3);

  OnResize;
  Self.AddOnTop(Module.Logic.MainMenu);
end;

function TModuleMainMenu.ListGameButtons: TControlArray;
begin
  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Упасть','Crash'), bw, bh, Self, 'CommitSuicideByAV');

  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Привязки клавиш...','Key bindings...'), bw, bh, nil, 'TSettingsMenu', 'bindings');
end;

function TModuleMainMenu.ListSettingsButtons: TControlArray;
begin
  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Изображение...','Visual...'), bw, bh, nil, 'TSettingsMenu', 'video');

  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Звук...','Audio...'), bw, bh, nil, 'TSettingsMenu', 'audio');

  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Графический планшет...','Pen tablet...'), bw, bh, nil, 'TSettingsMenu', 'tablet');

  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('XBox360 совместимый геймпад...','XBox360 compatible controller...'), bw, bh, nil, 'TSettingsMenu', 'controller');
end;

function TModuleMainMenu.ListSystemButtons: TControlArray;
begin
  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Сессия...','Session...'), bw, bh, Self, 'InvokeSessionMenu');

  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Выбрать другой модуль','Choose another module'),bw,bh, Self, 'GoToModuleSelectionMenu');

//  SetLength(Result, Length(Result) + 1);
//  Result[High(Result)]:= TButton.Create(RuEn('Перезапустить программу','Restart the program'),bw,bh, Self, 'RestartProgram');

  SetLength(Result, Length(Result) + 1);
  Result[High(Result)]:= TButton.Create(RuEn('Выйти из программы','Exit the program'),bw,bh, Self, 'Exitprogram');
end;

function TModuleMainMenu.OnKey(key: TKey): boolean;
begin
  if (key = KEY_ESCAPE) and Module.Logic.KeyDown[key] then begin
    Result:= false;
    Kill;
  end
  else Result:= inherited OnKey(key);
end;

procedure TModuleMainMenu.InvokeSettingsMenu();
begin
  Module.Logic.InvokeMenu(TSettingsMenu);
end;

procedure TModuleMainMenu.InvokeSessionMenu();
begin
  Module.Logic.InvokeMenu(TSettingsMenu);
  (Module.Logic.MainMenu as TSettingsMenu).Reset('session'); //it was too deep inside that option so I decided to move it up.
end;

procedure TModuleMainMenu.ExitProgram();
begin
  Mother^.Core.RequestExit;
  AfterEfCheck;
end;

procedure TModuleMainMenu.RestartProgram;
begin
  PlaySound('click.wav');
  Mother^.State.RestartRequested:= Yes;
end;

procedure TModuleMainMenu.RestartModule;
begin
  PlaySound('click.wav');
  Mother^.Module.State:= ms_Unloading;
  Mother^.Display.BeginBlackout(1.0);
end;

procedure TModuleMainMenu.GoToModuleSelectionMenu();
begin
  PlaySound('click.wav');
  Mother^.Module.RequestToChooseModule:= Yes;
end;

procedure TModuleMainMenu.CommitSuicideByAV;
begin
Try
    byte(nil^):= 0;
  except
    Die(RuEn('Исключение успешно поймано в DLL модуля.','The exception was successfully caught in the module DLL.'));
  end;
end;


Добавлено спустя 19 минут 18 секунд:
З.З.Ы. Контролы образуют связанный список, а некоторые могут быть таблицами, где к резиновым ячейкам привязаны дочерние контролы.
Во всех последних тестах структура такая: самый нижний - TBackground, он для модуля как чёрный ящик т.к. рендер производится обращением к API матки, которая что-то там изображает в зависимости от свое йверсии. Сейчас - тупо прямоугольник с серой текстурой в складочку.
Над ним висит вьюпорт, рендерящий шарики в FBO с альфой, коя текстура потом накладывается поверх фона.
И поверх него может создаваться главное меню.

Но это всё - забивание гвоздей микроскопом по сравнению с тем, что эта система в потенциале может.

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

Re: Cheb's Game Engine

Сообщение Mirage » 30.05.2017 02:24:32

Cheb писал(а):Система удобна гибкостью, и пока она имеет вес пера (а она имеет) - я даже не почешусь оптимизировать.


Вот создатели FireMonkey тоже так думали.:)
Впрочем, для игрушек сойдет.
Переключение FBO кстати дороже, чем текстуры, да и шейдера.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 30.05.2017 08:23:32

Впрочем, для игрушек сойдет.

Ну, дык. Я же не генератор отчётов делаю.
Парадигма, кстати, заточена именно под игру: нет даже такого понятия, как прокрутка. Есть ограничивающий прямоугольник, есть содержимое. Задача гуя - утрамбовать второе в первый путём уменьшения, пока не влезет.
Текст на кнопках устроен точно так же. Всунешь туда целый абзац - отобразит в несколько строк меееелким шрифтом.

З.Ы. Надо для тулзетов подобие меню-бара запилить, как в классических приложениях.

З.З.Ы. Моя кошка жрёт майонез... :shock:

Добавлено спустя 45 минут 14 секунд:
yi: Integer absolute Result;

А вот ХРЕН. В тестовом примере работает, в актуальном движке с имеющимися настройками оптимизации кода - даёт NaN. :evil:
Пытался понизить с -O3 до -O1 - бесполезно. Что-то ещё.

Добавлено спустя 25 минут 10 секунд:
P.S. Это не кодогенератор, а бредогенератор :evil:
Код: Выделить всё
   .386p
DGROUP   GROUP   _BSS,_DATA
   ASSUME   CS:_CODE,ES:DGROUP,DS:DGROUP,SS:DGROUP
_CODE      SEGMENT   PARA PUBLIC USE32 'CODE'
   ALIGN 16
   PUBLIC   CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE
CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE:
; Temps allocated between ebp-24 and ebp+0
@@f640:
@@l9546:
      push   ebp
      mov   ebp,esp
      sub   esp,24
; Var a located in register xmm0
; Var $result located in register xmm1
      movss   xmm0,[ebp+8]
@@l9547:
      movss   xmm1,xmm0
@@l9548:
      movss   [ebp-4],xmm1
      mov   eax,dword ptr [ebp-4]
      shr   eax,1
      mov   edx,1597463007 // Это наша магическая константа, в десятичном виде
      sub   edx,eax
      mov   eax,edx
      movss   [ebp-4],xmm1 //КАКОГО ***
      mov   dword ptr [ebp-4],eax
@@l9549:
      movss   xmm2,xmm0
      mulss   xmm2,[_$CGE$_Ld3139]
      mulss   xmm2,xmm1
      mulss   xmm2,xmm1
      movss   xmm3,[_$CGE$_Ld3140]
      subss   xmm3,xmm2
      mulss   xmm3,xmm1
@@l9550:
      mulss   xmm0,[_$CGE$_Ld3139]
      mulss   xmm0,xmm3
      mulss   xmm0,xmm3
      movss   xmm1,[_$CGE$_Ld3140]
      subss   xmm1,xmm0
      mulss   xmm1,xmm3
@@l9551:
      movss   [ebp-8],xmm1
      fld   dword ptr [ebp-8]
      leave
      ret   4
@@t541:
_CODE      ENDS

   END

..короче, компилятор ниасилил скрестить SSE2 и побитовые операции над целыми

Добавлено спустя 10 минут 4 секунды:
Добавил {$fputype x87}

Стало
Код: Выделить всё
   .386p
DGROUP   GROUP   _BSS,_DATA
   ASSUME   CS:_CODE,ES:DGROUP,DS:DGROUP,SS:DGROUP
_CODE      SEGMENT   PARA PUBLIC USE32 'CODE'
   ALIGN 16
   PUBLIC   CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE
CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE:
; Temps allocated between ebp-24 and ebp-4
@@f640:
@@l9541:
      push   ebp
      mov   ebp,esp
      sub   esp,24
; Var a located in register xmm0
; Var $result located at ebp-4
      movss   xmm0,[ebp+8]
@@l9542:
      movss   [ebp-4],xmm0
@@l9543:
      mov   eax,dword ptr [ebp-4]
      shr   eax,1
      mov   edx,1597463007
      sub   edx,eax
      mov   dword ptr [ebp-4],edx
@@l9544:
      fld   dword ptr [_$CGE$_Ld3137]
      movss   [ebp-8],xmm0
      fmul   dword ptr [ebp-8]
      fmul   dword ptr [ebp-4]
      fmul   dword ptr [ebp-4]
      fsubr   dword ptr [_$CGE$_Ld3138]
      fmul   dword ptr [ebp-4]
      fstp   dword ptr [ebp-4]
@@l9545:
      fld   dword ptr [_$CGE$_Ld3137]
      movss   [ebp-8],xmm0
      fmul   dword ptr [ebp-8]
      fmul   dword ptr [ebp-4]
      fmul   dword ptr [ebp-4]
      fsubr   dword ptr [_$CGE$_Ld3138]
      fmul   dword ptr [ebp-4]
      fstp   dword ptr [ebp-4]
@@l9546:
      fld   dword ptr [ebp-4]
      leave
      ret   4
@@t541:
_CODE      ENDS

   END

-- и заработало.
Но оптимальность! :evil: Сделайте меня развидеть это! :x Из xmm регистра в память, оттуда в обычный регистр, оттуда в память, оттуда в xmm регистр, оттуда снова в память


А если...
Код: Выделить всё
{$push}
  {$rangechecks off}
  {$oveflowchecks off}
  { fputype x87}
  // https://en.wikipedia.org/wiki/Fast_inverse_square_root
  function FastInverseSquareRoot(a: float): float; inline;
  var
    i: longint;// absolute Result;
  begin
    //Result:= a;
    i:= longint(pointer(@a)^);
    i:= $5f3759df - (i shr 1);
    Result:= float(pointer(@i)^);
    Result*= 1.5 - (a * 0.5 * Result * Result);
    Result*= 1.5 - (a * 0.5 * Result * Result);
  end;
{$pop}


Код: Выделить всё
   .386p
DGROUP   GROUP   _BSS,_DATA
   ASSUME   CS:_CODE,ES:DGROUP,DS:DGROUP,SS:DGROUP
_CODE      SEGMENT   PARA PUBLIC USE32 'CODE'
   ALIGN 16
   PUBLIC   CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE
CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE:
; Temps allocated between ebp-20 and ebp-4
@@f640:
@@l9541:
      push   ebp
      mov   ebp,esp
      sub   esp,20
; Var $result located in register xmm0
; Var a located at ebp+8
; Var i located at ebp-4
@@l9542:
      lea   eax,dword ptr [ebp+8]
      mov   eax,dword ptr [eax]
      mov   dword ptr [ebp-4],eax
@@l9543:
      shr   eax,1
      mov   edx,1597463007
      sub   edx,eax
      mov   dword ptr [ebp-4],edx
@@l9544:
      lea   eax,dword ptr [ebp-4]
      movss   xmm0,[eax]
@@l9545:
      movss   xmm2,[ebp+8]
      mulss   xmm2,[_$CGE$_Ld3137]
      mulss   xmm2,xmm0
      mulss   xmm2,xmm0
      movss   xmm1,[_$CGE$_Ld3138]
      subss   xmm1,xmm2
      mulss   xmm1,xmm0
@@l9546:
      movss   xmm2,[ebp+8]
      mulss   xmm2,[_$CGE$_Ld3137]
      mulss   xmm2,xmm1
      mulss   xmm2,xmm1
      movss   xmm0,[_$CGE$_Ld3138]
      subss   xmm0,xmm2
      mulss   xmm0,xmm1
@@l9547:
      movss   [ebp-4],xmm0
      fld   dword ptr [ebp-4]
      leave
      ret   4
@@t541:
_CODE      ENDS

   END

[тяжкий вздох :x ]

Добавлено спустя 14 минут 10 секунд:
..в общем, надо всё вручную, asm в зубы - и скрещивать SSE2 с MMX :x
MOVDQ2Q Move low quadword from XMM to MMX register.

:x
:x
:evil:
Последний раз редактировалось Cheb 30.05.2017 17:12:04, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Mirage » 30.05.2017 12:51:04

А что добавил-то чтобы заработал вариант с absolute? И при каких настройках не работает? -CfSSE2?
Это походу баг.

Cheb писал(а):Парадигма, кстати, заточена именно под игру: нет даже такого понятия, как прокрутка. Есть ограничивающий прямоугольник, есть содержимое.


В играх таки прокрутка иногда нужна. TEdit опять же.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 30.05.2017 17:10:27

А что добавил-то чтобы заработал вариант с absolute?

:oops:
{$fputype x87}
Но это бессмыссленно: поскольку прямая передача между xmm и регистрами общего назначения невозможна, значение дважды гоняется через память, ибо целочисленные операции над xmm регистрами не существуют.
Надо вообще отрубать использование SSE2.

TEdit опять же.

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

Re: Cheb's Game Engine

Сообщение Mirage » 30.05.2017 18:48:38

Если используется SSE и даже переменные все в регистрах XMM, то компилятор должен догадаться заюзать RSQRTSS/RSQRTPS для конструкций вида 1/sqrt(x).
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 31.05.2017 09:58:06

Код: Выделить всё
{$push}
  {$rangechecks off}
  {$oveflowchecks off}
  {$if defined(cpu386) or defined(cpux86_64)}
    function FastInverseSquareRoot(a: float): float; inline; assembler;
    asm
      RSQRTSS xmm7, [a]
      MOVSS [Result], xmm7
    end['xmm7'];
  {$else}
    // https://en.wikipedia.org/wiki/Fast_inverse_square_root
    function FastInverseSquareRoot(a: float): float; inline;
    var
      i: longint;// absolute Result; //code generator FAILS to marry SSE2 and general-purpose registers
    begin
      //Result:= a;
      i:= longint(pointer(@a)^);
      i:= $5f3759df - (i shr 1);
      Result:= float(pointer(@i)^);
      Result*= 1.5 - (a * 0.5 * Result * Result);
      Result*= 1.5 - (a * 0.5 * Result * Result);
    end;
  {$endif}
{$pop}


Код: Выделить всё
   .386p
DGROUP   GROUP   _BSS,_DATA
   ASSUME   CS:_CODE,ES:DGROUP,DS:DGROUP,SS:DGROUP
_CODE      SEGMENT   PARA PUBLIC USE32 'CODE'
   ALIGN 16
   PUBLIC   CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE
CGE_FASTINVERSESQUAREROOT$SINGLE$$SINGLE:
; Temps allocated between ebp-4 and ebp-4
@@f640:
@@l9541:
      push   ebp
      mov   ebp,esp
      sub   esp,4
; Var a located at ebp+8
; Var $result located at ebp-4
@@l9542:
      rsqrtss   xmm7,[ebp+8]
@@l9543:
      movss   dword ptr [ebp-4],xmm7
@@l9544:
      fld   dword ptr [ebp-4]
      leave
      ret   4
@@t541:
_CODE      ENDS

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

Re: Cheb's Game Engine

Сообщение Cheb » 01.06.2017 11:44:34

Забавный факт №1: AVX поддерживается только в fpc 3. в 2.6.4 ассемблер не знает таких инструкций
Забавный факт №2: если после использования AVX не подчистить состояние командой VZEROUPPER, то SSE начнёт люто тормозить (по крайней мере на некоторых интелах).

(AVX - это SSE на стероидах, каждый регистр расширяется до 256 бит, и могёт восемь флоатов одной командой. Мой древний ультрабук умеет это.)

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

Re: Cheb's Game Engine

Сообщение Cheb » 03.06.2017 22:41:06

Пинками заставил себя создать сайт проекта.
http://chentrah.chebmaster.com/
Только на английском - еслм кто умеет (а кто не умеет?) - велкам почитать мой хитрый план (ранее не публиковался)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 04.06.2017 02:21:22

>Originally, I was planning to create a Morrowind killer
Жиза. Правда, охладев к жанру после Скайрима и проиграв 6 лет в DCSS (к которому у меня тоже вагон нареканий), я сместил предпочтения от «открытый мир, можно делать что хочешь!» к простой, стримлайнутой, сбалансированной игре с чёткими правилами.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение скалогрыз » 04.06.2017 19:45:11

Cheb писал(а):http://chentrah.chebmaster.com/

по поводу Морровинда:
я думаю, что статья дополнится новыми целями для ненависти.
Как было сказано здесь
Cheb писал(а):Короче, я хочу не просто сделать лучше, чем майнкрафт. Я хочу растоптать его, и, как это по русски, teabag его трупик в лучших культурных традициях онлайн-гейминга

... и всё-таки , может ну его нафик эту GPL?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Cheb » 05.06.2017 15:21:52

я сместил предпочтения от «открытый мир, можно делать что хочешь!» к простой,

Делай что хочешь - на самом деле ужасная идея.
Поэтому... Основная игра мечты, наверно, №3, "Подземелья Чентры". Открытый мир, да, но "воды нет, растительности нет, населена демонами". Т.е. по игровой механике похоже на "Хранителя подземелий", НО полностью отсутствуют как "силы бобра", так и гражданское население, и Хранители - кагбэ хорошие парни, вгрызающиеся в планету, затопленную хаосом. Соответственно, набигающие на твою базу товарищи - тоже демоны, но дикие.
Отсюда, не придётся детализировать ничего, кроме менеджмента подземелий с дОбычей ресурсов и тактической боёвки. На поверхности - пыль. Пустота (не в том смысле, что пустыня - я могу и красиво нарисовать, а в том, что делать там, на поверхности, нечего). Только враждебные твари, буде игроку возжелается гринда с БФГ наперевес, и потенциально приручаемые племена демонов (которые можно брать под контроль или просто рекрутить из них). Тоооо есть, тупо берём рецепт "Хранителя подземелий" и расширяем его до стратегической модели мира, как в "Мастере магии" вместо цепочки созданных дизайнерами миссий. Просто. Элегантно. И ни одна сволочь такое даже не попыталась реализовать.
"Просто" - я имею в виду, если смогу ИИ, умеющий вменяемо создавать/менеджить подземелья без слишком многих костылей. Если не смогу - мечта отправится коту под хвост и я останусь с игрой №2 "Месиво Чентры", т.н. утешительный приз, LGPL'ный аналог AOS. Эволюционные алгоритмы мне в помощь.

Игра №4, "Завоеватели Чентры" - ооочень если, если третья взлетит и завоюет популярность, то *расширить* механику до "уже знакомые демоны вторгаются в нормальный фантастический мир стимпанковских анахронизмов". Что будет *реально* дорого по арту.
Третья же... Если взлетит - на неё хватит самопальных текстур и моделей стыренных из OpenArena.

Как было сказано здесь

Опа. Надо обновить.

может ну его нафик эту GPL?

Старая инфа просочилась. Я намереваюсь движок (весь код) - под LGPL, третью игру, по возможности - под LGPL, первую и вторую - под GPL, не корысти ради а волею ассетов из OpenArena.

Добавлено спустя 1 час 47 минут:
P.S. Обновил немножко.

З.З.Ы.
Как копаешь в майнкрафте? Кайло в зубы - и вперёд.
Как копаешь в Хранителе подземелий?
1. Вселился в импа, кайло в зубы - и вперёд
2. Выделил клеточки мышкой - и импы всё сделают, если не передохнут.
Как будет у меня?
1. Взял тоннельную пушку, сканер - и вперёд, на геологоразведку. Пушка умеет только длинные трёхметровые тоннели. Сканер видит только на десять метров. Не нравится? Прокачивай базу, исследуй апгрейды.
2. В удобном 3d интерфейсе разметил новые корридоры и комнаты, свободно перемещая базовые браши в 3d пространстве. Големы всё сделают, если не передохнут.

Как обустраиваешь в майнкрафте? Крафтишь по одному предмету, расставляешь по кубику.
Как обустраиваешь в Хранителе подземелий? Выбрал тип комнаты, обвёл мышью рамочку - чвяк, и всё обустроено, за денюшку.
Как будет у меня? Выделил объём комнаты (не обязательно всей: возможно строительство надземных замков и подземных залов, внутренний объём которых распределяется пост-фактум), указал големам тип отделки стен. Указал какие крафтинговые станции в ней ставить. ИИ понимает, что есть комната, сколько в ней дыр (тупо модифицированный алгоритм распространения света) и где воткнуть дверь. Всё требует ресурсов (опилки для ДСП, дерево для комфортного жилься для миньонов с высоким ЧСВ и т.д.) :roll:

Добавлено спустя 1 час 19 минут 47 секунд:
P.S. По возможности решил забить на целочисленную физику.
- платформы, не способные на побитовое совпадение IEEE 754 остаются с только одиночной игрой (т.е. бессмысленны вплоть до игры №3, т.к. №1 и № 2 - чисто сетевые командные шутаны)
- функции *не* покрытые стандартом (sqrt, sincos) реализуются на гарантированно воспроизводимом велосипеде (маска + bsr + квадратичная интерполяция по нормализованной таблице).
- физика нагло использует все преимущества SSE и AVX 8)
- системы координат таки остаются релятивистскими, ибо вспоминаем, как всё плыло и тряслось на окраинах Морровинда и некоторых уровней Серьёзного Сэма :x
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

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

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

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

Рейтинг@Mail.ru