Autor Téma: Firemonkey 3D je pomalé  (Přečteno 1182 krát)

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 107
  • Karma: 11
    • Verze Delphi: Delphi 10.2
Re:Firemonkey 3D je pomalé
« Odpověď #15 kdy: 19-01-2021, 11:25:02 »
Dá se nastavit u formu Quality := HighPerformance

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 107
  • Karma: 11
    • Verze Delphi: Delphi 10.2
Re:Firemonkey 3D je pomalé
« Odpověď #16 kdy: 19-01-2021, 11:30:17 »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 255
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #17 kdy: 19-01-2021, 11:54:28 »
Jak máš nastaveno GlobalUseGPUCanvas ?
http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Types.GlobalUseGPUCanvas

Zkoušel jsem měnit Quality property u Formu a nevidím rozdíl.

GlobalUseGPUCanvas mám asi defaultně na false. Když jej dám na true, tak je vše ošklivé, tj. i písmo a jiné grafické objekty.

Rád bych FMX tlačítka a texty měl na nejvyšší kvalitu, ale Viewport pro 3D dal bez antialiasingu, nejlépe i snížil pixelformát a tak. To je přeci jasné pro každé 3D "engine". Nechápu proč by to nemělo nějak jít.


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2796
  • Karma: 105
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #18 kdy: 19-01-2021, 12:05:02 »
Quality je property Canvas na který se vykresluje.
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 255
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #19 kdy: 19-01-2021, 14:29:09 »
Quality je property Canvas na který se vykresluje.

Prostě kvalita čar je omezená. Styl vůbec. Narazil jsem na další problém. Kameru mám na pozici 0, 0, -1000 a cokoliv nakreslím dál než 1000 jednotek od kamery, tak není vidět. Nějak se nastavila renderovací vzdálenost na 1000. Nevíte náhodou kde to nastavit? Prošel jsem viewport a kameru, ale nic, co by naznačovalo renderovací vzálenost. To jsou základy, bez kterých nemůže žádné 3D existovat. Asi budu muset napsat do Embarcadero :(
« Poslední změna: 19-01-2021, 14:30:50 od age.new »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1147
  • Karma: 49
    • Verze Delphi: 10.3
Re:Firemonkey 3D je pomalé
« Odpověď #20 kdy: 19-01-2021, 22:31:22 »
FMX se snažím vyhýbat :-), ale letmo jsem se díval, jak je udělané TCanvasGpu.DoDrawLine, a tam používají FStrokeBuilder, který asi pro čáru vytvoří trojúhelníky a ty pak nechají vykreslit. Možná by tedy stačilo mít už ten StrokeBuilder s trojúhelníky pro všechny čáry připravený a jen ho předávat k vykreslení, to by mohlo být mnohem rychlejší.

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 383
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Firemonkey 3D je pomalé
« Odpověď #21 kdy: 20-01-2021, 09:34:06 »
Optimalizace kodu bohuzel tomuto produktu chybi a je to videt vsude mozne - viz diskuse o kamere v mobilu a rychlosti vykreslovani (rozdil 8* v nekterych pripadech). Komplet kod je psan rychle, ne kvalitne a to se pak samozrejme projevuje. Zde netusim, s 3D jsem nemel odvahu ani zacit, ale zkusil bych intensivne googlit a projizdet qc (nevim jestli se tam uz google dostane). Tam jsem nasel opravu pro tu kameru.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 107
  • Karma: 11
    • Verze Delphi: Delphi 10.2
Re:Firemonkey 3D je pomalé
« Odpověď #22 kdy: 20-01-2021, 10:40:08 »
U FMX je u každýho release seznam oprav fakt dlouhej, možná by stálo za to, udělat nějaký demo a přeložit to na poslední verzi, jestli to není vyřešeno/opraveno...

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2796
  • Karma: 105
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #23 kdy: 20-01-2021, 10:42:25 »
Excellent
Rated 1 time
Tak abychom to ukoncili, tohle plynule zobrazuje a animuje v 3D 500.000 čar. Pokud se upraví i material, tak se da měnit cokoliv, třeba pokryti texturou.
To jen k tomu jak je FMX navrzena, viz. C:\Users\Public\Documents\Embarcadero\Studio\21.0\Samples\Object Pascal\Multi-Device Samples\User Interface\LowLevel3D

