#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; }
Комментариев нет:
Отправить комментарий