2016-10-14 2 views
0

Ein Codebeispiel wäre nett, aber nur ein paar generische Ratschläge zum besten Umgang mit dieser Situation würden ausreichen.UWP/Win2D - Zeichnung im Speicher speichern

Ich rendere ein Bild auf einem Win2D Canvas. Das Bild besteht zunächst aus dem Zusammenfügen von Bitmaps, um ein großes Bild zu erzeugen. Ich werde das "Base Image" nennen.

Ich verwende dann verschiedene "Draw" -Aufrufe, um das Basisbild zu markieren, und ich platziere auch andere Bitmaps über das Basisbild, um das endgültige Bild zu erstellen.

Der Benutzer kann das Bild in beliebiger Richtung scrollen und/oder das Bild vergrößern und verkleinern. Mausbewegungen werden verfolgt und Tooltip-ähnliche Informationen werden über die Zeichenfläche angezeigt, um dem Benutzer detaillierte Informationen bereitzustellen. Jedes Mal, wenn der Benutzer etwas tut, das das Bild beeinflusst, zeichne ich das gesamte Bild neu. In einigen Fällen besteht das Basisbild aus bis zu 46.000 winzigen Bitmaps.

Selbst mit diesem unnachgiebigen Ansatz zeichnet sich das Bild ziemlich schnell neu auf, aber das fühlt sich an, als wäre es der schlechteste Weg.

Mein Bauchgefühl sagt mir, dass ich das Basisbild einmal rendern, im Speicher behalten und dann nach Bedarf auf die Leinwand kopieren soll. Überlagern Sie anschließend die erforderlichen Bits, um das Bild fertigzustellen. Ich kann kein Material finden, das vorschlägt, wie man zu diesem Zweck eine In-Memory-Bitmap behält. Ich weiß auch nicht, ob das der geeignetste Ansatz ist.

Jede Anleitung oder Vorschläge für die am besten geeignete Vorgehensweise wäre willkommen.

Paul

Antwort

2

Ihre Instinkte sind hier genau richtig - Sie wahrscheinlich nur einmal eine enorme Leistungssteigerung durch Ziehen des Bildes erhalten und dann eine im Cache gespeicherte Version davon wiederverwendet.

CanvasRenderTarget ist der Weg, um darüber zu gehen: Check out https://microsoft.github.io/Win2D/html/T_Microsoft_Graphics_Canvas_CanvasRenderTarget.htm und https://microsoft.github.io/Win2D/html/Offscreen.htm als Startpunkte.

+0

Ich denke, ich hatte die CanvasRenderTarget-Klasse zuvor gesehen, aber "Offscreen" -Artikel machte es plötzlich sinnvoll. Ich werde es versuchen. –

+0

Das sieht so aus, als würde es gut funktionieren. Ich kann die generierte Bitmap einfach zu der "Off-Screen" -Ressource aufbauen und dann die Teile, die ich brauche, auf meine Bildschirm-Ressource kopieren. Ich habe jedoch eine Einschränkung gefunden. Die maximale Breite (und ich nehme auch die Höhe an) des Off-Screen-Bildes darf 16384 nicht überschreiten. Der tatsächliche Fehler ist "MaximumBitmapSizeInPixels für dieses Gerät ist 16384". Das ist etwa 1/4 der Größe, die ich brauche, aber die Einschränkung sagt mir auch, dass die Basisgröße, die ich erstellen wollte, zu groß wäre, um vernünftig zu sein. –

+0

Beachten Sie, dass eine 16384 * 16384-Bitmap (vorausgesetzt, 32-Bit-Farbformat) 1 GB beträgt. Selbst wenn die GPU-Hardware in der Lage wäre, ein so großes Bild zu unterstützen, haben Sie schnell genug Speicher verloren! –

Verwandte Themen