Dekujeme za názor raule. Ad camera: je to v reseni.

Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm3D)
  3.     procedure Form1Render(Sender: TObject; const Context: TContext3D);
  4.     procedure Timer1(Sender: TObject);
  5.   private
  6.     { Private declarations }
  7.   public
  8.     { Public declarations }
  9.   end;
  10.  
  11. var
  12.   Form1: TForm1;
  13.  
  14. implementation
  15.  
  16. {$R *.fmx}
  17.  
  18. uses
  19.   System.Math.Vectors;
  20.  
  21. { TForm1 }
  22.  
  23. procedure TForm1.Form1Render(Sender: TObject; const Context: TContext3D);
  24. var
  25.   Ver: TVertexBuffer;
  26.   Idx: TIndexBuffer;
  27.   Mat: TColorMaterial ;
  28.   x: Integer;
  29. const
  30.   ci = 1000000;
  31. begin
  32.   // Set Vertices
  33.   Ver := TVertexBuffer.Create([TVertexFormat.Vertex], ci);
  34.   for x := 0 to (ci div 2)-1 do
  35.   begin
  36.     Ver.Vertices[x*2] := Point3D(-x, x, x*2);
  37.     Ver.Vertices[x*2+1] := Point3D( x, x, x*2);
  38.   end;
  39.   // Set Indices
  40.   Idx := TIndexBuffer.Create(ci);
  41.   for x := 0 to ci-1 do
  42.     Idx[x] := x;
  43.  
  44.   // Set matrix
  45.   Context.SetMatrix(TMatrix3D.CreateRotation(Point3D(1,0,0), DegToRad(Tag)));
  46.   // Set states
  47. //  Context.SetContextState(TContextState.csAllFace);
  48.   // Create material
  49.   Mat := TColorMaterial.Create;
  50.   mat.Color := TAlphaColorRec.Green;
  51.   // render
  52.   context.DrawLines(ver, idx, mat, 1);
  53.   Mat.Free;
  54.   Ver.Free;
  55.   Idx.Free;
  56. end;
  57.  
  58. procedure TForm1.Timer1(Sender: TObject);
  59. begin
  60.   Tag := Tag + 1;
  61.   Invalidate;
  62. end;
  63.  
  64. DFM:
  65. object Form1: TForm1
  66.   Left = 0
  67.   Top = 0
  68.   Caption = 'FireMonkey Low-Level 3D Example'
  69.   Color = xFF284A5E
  70.   ClientHeight = 412
  71.   ClientWidth = 320
  72.   FormFactor.Width = 2077
  73.   FormFactor.Height = 1273
  74.   FormFactor.Devices = [Desktop]
  75.   OnRender = Form1Render
  76.   DesignerMasterStyle = 0
  77.   object Timer1: TTimer
  78.     Interval = 33
  79.     OnTimer = Timer1
  80.   end
  81. end
  82.  
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2796
  • Karma: 105
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #24 kdy: 20-01-2021, 11:05:52 »
U FMX je u každýho release seznam oprav fakt dlouhej, možná by stálo za to, udělat nějaký demo a přeložit to na poslední verzi, jestli to není vyřešeno/opraveno...

Ne, to je nepochopenim na co je Vertex buffer.
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 255
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #25 kdy: 20-01-2021, 11:48:23 »
U FMX je u každýho release seznam oprav fakt dlouhej, možná by stálo za to, udělat nějaký demo a přeložit to na poslední verzi, jestli to není vyřešeno/opraveno...

Ne, to je nepochopenim na co je Vertex buffer.

Je to pěkný příklad. V podstatě to mám tak jak jste psal v jednom z předchozích příspěvků s využitím TVertexBuffer. Jde o to, že já dopředu nemám vytvořený VertexBuffer pro celý plán a jelikož se mi mění barva čar (tj. jiný materiál) a vytvářím i čárkované čáry, tak nemohu použít způsob, který jste uvedl. Prováděl jsem i testy s vytvářením TVertexBuffer a jeho zvětšováním dle potřeby, ale pak se jeden snímek renderoval desítky vteřin.

