Отрисовка карты

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

UnCen
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 13.10.2008 (Пн) 16:41

Отрисовка карты

Сообщение UnCen » 10.05.2012 (Чт) 13:23

Добрый день.
Подскажите, как проще всего на VB.NET нарисовать плоскую карту, состоящую из 10-50кило разноцветных квадратов + слой с условными обозначениями. Сейчас программа написана на VB6 и карта отрисовывается через GDI32 несколько секунд, хочу переписать ее на .net с нормальной реализацией графики, в идеале - как в CorelDraw с перемещением и масштабированием. Копать в сторону DirectX или для такой несложной задачи есть инструменты проще?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Отрисовка карты

Сообщение FireFenix » 10.05.2012 (Чт) 22:36

есть WPF на основе DirectX9
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

UnCen
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 13.10.2008 (Пн) 16:41

Re: Отрисовка карты

Сообщение UnCen » 11.05.2012 (Пт) 7:12

Большое спасибо, буду изучать новый материал, до этого с WPF не приходилось сталкиваться.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.05.2012 (Пт) 7:43

С большой вероятностью можно использовать те же функции, что и в VB6.

Я бы просто рисовал в Bitmap'ах (скорее всего, нескольких), а потом их на форме. Только не надо использовать GetPixel и SetPixel - они работают очень медленно. Попиксельную обработку изображения лучше делать через массив байт:
Код: Выделить всё
' BM As Bitmap
Dim BmpData As System.Drawing.Imaging.BitmapData = BM.LockBits(New Rectangle(0, 0, BM.Width, BM.Height), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format24bppRgb)
Dim Ptr As IntPtr = BmpData.Scan0
Dim Bmp(Math.Abs(BmpData.Stride) * BM.Height - 1) As Byte
Runtime.InteropServices.Marshal.Copy(Ptr, Bmp, 0, Math.Abs(BmpData.Stride) * BM.Height)
' ...
BM.UnlockBits(BmpData)
Код: Выделить всё
Dim Res As New Bitmap(PicInfo.Width, PicInfo.Height)
Dim BmpData As System.Drawing.Imaging.BitmapData = Res.LockBits(New Rectangle(0, 0, Res.Width, Res.Height), Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format24bppRgb)
Dim Bmp(PicInfo.Height * PicInfo.Width * 3 - 1) As Byte
' ...
Runtime.InteropServices.Marshal.Copy(Bmp, 0, BmpData.Scan0, PicInfo.Height * PicInfo.Width * 3)
Res.UnlockBits(BmpData)

UnCen
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 13.10.2008 (Пн) 16:41

Re: Отрисовка карты

Сообщение UnCen » 11.05.2012 (Пт) 8:03

Сейчас отрисовка работает через PolyPolygon из gdi32. Просто не хватает гибкости и функциональности ну и в последнюю очередь скорости. Например хочу я переместить карту и изменить масштаб - это полная перерисовка 40.000 объектов (предположим, что карта с сеткой 200*200), в DirectX это делается в одно действие - перемещением камеры, но с ним связываться желания совсем нет.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.05.2012 (Пт) 8:23

UnCen писал(а):это полная перерисовка 40.000 объектов

Использование Bitmap'а для хранения изображения ведь решает эту проблему?

UnCen
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 13.10.2008 (Пн) 16:41

Re:

Сообщение UnCen » 11.05.2012 (Пт) 8:53

Qwertiy писал(а):Использование Bitmap'а для хранения изображения ведь решает эту проблему?


Со скоростью может и решает, но удобство работы с BitMap'ом у меня вызывает сомнения. Попробую оба способа. WPF на первый взгляд, очень заманчивая штука.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 21

    TopList