Вот код пока не окончательный, нет кнопок сворачивания и закрытия. Закрыть можно панели задач и Alt+F4 Сделал на основе: Там же в архиве версия и для браузера.
Демка не только демка, просто как демка проще версия для браузера. В общем, хотелось сделать шаблон кода для разных демок в том числе версии демок для дос. Использую GdipBitmapSetPixel, нарисовать пиксель в буфере, всё ничего, вот только эта функция весьма тяжёлая, от 1 до 3 тысяч тактов выполняется, если нам надо отрисовать каждый пиксель сцены то тут уже никакой динамики не получиться, 1-2 млн * 1..3 тыс = 0.2..1 сек. Варианты есть, если получить доступ непосредственно к массиву пикселей, то рисовать пиксели можно на скорости несколько тактов, ну ладно 10-20 тактов. Всё равно у нас буфер в ОЗУ, а не в видеопамяти. Я как понял, доступ к буферу можно получить GdipBitmapLockBits, но пока не понятно дели реализации. Кстати, сам код UpdateScene без GdipBitmapSetPixel выполняет несколько сот тактов, может чуть больше 1000, оптимизировать можно синусы если флагами задать минимальную точность float/real4.
Используй буфер и создавай битмап через GdipCreateBitmapFromScan0. Также быстрее будет использовать DIB-секцию, либо просто буфер и выводить его через SetDiBitsToDevice.
Thetrik, а может лучше использовать SetDIBits? Параметров надо вводить меньше. Пока не получается создать локальный буфер, как то сложно сделано. SetBitmapBits не работает как надо.
В общем заработало, ошибки были в неожиданном месте, например в макросе mrm. Так же надо было настроить структуру BITMAPINFO Код (ASM): mov scene.bmiBuff, GlobalAlloc(GPTR, sizeof_BITMAPINFO) ASSUME ecx:ptr BITMAPINFO mov ecx, eax mov [ecx].bmiHeader.biSize, sizeof BITMAPINFOHEADER mrm [ecx].bmiHeader.biWidth, scene.iBuffWidth mov eax, scene.iBuffHeight neg eax mov [ecx].bmiHeader.biHeight, eax mov [ecx].bmiHeader.biPlanes, 1 mov [ecx].bmiHeader.biBitCount, 32 mov [ecx].bmiHeader.biCompression, BI_RGB mrm [ecx].bmiHeader.biSizeImage, scene.iSizeBuff ASSUME ecx:nothing .... UpdateTexture MACRO scene:req SetDIBits(scene.hdcBuffForm, scene.bmBuff, 0, scene.iBuffHeight, scene.lpvBuffBits, scene.bmiBuff, DIB_RGB_COLORS) EXITM <> ENDM Заполняем наш локальный массив пикселей и копируем его UpdateTexture в буфер, который затем рисуем в окно. На очень дохлом ПК фэпес без рендера анимации 262, а было один, да один ФПС. ПэКа: проц Core 2 Duo E7500 2.93 ГГц, видео интегрированное очень слабое. В общем нашёл в мусорке на работе.
SetDIBits и SetBitmapBits обновляют данные в битмапе, но остается еще операция вывода на экран - т.е. получаем 2 действия. При использовании GdipCreateBitmapFromScan0 у нас уже есть буфер и мы рисуем в него как обычно и нам нужно только обновлять на экран - 1 операция. При использовании DIB-секции, мы также имеем буфер и выводим как обычно - 1 операция. При использовании SetDiBitsToDevice у нас также есть буфер который мы сразу выводим на экран - 1 операция. SetDIBits и SetBitmapBits - мы сначала копируем буфер в другой буфер (HBITMAP/DIBSECTION) - 1-я операция, а потом еще этот 2-й буфер выводим на экран (BitBlt/StretchBlt) - 2-я операция. Итого 2 операции вместо 1 и лишний буфер.
Thetrik, ну может так и быстрей. Я же говорю, я отключил генерацию сцены в буфер, т.е. гоняю пустой локальный буфер, экран чёрный, т.к. в локальном буфере нули, чёрный пиксели. И ФПС получаю 262-264, это очень много для такого драндулета(Intel GMA X4500), и на практике не нужно. Хотя вероятно с GdipCreateBitmapFromScan0 будет ещё быстрей, но это уже класс GDIplus, он у меня отделён от простого GDI, потом сделаю и с GDIplus. Главное у меня демка заработала, не эта, а с мандельбротом, и там ФПС всего 5.5, значит заморачиваться с оптимизацией рендера не имеет смысла, надо оптимизировать сам код мандельброта. А то медленновато что-то. А так же надо отрефакторить код, и сам классы, у меня типа ООП. --- Сообщение объединено, 2 апр 2025 в 16:39 --- Кстати, чего я стал использовать буфер, я так боролся с мерцанием, если что-то рисовать сразу в окно, то наблюдается мерцание. Хотя с локальным буфером может и не будет мерцание, но тогда я не смогу рисовать поверх что-то, типа текста или ещё чего.