![]() |
Schnelles Upscaling für Bilder
Tag,
und noch ne Performancefrage :). Da diese wieder etwas anders ist, nen neuer thread, dan bleibts getrennt und ist für andere leichter findbar. ALSO: in meinem Aktuellen projekt wird ein 480p Bild auf Bildschirmgröße skaliert. Das geschiet per GDI+ funktionen. Frisst natürlich ordentlich performance wenn man das so 25mal pro sekunde macht :stupid: . Meine Frage wäre an dieser Stelle: Bringt es was das Bild zu laden und anstatt per GDI+ per Graphics32 zu upscalen und dann ans LayeredWindow zu überreichen? Graphics32 soll ja schnell sein im Gegensatz zu den Buildin Delphi Komponennten, aber ich habe keine ahnung wie das im vergleich zu der GDI+ ist, GDI+ müsste doch noch langsamer gewesen sein oder? MFG Memnarch |
AW: Schnelles Upscaling für Bilder
Das wird nicht zwangsweise mit der Lib bzw. API zu tun haben, sondern ggf. mit der verwendeten Resamplingmethode (und deren Qualitätseinstellungen). Das schnellst-mögliche wäre es, wenn du an einen Pointer zu dem Imagebuffer kommst, und händisch eine Nearest-Neighbour-Interpolation machst. Die nächst-effizientere Variante wäre (Bi-)Linieare Interpolation, die schon deutlich schmucker ist, aber auch etwas mehr kostet (ab hier braucht's vor allem Floats). Das ganze einigermaßen smart implementiert ist Kleinkram. Teuer können auch die Umkopiererein in die jeweiligen bibliotheksspezifischen Container sein, die meist nicht ohne irgendwelche Konvertierungen/Prüfungen vonstatten gehen. Soll heissen: Je mehr du selbst das Heft in der Hand hälst, desto mehr hast du die Performance auch wirklich im Griff. APIs und Libs sind komfortabel, aber je nach Kombination kommen einen manche Operationen teurer als man zunächst vermutet.
Anders gesagt: Deine Frage ist sehr unvollständig, da zu klären ist wie du wann wo welche Daten in welcher Weise von was verrechnen lässt, und was für eine Performance dir so vorschwebt. |
AW: Schnelles Upscaling für Bilder
Hallo,
Zitat:
-> dann nach dem Resample puffern. Ändert sich immer nur ein Ausschnitt ? -> nur den Ausschnitt resamplen und das gepufferte Bild schreiben Heiko |
AW: Schnelles Upscaling für Bilder
ACH verzeiht, hatte hier einige Infos vergessen ;).
Ja das bild ändert sich immer Komplett, ist eine Animation. @Medium: Ich guck mal OB und WO ich vllt noch kopiervorgänge einsparen kann :). Solche sampling qualitäten hat die GDI+ bereits integriert. Wenn ich das originalbild in die vergrößerte Zielbitmap zeichne, muss ich nur den gewünschten Modus vorher angeben, sofern ich das bestimmen möchte. EDIT: noch ne Kurze Forue spezifische Frage wnen sie an dieser Stelle gestatet ist ;). Im Bereich Projekte, dürfen da nur fertige oder auch WIPs rein? MFG Memnarch |
AW: Schnelles Upscaling für Bilder
Mal ne andere Frage: Ist es wichtig, dass der Bildschirminhalt immer "aktuell" ist? Wenn nicht, lass das LayeredWindow lieber, denn ich schätze, dass das auch einiges an Performance frisst. Mach doch einfach beim Start einen Screenshot, über den du dann die Einzelbilder selbst blendest. Geht z.B. mit Gr32 oder auch hardwarebeschleunigt mit OpenGL/Direct3D.
|
AW: Schnelles Upscaling für Bilder
frisst nicht viel. der wmanager hat nich viel zu tun. Wenn man LAyered windows benutzt, wird das handling an windows direkt übergeben.
|
AW: Schnelles Upscaling für Bilder
Hast du's getestet?
|
AW: Schnelles Upscaling für Bilder
Ob es viel frisst?
Von dem wa sich am anfang an auslastung gemessen habe, ist es gleichauf wenn nicht sogar etwas performanter als eine normale Form. Und was die regions angeht: ich müsste erstmal gucken wie ich DAs hinbekomme. Soweit ich das verstanden habe sind regionen doch shapes die aus dem fenster ausgeschnitten bzw hinzugefügt werden oder nicht? Dan müsste ich für 5478 Bilder, Vektormasken erstellen...o.O EDIT: Ok habs gesehen, der kalkuliert die regions aus den bildern, aber was ist mit der semitransparenz? EDIT2: Dan geht mir zusätzlich performance fürs berechnen der regionen flöten, die dan eventuell nichtmal mit Semitransparenz zurechtkommen >.< Edit3: Hab ich echt schonwieder meinen eigenen Post geflagged? Ich brauch endlich mal ne neue maus, die klickt andauernd doppelt >.< EDIT4: DAs layered Window frists nicht mehr als ne normale Form die ich so excessive bemale. ;) (layered Window ist glaub ich sogar etwas shcneller gewesen) EDIT5: Achne, das mit den regionen aus Bitmaps war ne Userfunktion^^" |
AW: Schnelles Upscaling für Bilder
Ooooookay, kommen wir also (wieder mal ;) ) zur wichtigsten Frage der Welt: Was willst du am Ende überhaupt erreichen, und worin besteht deine Ausgangssituation? :)
|
AW: Schnelles Upscaling für Bilder
Was ich erreichen will, ist eine Animation die über den Ganzen screen ausgegeben wird.
Such mal bei Youtube nach "Touhou - BadApple", den Screensaver bau ich nach. Das klappt auch inzwischen wirklich gut. Ich habe auch inzwischen das ganze mit 2 Threads am arbeiten, einer der regelmässig die Rohbilder nachpuffert, und der Hauptthread der diese Bild hochskaliert und anzeigt. Nur möchte ichgucken, wo ich noch ein Bisschen die performance verbessern kann. Die Grafikoperationen sind da im Aktuellen schussfeld, und besonders das Upscaling das auch gut was nimmt ;). Gibt auch nochn paar andere stellen an denen ich noch gucken muss^^. MFG Memnarch |
AW: Schnelles Upscaling für Bilder
Du hast also N fertige Einzelbilder, willst diese als Video anzeigen, und sonst nichts? Also keine Interaktion und so Dinge? Warum dann nicht gleich als Videofile und mittels z.B. DSPack abspielen? Da würde der Codec das Scaling übernehmen, welche dies i.A. extrem effzient machen. Zudem wird dann via DirectDraw gezeichnet, was auch noch mal viel raus holt.
|
AW: Schnelles Upscaling für Bilder
Wenn ich das mit SEMITRANSPARENZ zeichnen kann, ok gerne.
Aber für Semitransparenz geht glaub ich z.B. nur unkomprimiertes Avi, da explodiert die HDD bereits^^ |
AW: Schnelles Upscaling für Bilder
Woah okay! Alphablending fullscreen noch oben drauf - das ist auch noch mal ne Hausnummer! Dann würde es langsam Zeit, sich ggf. mit OpenGL oder DirectX auseinanderzusetzen. "SDL" (Simple Direct Media Layer) schwirrt mir auch noch im Kopf rum, ob sich da was für Delphi finden lässt weiss ich aber nicht.
|
AW: Schnelles Upscaling für Bilder
Ich habe vor mich mit DirectX für delphi auseinander zu setzen um einfache Bilder zeichnen zu können.
Dann kann ich meinem Screensaver die Option "Hardwarebeschleunigung" hinzufügen. Standartmässig wäre dann Softwarerendering(Per GDI+ und LeyeredWindow), und wenns der User einschaltet, mit hardwarebeschleunigung.(soweit meine konzeptionelle vorstellung :D). EDIT: wenn alles klappt, kommt heute abend ne erste fassung des Screensavers in die Kategorie Projekte.(da dürfen ja nicht nur vollendsausgereifte projekte sondern auch wips hin, oder o.O) MFG Memnarch |
AW: Schnelles Upscaling für Bilder
Um nochmal zum Topic zurückzukommen.
Im moment benutze ich GDI+ zum laden und resizen der Bilder. Für Graphics32 gibts inzwischen auch ne PNG32 bibliothek(thirdparty, aber wärmstens empfohlen). Mit diesen voraussetzungen sollte es eig. nicht allzuschwer sein die GDI+ komponennten durch Graphics32 bei mir zu ersetzen. Frage ist nur ob ich beim resizen der bilder mit einem performancegewinn rechnen darf. Wenn hier jemand damit erfahrung hat wäre ich echt dankbar :) EDIT: Ah mist. Sry für den doppelpost :(. Kann ich meinen beitrag irgendwie löschen?(zusammenführen?) MFG Memnarch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz