#wpf #графика
Реализую игру Жизнь Конвея, возникла проблема в "быстром отображении"(под быстром понимается каждые 20 милисеунд на форме(или на канвасе) рисовать около 60000 квадратов) матриц каждого хода. Рисую обычным проходом по битовой матрице и "тупой от рисовкой" на канвас(пример метода ниже), но получается слайд шоу.Есть ли какие-то методы от рисовки больших объемов данных в WPF? public static void DrawOnCanvas(bool[,] matrix, Canvas canvas) { int height = matrix.GetLength(0); int width = matrix.GetLength(1); //размеры матрицы for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { Ellipse eleps = new Ellipse(); //создаю элипс eleps.Height = 4; eleps.Width = 4; if (matrix[j , i] == true ) { eleps.Fill = new SolidColorBrush(Colors.Red); Canvas.SetLeft(eleps, i * 5); Canvas.SetTop(eleps, j * 5); canvas.Children.Add(eleps); //добавляю его на канвас если в атрице 1 } } } }
Ответы
Ответ 1
Вот решение данной "проблемы ", я не знаю как считать fps в wpf приложениях но чисто на глаз матрица 256х256 отображается довольно шустро. public static void DrawOnImage(bool[,] outmatrix, Image img) { WriteableBitmap wb = new WriteableBitmap((int)img.Width, (int)img.Height, 1, 1, PixelFormats.Bgra32, null);//создаем типо битмап указывая ширину и высоту формат пиксилей и чето еще вроде как dpi Int32Rect rect = new Int32Rect(0, 0, (int)img.Width, (int)img.Height); byte[] pixels = new byte[(int)img.Width * (int)img.Height * wb.Format.BitsPerPixel / 8]; int alpha = 255; int red = 0; int green = 0; int blue = 0; int height = outmatrix.GetLength(0); int width = outmatrix.GetLength(1); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if ((outmatrix[j, i] == true)) { red = 255; } else { red = 0; } int pixelOffset = (i + j * wb.PixelWidth) * wb.Format.BitsPerPixel / 8; pixels[pixelOffset] = (byte)red; pixels[pixelOffset + 1] = (byte)green; pixels[pixelOffset + 2] = (byte)blue; pixels[pixelOffset + 3] = (byte)alpha; } int stride = (wb.PixelWidth * wb.Format.BitsPerPixel / 8); //шаги wb.WritePixels(rect, pixels, stride, 0); } img.Source = wb; }
Комментариев нет:
Отправить комментарий