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

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Firemonkey 3D je pomalé
« kdy: 18-01-2021, 10:26:29 »
Vážená komunito,

chtěl jsem ve Firemonkey vytvořit 3D kreslení technického výkresu složeného z čar. Dal jsem tedy na formulář viewport, kameru a dummy objekt. V OnRender dummy objektu jsem na jeho Context3D začal kreslit pomocí DrawLine. Plán se nakreslil, ale celkově je renderování cca 50x !!! pomalejší než renderování v OpenGL. V podstatě jedno vykreslení ve Firemonkey 3D trvá cca 2,5 sekundy a v takovém případě nelze provádět rozumný zoom, pan a jiné funkce. Dále mě zarazila absence možnosti definovat tloušťky a stylu čáry. Firemonkey 3D asi nevymýšleli "CADysti".

Zkoušel jsem hledat nějaké funkce/property které by mohli renderování zrychlit, ale bez úspěchu. Je to prostě šíleně pomalé. Navíc nelze nad překreslováním převzít kontrolu a tak si viweport renderuje kdy potřebuje, což u této rychlosti je problematické a celá aplikace se pak nepředvídatelně cuká.

Řešil zde někdo podobný problém? Jak zrychlit 3D renderování ve Firemonkey?

Děkuji.









Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2947
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #1 kdy: 18-01-2021, 10:35:02 »
Platforma?
Embarcadero MVP - Czech republic

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 113
  • Karma: 11
    • Verze Delphi: Delphi 10.2
Re:Firemonkey 3D je pomalé
« Odpověď #2 kdy: 18-01-2021, 10:38:35 »
Verze Delphi a OS + něco málo o grafice a fragment kódu jak to vykresluješ...?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2947
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #3 kdy: 18-01-2021, 11:05:15 »
Mne neprijde ze by to bylo obecne pomale - "c:\Users\Public\Documents\Embarcadero\Studio\21.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ModelViewer\Model3D.dproj"
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #4 kdy: 18-01-2021, 11:07:59 »
Delphi Tokyo a platforma Windows.

Celý kód tak jako ho mám by nebyl moc přehledný, protože technický výkres mám v komplexní struktuře. Princip kreslení:

Kamera na pozici 0, 0, -1000 a kouká na pozici 0, 0, 0
DummyPlan na pozici 0, 0, 0

Viewport3D je na FMX formuláři a má nastavenou kameru, viz. víše. Pod Viewport3D je Kamera a DummyPlan. V DummyPlan.OnRender mám toto kreslení:

Kód: Delphi [Vybrat]
  1. procedure TForm1.OnRender(Sender: TObject; Context: TContext3D);
  2. var
  3.   i: integer;
  4. begin
  5.   if Context.BeginScene then
  6.   try
  7.     for i := 0 to length(SLines) - 1 do
  8.       with SLines[i] do
  9.         Context.DrawLine(TPoint3D.Create(BeginX, BeginY, 0), TPoint3D.Create(EndX, EndY, 0), 1, TAlphaColorRec.Yellow);
  10.  
  11.   finally
  12.     Context.EndScene;
  13.   end;
  14. end;
  15.  

V OnRender se nic nepočítá, neparsuje atd. Prostě se jen nakreslí čáry. Velmi podobný princip v OpenGL je 50x rychlejší.

Děkuji. 



Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 113
  • Karma: 11
    • Verze Delphi: Delphi 10.2
Re:Firemonkey 3D je pomalé
« Odpověď #5 kdy: 18-01-2021, 11:33:10 »
Otestuj jakej použije FMX canvas: https://parnassus.co/firemonkey-canvas-classes-and-a-bugfix-to-speed-up-your-apps/

Dále bych zkusil použít Parallel loop:
Kód: Delphi [Vybrat]
  1. Parallel.ForEach(0, length(SLines) - 1).Execute(
  2.   procedure (const i: integer)
  3.   begin
  4.     with SLines[i] do
  5.         Context.DrawLine(TPoint3D.Create(BeginX, BeginY, 0), TPoint3D.Create(EndX, EndY, 0), 1, TAlphaColorRec.Yellow);
  6.   end);
  7.  

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #6 kdy: 18-01-2021, 11:38:16 »
Otestuj jakej použije FMX canvas: https://parnassus.co/firemonkey-canvas-classes-and-a-bugfix-to-speed-up-your-apps/

Tak tento článek jsem dnes ráno četl :) ....

Zkoušel jsem pár pokusů s vložením kódu před Application.Initialize. Ale vše jsem zrušil, protože to zrychlení pro 3D nepřineslo (spíše možná zpomalení) a navíc pak bylo horší písmo TText a některé jiné komponenty jako TRectangle pak zlobily.

 

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 113
  • Karma: 11
    • Verze Delphi: Delphi 10.2
Re:Firemonkey 3D je pomalé
« Odpověď #7 kdy: 18-01-2021, 12:38:33 »
Tak tento článek jsem dnes ráno četl :) ....

A co teda tvůj program používá za canvas?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2947
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #8 kdy: 18-01-2021, 13:31:35 »
A kolik je SLines polozek?
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #9 kdy: 18-01-2021, 15:00:07 »
A kolik je SLines polozek?

SLines položek je cca 56000.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #10 kdy: 18-01-2021, 15:07:24 »
Tak tento článek jsem dnes ráno četl :) ....

A co teda tvůj program používá za canvas?

