2009-04-02 16 views
3

als Entwickler von industriellen Vision-Anwendungen habe ich oft ziemlich klobige Bilder wie 6000x4000Pixel und größer.Große Bilder von DirectX schneller anzeigen?

Während die Kamera und die Bildverarbeitung an einem stetigen Strom neuer Bilder arbeiten (und diese Verarbeitung ist die Hauptaufgabe), möchte ich dem Benutzer erlauben, bequem ein anderes Bild parallel zu betrachten.

Doing dies auf dem Prozessor (GDI etc.) stiehlt viel zu viel Leistung. Zum Beispiel dauert es 0,2 Sekunden, um das Bild zu analysieren, aber 0,8 Sekunden, um es mit einem einzigen Zoom zu zeigen (in der Größe angepasst, um etwas Kontrolle zu übernehmen), geschweige denn, dass der Benutzer weitergehen und hineintauchen kann.

Da Photoshop erlaubt, mit Hilfe der sehr schnellen Speicher und Verarbeitung der Grafikkarte zu zeigen und zu zoomen, fragte ich mich, ob jemand mir eine Idee geben kann, wenn und wie ich in meinem eigenen Code experimentieren kann: Push-Daten zu Grafik Karte (wie lange kann dies für meine 76 MB rgb-Daten dauern?) und lassen Sie es in einiger Kontrolle ohne viel Aufwand zu zoomen und bewegen Sie es von Benutzer auf die Steuerung/Karte für Benutzerinteraktion.

Keine Notwendigkeit für 3D-Looks, nur Verschieben und Größenanpassung in einem 2D-RGB-Bild. Ziel ist es, eine schnelle und komfortable Betrachtung mit geringer Prozessorlast zu ermöglichen.

==> Ist das möglich (als Textur oder ähnliches)? ==> Gibt es Einschränkungen bei aktuellen Low-End-3D-Karten von> = 256MB? ==> Kann jemand eine bestimmte Dauer vorschlagen (Daten kopieren, Zoomen)?

Antwort

1

Was ist das Pixelformat? Ihre Größe scheint mit 8-Bit RGB zu funktionieren, ein einzelnes Bild bei 6000x4000 Pixel sollte dann ungefähr 69 MB Speicherplatz benötigen. Es sollte also in den Texturspeicher einer unteren Grafikkarte passen, vorausgesetzt, es gibt nicht zu viel Overhead von Windows und anderen Anwendungen. Sicher, es wird eine Weile dauern, um in den Speicher der Grafikkarte zu laden; Es ist jedoch schwierig, eine Schätzung zu liefern, da diese sehr wahrscheinlich mit der Systemlast und natürlich der Hardware/Bus-Konfiguration variiert.

Ich wäre mehr besorgt über die maximale Grenze für Texturgrößen. Ich denke, dass die heutigen High-End-Karten bei 4096 x 4096 Texeln in einer Textur maximal sind, was bedeutet, dass Sie Ihr Bild nicht in eine einzige Textur einfügen können.

Das Einrichten von DirectX zum Testen sollte nicht zu schwer sein, es gibt viele Tutorials. Here ist ein schneller Link, der zeigt, wie man mit Textur rendert; Sehen Sie sich die vorherigen Teile der gleichen Tutorial-Serie an, um zu erfahren, wie Sie Dinge initialisieren können.

+0

das Bild ist als drei einzelne Ebenen von 8-Bit-grau für R, G und B verfügbar. Um es auf andere Weise zu mischen wird kein Problem sein. Also passt der Speicher in den Speicher, aber nicht auf eine einzelne Textur? Platziert man zwei Ebenen nebeneinander oder bringt es Artefakte mit? Danke für Link und Idee! –

+0

Platzieren Sie eine oder mehrere Ebenen nebeneinander und unterteilen Sie die Bilddaten so, dass sie übereinstimmen. Dies ist die naheliegendste Lösung. Es sollte möglich sein, Texturfilterungsmodi einzustellen, um Artefakte zu vermeiden. Gern können Sie die Antwort auffrischen, wenn es Ihnen hilft. :) – unwind

0

Ich würde empfehlen, dass Sie Format verwenden, das speziell für diese Art von Aufgabe entwickelt wurde. Es ist JPEG2000. Die gewünschten features heißen ROI (Regions of Interest) und progressive Übertragung. Es kann verlustfrei sein, wenn Sie es brauchen.

+0

Danke für die Idee, aber die Codierung der Daten in JPEG2000 dauert etwa volle fünf Sekunden. Dies ist keine Option, da es viel Zeit und Prozessorlast beansprucht. –

+0

Können Sie diese Daten nicht in JPEG2000 speichern oder zwischenspeichern? – vartec

+0

BTW. Sie können das beschleunigen. Siehe z.B. http://www.cse.cuhk.edu.hk/~ttwong/software/dwtgpu/dwtgpu.html – vartec

2

Sie werden durch die maximale Texturgröße (die von Karte zu Karte variiert) begrenzt, so dass Sie Ihr großes Bild in mehrere kleinere Texturen unterteilen müssen. Die tatsächlichen Texturdaten sollten in Ihrem Videospeicher gespeichert werden, solange die Karte AGP oder PCI-E ist.

0

Sie können dies mit Direct3D tun. Es wird problemlos große Bilder zum Schwenken und Zoomen verarbeiten, indem ein strukturiertes Quad gezeichnet wird.

Aufgrund der Größe Ihrer Bilder und der Größe des Bildschirms (Sie haben kein 6Kx4K-Display, oder?), Sollten Sie ein System erstellen, mit dem Sie Ihr großes Bild bei Bedarf in Texturen umwandeln können. Angesichts der Größe Ihrer Eingabedaten werden Sie feststellen, dass die E/A-Bandbreite zwischen der Festplatte und der Karte der dominierende Faktor für die Geschwindigkeit ist, mit der Sie Daten in die Karte einbringen können.Sie können feststellen, dass es sinnvoll ist, eine Methode zum Speichern der Bilder auf einer Festplatte zu erstellen, die die räumliche Kohärenz in zwei Dimensionen ausnutzt (d. H. Ein gekacheltes Speicherlayout, kein Scanline-Speicherlayout) und Punkt-abgetastete Versionen mit niedrigerer Auflösung berechnet. All dies können Sie selbst mit unkomprimiertem RGB tun, Sie benötigen dafür kein JPEG2000. Sie könnten diesen Datenspeicher als Hintergrundprozess mit niedriger Priorität verwenden, sobald er ein Bild ausgewählt hat. Holen Sie zuerst, was auf dem Bildschirm sichtbar sein wird, in die Karte so schnell wie möglich und starten Sie dann das Reorganisieren auf der Festplatte für ein schnelleres Streaming/Zoomen.