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

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 360
  • 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ů: 3544
  • Karma: 112
    • 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ů: 138
  • Karma: 11
    • Verze Delphi: Delphi 12.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ů: 3544
  • Karma: 112
    • 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ů: 360
  • 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ů: 138
  • Karma: 11
    • Verze Delphi: Delphi 12.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ů: 360
  • 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ů: 138
  • Karma: 11
    • Verze Delphi: Delphi 12.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ů: 3544
  • Karma: 112
    • 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ů: 360
  • 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ů: 360
  • 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ů: 3544
  • Karma: 112
    • 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ů: 3544
  • Karma: 112
    • 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ů: 360
  • 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ů: 360
  • 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.