No to nevím. Pro 2D je to TCanvas2D. Pro 3D nevím. Ten článek je dost starý a nevím zda vůbec zohledňuje 3D.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2947
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #11 kdy: 18-01-2021, 15:52:35 »
A kolik je SLines polozek?

SLines položek je cca 56000.

Pouzij primo Context.DrawLines, tj. neco jako

Kód: Delphi [Vybrat]
  1. OnRender:
  2. var
  3.   Ver: TVertexBuffer;
  4.   Idx: TIndexBuffer;
  5.   Mat: TColorMaterial;
  6. begin
  7.   Idx := nil;
  8.   Ver := nil;
  9.   Mat := nil;
  10.   try
  11.     Ver := TVertexBuffer.Create([TVertexFormat.Vertex], 2);
  12.     Idx := TIndexBuffer.Create(2);
  13.     Mat := TColorMaterial.Create;
  14.     Mat.Color := Color;
  15.     Idx[0] := 0;
  16.     Idx[1] := 1;
  17.  
  18.     for i := 0 to length(SLines) - 1 do
  19.       with SLines[i] do
  20. begin
  21.     Ver.Vertices[0] := TPoint3D.Create(BeginX, BeginY, 0);
  22.     Ver.Vertices[1] := TPoint3D.Create(EndX, EndY, 0);
  23.     Context.DrawLines(Ver, Idx, Mat, Opacity);
  24. end;
  25.  
  26.   finally
  27.     Idx.Free;
  28.     Ver.Free;
  29.     Mat.Free;
  30.   end;
  31.  
tim se usetri IMHO spousta casu.

ps: pisu to z hlavy, takze pripadne syntax errory toleruj
« Poslední změna: 18-01-2021, 15:56:52 od Radek Červinka »
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2947
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #12 kdy: 18-01-2021, 15:57:45 »
a zapomnel jsem na Context.BeginScene a spol.
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #13 kdy: 19-01-2021, 07:20:49 »
a zapomnel jsem na Context.BeginScene a spol.

Vyzkoušel jsem a je vidět drobné zrychlení. Pořád je to ale pod 1FPS což je mizérie. Podařilo se mi rozběhat OpenGL pod FMX s renderováním do panelu tak jako u VCL, takže Firemonkey 3D prozatím zavrhuji. 

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #14 kdy: 19-01-2021, 11:20:23 »
a zapomnel jsem na Context.BeginScene a spol.

Možná by ještě pomohlo vypnutí AntiAliasingu pro Viewport3D. Čáry to kreslí sice hezké, ale mají tloušťku cca 3 pixely vlivem AntiAliasingu. Nenašel jsem ale nic, čím by to šlo vypnout. Nevíte, jak by šlo toto změnit, popřípadě jinak ubrat na kvalitě za účelem získání lepší rychlosti?

Děkuji.

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 113
  • 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ů: 113
  • 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ů: 307
  • 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ů: 2947
  • Karma: 108
    • 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ů: 307
  • 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ů: 1245
  • Karma: 51
    • 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ů: 415
  • 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ů: 113
  • 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ů: 2947
  • Karma: 108
    • 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ů: 2947
  • Karma: 108
    • 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ů: 307
  • 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ů: 2947
  • Karma: 108
    • 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ů: 2947
  • Karma: 108
    • 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ů: 307
  • 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ů: 307
  • 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.

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 415
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Firemonkey 3D je pomalé
« Odpověď #30 kdy: 20-01-2021, 14:40:47 »
Proc se vlastne musi delat priprava v tom renderu ? Neslo by to nekam prehodit (a taky pocitat na vice vlaknech) a pak jen zobrazit ? Pred nejakou dobou jsem zapasil s vykreslovanim (2D tedy) a celkove mi to zaclo chodit az prave v teto metode (ekvivalentu pro 2D). Uz si nepamatuju co a jak, ale priprava bitmapy a jeji nasledne pouze zkopceni v renderu vykazovalo psi kusy.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 307
  • Karma: 0
Re:Firemonkey 3D je pomalé
« Odpověď #31 kdy: 21-01-2021, 07:05:41 »
Samozřejmě, že by šlo vytvořit si globální pole vertexů jinde a měnit jej pouze pokud je potřeba. Nedomnívám se ale, že při dnešních CPU je jednoduchý matematický cyklus motající 500000x nějaká zátěž. Na tomto místě se moc neušetří. Problém vidím v 3D engine starající se o kreslení.   

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2947
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Firemonkey 3D je pomalé
« Odpověď #32 kdy: 21-01-2021, 08:53:03 »
>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.

Proc za sebou a par set? Tak prvni vykreslim vse co je priklad cervene plne, pak zlute plne, pak cervene carkovane, pak zlute plne. Zas tak kombinaci tam neni ne?
Embarcadero MVP - Czech republic

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1245
  • Karma: 51
    • Verze Delphi: 10.3
Re:Firemonkey 3D je pomalé
« Odpověď #33 kdy: 21-01-2021, 09:07:32 »
Excellent
Rated 1 time
>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.

Proc za sebou a par set? Tak prvni vykreslim vse co je priklad cervene plne, pak zlute plne, pak cervene carkovane, pak zlute plne. Zas tak kombinaci tam neni ne?

Pokud by vykreslil např. nejprve všechny červené a pak všechny žluté čáry, budou se mu překrývat jinak, než je tomu na výkrese (víc to samozřejmě vynikne u ploch než u čar).