Temat: Rysowanie w WPF

Jeśli chodzi o Windows Forms i Graphics to jest normalnie
private void DrawLines()
{
Random rand = new Random();
Graphics grf = this.CreateGraphics();
try
{
Pen pen;
for (int i = 0; i < 15 * 1000; i++)
{
if (rand.Next(2) == 0)
pen = new Pen(Brushes.Aqua);
else
pen = new Pen(Brushes.Brown);
using (pen)
grf.DrawLine(pen, rand.Next(100), rand.Next(100), rand.Next(100), rand.Next(100));
}
}
finally
{
grf.Dispose();
}
}

15 tysięcy linii w ciągu sekundy. (czy da się to jakoś zoptymalizować?)
Gdy rysuję z wykorzystaniem WPF i DrawingContext to postępuję według http://stackoverflow.com/questions/1150060/how-to-draw....
Pierwszy problem to bardzo długi czas oczekiwania, który skrócił się zdecydowanie gdy zamroziłem pen : drawingPen.Freeze();

public void DrawLines()
{
// _children = new VisualCollection(this);
Random rand = new Random();
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dx = dv.RenderOpen())
{
Pen drawingPen = new Pen(Brushes.Black, 1);
drawingPen.Freeze();
for (double i = 0; i < 10000; i = i + 0.1)
{
double x0 = rand.Next(100);
double y0 = rand.Next(100);
double x1 = rand.Next(100);
double y1 = rand.Next(100);
dx.DrawLine(drawingPen, new Point(x0, y0), new Point(x1, y1));
}
}
// _children.Add(dv);
}

Tylko problem, bo nic u mnie nie rysuje. Opuściłem _children.Add(dv) - co to jest _children? zmienna, property? W przykładzie jest FrameworkElement, u mnie MainWindow : Window, które też dziedziczy z FrameworkElement, ale nie ma czegoś takiego jak _children.
Zamrażanie pena bardzo przyśpiesza, jednak nie chcę rysować wszystkich linii w jednym kolorze, mam tysiące elementów, każdy w swoim kolorze, jak to wydajnie narysować?

Temat: Rysowanie w WPF

http://msdn.microsoft.com/en-us/library/system.windows... jest przykład na WriteableBitmap. W przykładzie rysowane są poszczególne piksele, czy można tam rysować linie i czy będzie szybsze?

konto usunięte

Temat: Rysowanie w WPF

Andrzej Borucki:
http://msdn.microsoft.com/en-us/library/system.windows... jest przykład na WriteableBitmap. W przykładzie rysowane są poszczególne piksele, czy można tam rysować linie i czy będzie szybsze?

Linie powstają z pikseli więc jak sobie je narysujesz odpowiednio to powstanie ;) (kłaniają się stare książki do grafiki i tutoriale jak narysować linię w asm :)). I tak - będzie szybsze, choć tu też wszystko zależy jak zaimplementujesz rysowanie linii.
Kamil Sławiński

Kamil Sławiński Senior iOS Developer

Temat: Rysowanie w WPF

Do rasteryzacji linii służy algorytm Bresenhama

Temat: Rysowanie w WPF

Zrobiłem według algorytmu z polskiej Wikipedii, działa bardzo szybko; przyśpieszyło jeszcze gdy zamiast do wskaźnika dodawać przesunięcie wyliczone z (x,y) przez mnożenie przez szerokość bitmapy i 4 bajty na 32 bitowy kolor, dodaję odpowiednią wartość stałą przy przesuwaniu się punktu. Ale trzeba by jeszcze przyciąć, bo gdy linia wychodzi z jednej strony, to pokazuje się z drugiej strony bitmapy, o ile się jeszcze zmieści w bitmapie. Ale oprócz linii trzeba by rasteryzować koła, elipsy, ich łuki oraz być może krzywe Beziera.
Nie dało się dziedziczyć po WriteableBitmap (jest sealed), trzeba było napisać inną klasę. Natomiast na RenderTargetBitmap daje się rysować, ale nie ma dostępu do bitów. Czy dało by się napisać taką uniwersalną klasę bitmapy gdzie byłby dostęp do bitów oraz byłoby Render(drawingVisual)

Następna dyskusja:

WPF/MVVM i rysowanie wykresów




Wyślij zaproszenie do