non mi aspettavoCome eseguire correttamente il rendering di bitmap di grandi dimensioni in WPF?
RenderTargetBitmap.Render(visual)
per avere un qualsiasi brano effetti collaterali modifica dei dati bitmap in sé. Sembra che non sia vero. Non riesco a ripeterlo più di 60 volte prima che alcuni brutti artefatti di rendering inizino a succedere.
Come eseguire correttamente il rendering di molti sprite in WPF? Di seguito è riportato il codice per riprodurre il problema.
ho generare sprite in questo modo:
BitmapSource Sprite()
{
var bitmap = new RenderTargetBitmap(
500, 500,
96, 96,
PixelFormats.Default);
var visual = new DrawingVisual();
var rect = new Rect(
new Size(
bitmap.Width,
bitmap.Height));
using (DrawingContext context = visual.RenderOpen())
context.DrawLine(
new Pen(Brushes.Red, 100),
rect.TopLeft,
rect.BottomRight);
bitmap.Render(visual);
bitmap.Freeze();
return bitmap;
}
Ecco la tela di rendere molti di loro:
public BitmapSource Canvas
{
get
{
var bitmap = new RenderTargetBitmap(
1980, 1080,
96, 96,
PixelFormats.Default);
var tiles = 70;
for (int i = 0; i < tiles; i++)
{
var visual = new DrawingVisual();
var rect = new Rect(
bitmap.Width/tiles * i,
0,
bitmap.Width/tiles,
bitmap.Height);
using (DrawingContext context = visual.RenderOpen())
context.DrawImage(Sprite(), rect);
bitmap.Render(visual);
}
bitmap.Freeze();
return bitmap;
}
}
posso vedere questa immagine strana pur essendo i dati legati alla proprietà della tela ...
Perché non si esegue il rendering di quelle 70 tessere in un singolo DrawingVisual e quindi si chiama bitmap.Render una sola volta? Dovresti semplicemente spostare il ciclo 'for' nel blocco' using (DrawingContext ...) '. È inoltre possibile salvare completamente RenderTargetBitmap "interni" disegnando le linee direttamente sul DrawingContext "esterno". – Clemens
Non riesco a rendere i riquadri direttamente, poiché significa che per una singola visuale mantenere i riferimenti a 70 bitmap o più allo stesso tempo. A corto di memoria. Sfortunatamente, ho bisogno di RenderTargetBitmaps "interni" perché Tiles sta inserendo dati raster per la mia applicazione. –
1) Non riesco a riprodurre il problema, anche con 'tiles = 2000'. 2) Posso riprodurre l'eccezione out-of-memory quando si mantengono tutti i riferimenti agli sprite in una singola Visual, ma con circa 855 riquadri anziché 70. Che tipo di hardware grafico stai usando? – dbc