Zkusím si vymyslet nějaký analyzující kód, který vrátí pole TVertexBufferů, TIndexBufferů a TColorMaterialů podle toho jak jdou čáry za sebou. Aby se minimalizoval jejich počet a dopředu definoval jejich velikost. I tak jich ale bude pár set.

PS: To je nějaký oficiální příklad? Je zajímavé, že nepoužívají BeginScene a EndScene.

Děkuji.
« Poslední změna: 20-01-2021, 11:51:59 od age.new »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2796
  • Karma: 105
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #26 kdy: 20-01-2021, 12:15:00 »
Mne spise zaujalo ze ten TVertexFormat nemusi byt jen Vertex, ale i Color0, Color1 ...
Ale co s tim fakt nevim. Jinak OnRender je volana uz v BeginScene.
Kód: Delphi [Vybrat]
  1.   Ver := TVertexBuffer.Create([TVertexFormat.Vertex, TVertexFormat.Color0 ], ci);
  2.   for x := 0 to (ci div 2)-1 do
  3.   begin
  4.     Ver.Vertices[x*2] := Point3D(-x, x, x*2);
  5.     ver.Color0[x*2] := TAlphaColorRec.Red;
  6.     Ver.Vertices[x*2+1] := Point3D( x, x, x*2);
  7.     ver.Color0[x*2 +1] := TAlphaColorRec.Darkviolet;
  8.   end;
  9.  
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2796
  • Karma: 105
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #27 kdy: 20-01-2021, 12:24:31 »
Jeste v tom odkazovanem prikladu ma vlastni material, a tam meni barvu viz. TMyMaterial.DoApply , treba ti to pomuze.
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 255
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #28 kdy: 20-01-2021, 13:53:16 »
Jeste v tom odkazovanem prikladu ma vlastni material, a tam meni barvu viz. TMyMaterial.DoApply , treba ti to pomuze.

To jsem nepochopil. Definovat barvu vertexu mi dává logiku a vyřešilo by mi to spoustu problémů. Zkusím to prozkoumat.

Jinak jsem byl v kontaktu s podporou a zjistilo se, že je "near" a "far" renderovací vzdálenost NATVRDO zakódovaná na 1 a 1000 v Delphi viz kód níže. Je to i na více místech. Takže vše mimo tento rozsah se prostě nevyrenderuje :( .... snad bude brzo FIX.

Kód: Delphi [Vybrat]
  1. function TContext3D.GetProjectionMatrix: TMatrix3D;
  2. var
  3.   M: TMatrix3D;
  4. begin
  5.   if FRecalcProjectionMatrix then
  6.   begin
  7.     if SameValue(FHeight, 0.0, Epsilon) then
  8.       Result := TMatrix3D.CreatePerspectiveFovRH(DegToRad(FCurrentAngleOfView), 1.0, 1.0, 1000.0)
  9.     else
  10.       Result := TMatrix3D.CreatePerspectiveFovRH(DegToRad(FCurrentAngleOfView), FWidth / FHeight, 1.0, 1000.0);
  11.     if (FRenderToMatrix.m41 <> 0) or (FRenderToMatrix.m11 <> 1) then
  12.       Result := Result * FRenderToMatrix;
  13.     M := TMatrix3D.Identity;
  14.     M.m41 := FCenterOffset.X;
  15.     M.m42 := FCenterOffset.Y;
  16.     FProjectionMatrix := Result * M;
  17.     FInvProjectionMatrix := FProjectionMatrix.Inverse;
  18.     FRecalcProjectionMatrix := False;
  19.   end;
  20.   Result := FProjectionMatrix;
  21. end;
  22.  

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 255
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #29 kdy: 20-01-2021, 14:11:28 »
Tak abychom to ukoncili, tohle plynule zobrazuje a animuje v 3D 500.000 čar.

Když jsou všechny čáry v zorném úhlu kamery, tak se to cuká. Tipoval bych tak 2 až 3 FPS. Jestli Vám to jde plynule, tak asi máte výkonnější počítač. Těch 60000 úseček je ale celkem přijatelných - s tím už se dá pak něco dělat.