|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Графика в Windows API |
|
Win32 API - Графика в Windows API
|
Новый участник Сообщения: 5 |
Профиль | Отправить PM | Цитировать Требуется вывести в окно большой массив точек (например 800 на 600). Функцией SetPixel это выводится очень долго. Подскажите пожалуйста, есть ли способ более быстрого вывода?
|
|
Отправлено: 23:33, 18-03-2008 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать 1. определись, совместимый код будет или быстрый (не на много)
2. определись как часто будешь переисовываться 3. определись с глубиной цвета (8/16/32 bpp) дальше варианты выбора: 1. используешь функции GDI или DirectX 2. если GDI, то CreateDIBitmap (типа кэширование) либо SetDIBitsToDevice 3. подстрой свой алгоритм под глубину цвета class DrawScreen { enum { scr_width = 800, scr_height=600 }; long screen_[scr_width*scr_height]; BITMAPINFOHEADER bmi_; public: DrawScreen(); long& pixel(int x, int y) {return screen_[max(0,min(x, scr_width)) + scr_width*max(0,min(y, scr_height))];} long& pixel_(int x, int y) {return screen[x + scr_width*y];} void show(); static long Rgb(int r, int g, int b) {return max(0,min(255,r)) | (max(0,min(255,g))<<8) | (max(0,min(255,g))<<16);} } DrawScreen::DrawScreen() : screen_(), bmi_() { bmi_.biSize = sizeof(bmi_); bmi_.biWidth = scr_width; bmi_.biHeight = scr_height; bmi_.biPlanes = 1; bmi_.biBitCount = 32; } void DrawScreen::show() { HDC dc = GetDC(0); SetDIBitsToDevice(dc, 0, 0, scr_width, scr_height, 0, 0, 0, scr_height, screen_, (BITMAPINFO*)&bmi_, DIB_RGB_COLORS); ReleaseDC(0, dc); } // рисуем: DrawScreen screen; for (int x=0; x<800; ++x) screen.pixel(x, 10) = DrawScreen::Rgb(x, 255-x, 128-x); screen.show(); |
Отправлено: 07:53, 19-03-2008 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать pva, а возможны варианты с GDI+? Я видел, что в реальном коде, он принимался где нужна прозрачность, градиент для VB .NET.
И как насчёт OpenGL? |
Отправлено: 16:14, 19-03-2008 | #3 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Спасибо за ответ. На самом оказалось что мне не хватало функции ReleaseDC(hWnd,DC). Ее нет в стандартном коде и это сильно запутывает понимание.
|
Отправлено: 19:10, 19-03-2008 | #4 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Попробуйте использовать функции BitBlt и CreateCompatibleDC. Вторая создаёт виртуальный контекст устройства, на котором и можно рисовать: SetPixel, DrawLine и т.п. После чего копируйте образ из виртуального в обычный контекст с помощью функции BitBlt. Функция BitBlt очень быстрая. На виртуальном контексте тоже всё очень быстро "прорисовывается". Деталей я не помню, но идея именно такая. Удачи.
|
|
Отправлено: 21:17, 20-03-2008 | #5 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать podsyp, нечто похожее на DirectXкий z-буфер.
|
Отправлено: 21:19, 20-03-2008 | #6 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Раз мы уже начали говорить о графике в win32, то не мог бы кто-то пояснить,чем принципиально отличается GDI от OpenGL?
Например,при создании окна необходимо похоже проинициализировать пиксельный формат с помощью структуры PIXELFORMATDESCRIPTOR.Так вот в ней можно выставить флаг либо PFD_SUPPORT_GDI, либо PFD_SUPPORT_OPENGL... |
------- Отправлено: 00:01, 21-03-2008 | #7 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата Admiral:
Цитата podsyp:
|
||
Отправлено: 07:28, 24-03-2008 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Графика в PascalABC | verdix | Флейм | 3 | 12-10-2010 16:06 | |
[решено] Несоответствие PHP API и Module API | Negativ | Программное обеспечение Linux и FreeBSD | 6 | 10-04-2007 19:53 | |
Win32 API | Нужна помошь по API функциям! | vasika_hk | Программирование и базы данных | 2 | 23-05-2006 09:51 | |
Графика в С++ | mask | Программирование и базы данных | 15 | 04-06-2003 19:51 | |
графика и JavaScript | Vlad Drakula | Вебмастеру | 1 | 04-03-2003 20:01 |
|