AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GraphicsContainer

Ein Thema von EWeiss · begonnen am 27. Mär 2017 · letzter Beitrag vom 28. Mär 2017
Antwort Antwort
Seite 2 von 2     12   
EWeiss
(Gast)

n/a Beiträge
 
#11

AW: GraphicsContainer

  Alt 27. Mär 2017, 18:33
Kann es sein das hier niemand eine Ahnung hat (vielleicht abgesehen von Nico) wie man das System zum zeichnen effizient nutzen kann ohne das man soviel CPU last produziert.
Andere Leute können das doch auch.

Ich meine nicht der umstieg auf andere Bibliotheken sondern mit dem was man hat.
GDI+ und OpenGL mixen als Beispiel.

JA ich weis das GDI+ nicht so schnell ist wie GDI aber mit der GDI kann man nun mal nicht alles so machen wie mit GDI+
Ob man GDI+ noch verwenden soll mag dahin gestellt sein.

gruss

Geändert von EWeiss (27. Mär 2017 um 18:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: GraphicsContainer

  Alt 27. Mär 2017, 18:56
GDI+ und OpenGL mixen als Beispiel.
Der große Vorteil von OpenGL ist, dass es wirklich komplett auf der Grafikhardware läuft und direkt alles in die Grafikpipeline geschickt werden kann, z.B. in Form von Primitiven oder Operationen wie Vertexoperationen.
GDI+ und OpenGL bzw. DirectX laufen aber komplett parallel, einer nutzt nicht Teile des anderen.

Das mit GDI+ zu mischen kann ich mir nur vorstellen indem du das Bild mit GDI+ vorbereitest und dann per OpenGL/DirectX in den Videospeicher packst um es dort direkt zu nutzen. Dann stellt sich mir aber die Frage warum du dann noch GDI+ nutzen willst, denn alleine mit OpenGL/DirectX sind die Operationen, die du da machst, ja auch nicht komplizierter als mit GDI+. Im Gegenteil, ich glaube die Konvertierung ist sogar noch komplizierter als das direkt ohne GDI+ zu machen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: GraphicsContainer

  Alt 27. Mär 2017, 19:19
Zitat:
Im Gegenteil, ich glaube die Konvertierung ist sogar noch komplizierter als das direkt ohne GDI+ zu machen.
Hast du schon mal die TextSuite (GDI+) in Verbindung mit OpenGL verwendet?
Ich denke die arbeiten sehr gut zusammen.

Warum soll also wenn ich Text( am ende auch nur ein Bitmap) mit OpenGL Render das nicht auch mit GDI+ Images gehen.
Ich glaube nich das man da so viel konvertieren muss.

PNG bleibt PNG.
Aber gut ich glaube für mein Problem gibt es im Moment keine Lösung daher stell ich das Teil erst mal aufs Abstellgleis.
Und spiele damit noch was rum.

Ich werde da noch still im Kämmerlein mit Threads experimentieren und herausfinden wie ich die CallBack von GDIPDrawImageRectRectI nutzen kann.
Eventuell bringt das einen Schub.
Sicher bin ich dahingehen aber nicht denn letztendlich müssen die Bilder gezeichnet werde.

Danke.

EDIT:
Letztendlich brauche ich einen Container der in der Lage ist verschiedene Zeichnungsoperationen über die Hardware zu schicken.
Scheint mir aber unmöglich zu sein.


gruss

Geändert von EWeiss (27. Mär 2017 um 19:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

AW: GraphicsContainer

  Alt 27. Mär 2017, 23:13
Ich kann dir nur so viel sagen, dass Mixen im Sinne von: "mal ein paar Zeichenoperationen per OpenGL/DirectX und zwischendurch ein Paar mit GDI+" nicht funktioniert. Was allerdings geht: Grafik per GDI+ laden, in Bitmap konvertieren und Dieses dann als OpenGL bzw. DirectX Textur verwenden.

Was mir auffällt ist, dass du bei jedem Zeichenvorgang zuerst einen temporäre DC und eine DIB Section erstellst. Kannst du nicht einfach direkt auf das Target DC zeichnen?

Ansonsten lass vielleicht mal einen Profiler laufen, während die Animation aktiv ist. Dann solltest du recht genau sehen, welche Aufrufe die meiste CPU Zeit verbraten.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: GraphicsContainer

  Alt 27. Mär 2017, 23:23
Zitat:
Was mir auffällt ist, dass du bei jedem Zeichenvorgang zuerst einen temporäre DC und eine DIB Section erstellst. Kannst du nicht einfach direkt auf das Target DC zeichnen?
Nein das gehört zur Performance.
Wenn ich das wegnehme geht alles drunter und drüber.

Mit diesem DC erstelle ich einen Temporären DoubleBuffer.
Also alles was in dieser Prozedure geschrieben wird, wird erst auf ein Bitmap gemalt und dann mit BitBlt auf das eigentliche DC des Containers.

Zitat:
Ansonsten lass vielleicht mal einen Profiler laufen, während die Animation aktiv ist. Dann solltest du recht genau sehen, welche Aufrufe die meiste CPU Zeit verbraten.
Kann ich mal machen aber ich weiß ja das GDIP_DrawImageRectRectI und ShowPngPlayInfos die meiste last verursachen.
Ich denke komme nicht drum herum das Bitmap zwischen zu speichern mit GdipCreateCachedBitmap

Ich schreibe mal den Konverter fertig danach kümmere ich mich nochmal darum.
Danke.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: GraphicsContainer

  Alt 28. Mär 2017, 04:16
Also alles was in dieser Prozedure geschrieben wird, wird erst auf ein Bitmap gemalt und dann mit BitBlt auf das eigentliche DC des Containers.
Das meinte ich ja damit, dass da zu viel passiert.
Kannst du nicht einfach zumindest testweise die Bitmap plus DC für jeden Frame vorhalten so wie du es da schon hast? Bei sehr vielen Frames wird das vielleicht zu viel, aber etwas Luft sollte da schon sein.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

AW: GraphicsContainer

  Alt 28. Mär 2017, 04:26
Also alles was in dieser Prozedure geschrieben wird, wird erst auf ein Bitmap gemalt und dann mit BitBlt auf das eigentliche DC des Containers.
Das meinte ich ja damit, dass da zu viel passiert.
Kannst du nicht einfach zumindest testweise die Bitmap plus DC für jeden Frame vorhalten so wie du es da schon hast? Bei sehr vielen Frames wird das vielleicht zu viel, aber etwas Luft sollte da schon sein.
Schau mal überall im Internet jeder wird dir sagen das es ratsam ist ein Buffer-Bitmap zu erstellen alleine wegen dem Flickern schon.
Man kann nicht einfach alles wahllos auf das DC knallen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: GraphicsContainer

  Alt 28. Mär 2017, 05:43
Das es am saubersten und schnellsten ist die Bilddaten direkt in den Arbeitsspeicher der Grafikkarte zu laden (OpenGL / DirectX), darüber brauchen wir uns nicht unterhalten. Aber da das mit GDI+ nun einmal nicht geht, wäre es trotzdem die schnellste Lösung zum Testen, einfach die schon jetzt erzeugten temporären Daten vorzuhalten.

Denn GdipCreateCachedBitmap hält die Daten ja auch nur im Arbeitsspeicher, nicht im Videospeicher. Zum reinen Performancetest hätte ich jetzt nicht die sauberste Lösung vorgezogen, sondern die am schnellsten implementierte.

Ich wollte damit jetzt nicht sagen, dass das eine bessere Lösung wäre.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#19

AW: GraphicsContainer

  Alt 28. Mär 2017, 05:55
Das es am saubersten und schnellsten ist die Bilddaten direkt in den Arbeitsspeicher der Grafikkarte zu laden (OpenGL / DirectX), darüber brauchen wir uns nicht unterhalten. Aber da das mit GDI+ nun einmal nicht geht, wäre es trotzdem die schnellste Lösung zum Testen, einfach die schon jetzt erzeugten temporären Daten vorzuhalten.

Denn GdipCreateCachedBitmap hält die Daten ja auch nur im Arbeitsspeicher, nicht im Videospeicher. Zum reinen Performancetest hätte ich jetzt nicht die sauberste Lösung vorgezogen, sondern die am schnellsten implementierte.

Ich wollte damit jetzt nicht sagen, dass das eine bessere Lösung wäre.
Wir können da jetzt noch lange Diskutieren.
Schick mir deine Mail über PN und ich schicke dir den Source zu.
Damit du sehen kannst was da ab geht. (Aber bedenke ich bin Hobby Progger)


gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz