http://www.dotfix.net/module.php?module=@6e786b36726e7776636b75 писал(а):Данный модуль предназначен для демонстрации того, как можно
в DOS записать информацию о пикселе непосредственно в видеопамять
минуя прерывания BIOS.
Посмотрел, реализовано через SetDIBitsToDevice.Я реализовал вывод через DIB с прямой записью в граффические данные.
VT писал(а):Посмотрел, реализовано через SetDIBitsToDevice.Я реализовал вывод через DIB с прямой записью в граффические данные.
Есть мощнее.
CreateDIBSection.
Эта функция возвращает указатель на данные диба, в который можно писать напрямую.
Но бяка в том, что в VB такой доступ требует некоторых приемов: надо создать массив, ссылающийся на этот самый указатель. По этому поводу есть статья.
А чтобы то, что было записано в диб, появилось на экране, надо всего лишь вызвать метод Refresh того объекта, в который этот диб выбран.
И еще замечу, что в этой самой программе долго происходит заполнение массива. А SetDiBitsToDevice выполняется моментально.
Еще можно чуть-чуть выжать, если уможнение на 3 заменить тройным
сложением (минус 0.8 сек на 30 циклов).
Public Sub draw()
Dim yc As Long, xc As Long
Dim bi24BitInfo As BITMAPINFO, bDWords() As Long
With bi24BitInfo.bmiHeader
.biSize = Len(bi24BitInfo)
.biBitCount = 32
.biCompression = BI_RGB
.biPlanes = 1
.biWidth = 300
.biHeight = 608
ReDim bDWords(0 To .biWidth - 1, 0 To .biHeight - 1)
End With
For yc = LBound(bDWords, 2) To UBound(bDWords, 2)
For xc = LBound(bDWords, 1) To UBound(bDWords, 1)
bDWords(xc, yc) = ((vbRed And &HFF0000) \ &H1000000) Or (vbRed And &HFF00&) Or ((vbRed And &HFF&) * &H10000)
Next xc
Next yc
SetDIBitsToDevice mfrm.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bDWords(LBound(bDWords, 1), LBound(bDWords, 2)), bi24BitInfo, DIB_RGB_COLORS
End Sub
Я имел в виду процесс заполнения массива, а не вывод его на экран.Почему заполнение массива происходит долго? Как можно быстрее?
Sub draw()
Dim yc As Integer, xc As Integer
Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
With bi24BitInfo.bmiHeader
.biBitCount = 24
.biCompression = BI_RGB
.biPlanes = 1
.biSize = 40
.biWidth = 608
.biHeight = 608
End With
ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
'заполнение массива
For yc = 0 To 607
For xc = 0 To 607
GFX_SET_PIXEL_DIB bBytes, xc, yc, vbRed, bi24BitInfo.bmiHeader.biWidth
Next xc
Next yc
'вывод на экран
SetDIBitsToDevice mfrm.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
End Sub
Sub GFX_SET_PIXEL_DIB(ByRef obj() As Byte, ByVal sX As Long, ByVal sY As Long, zColor As Long, hWidth As Long)
Dim dibX As Long, dibY As Long
Dim cNum As Long
Dim R As Byte, G As Byte, B As Byte
dibX = sX + 1: dibY = hWidth - sY
cNum = (hWidth * (dibY - 1) + dibX) * 3 - 2
R = zColor \ 65536
G = (zColor And 65535) \ 256
B = zColor And 255
obj(cNum) = R
obj(cNum + 2) = B
obj(cNum + 1) = G
End Sub
1 to bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3
1 to ceil(.biWidth*3 / 4)*4 * .biHeight
public function Ceil(byval Value as double) as long
ceil=-int(-value)
end function
dibX = sX + 1: dibY = hWidth - sY
D8M писал(а):Снова. Здесь на форуме так принято давать линки которые второстепенно относяться к теме? Ты смотрел тот пример что я дал? Нет, конечно же не смотрел. Там прямая запись в битмап. Все максимально оптимизировано (по-моему). А вопрос был: можно ли еще быстрее?
D8M писал(а):Да и еще разве сложение происходит быстрее чем умножение?Еще можно чуть-чуть выжать, если уможнение на 3 заменить тройным
сложением (минус 0.8 сек на 30 циклов).
Sub draw()
bitmap_set 'установка инфы о рисунке
Dim xc As Long
Dim bBytes() As Long
ReDim bBytes(0 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight - 1)
For xc = LBound(bBytes) To UBound(bBytes)
bBytes(xc) = vbBlue
Next xc
SetDIBitsToDevice mfrm.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(0), bi24BitInfo, DIB_RGB_COLORS
End Sub
D8M писал(а):А почему не скачиваються версии выше 5й?
Попробую объяснить.Прикольно, что R и B опять перепутаны, непойму почему...
Dim xc As Long
Dim bBytes() As Long
ReDim bBytes(0 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight - 1)
For xc = LBound(bBytes) To UBound(bBytes)
bBytes(xc) = vbBlue
Next xc
Dim bBytes() As Long
Dim r() as Byte
Dim c1(3) as Byte
Dim c2(3) as Byte
ReDim bBytes(0 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight - 1)
ReDim r(0 To (UBound(bBytes) + 1) * 4 - 1)
c2(2) = 255 'vbBlue
r = StrConv(Replace(StrConv(r, vbUnicode), StrConv(c1, vbUnicode), StrConv(c2, vbUnicode)), vbFromUnicode)
CopyMemory bBytes(0), r(0), UBound(r) + 1
D8M писал(а):К тому же я вобще забил на DIB секции. Просто я отрисовывал на экран тайлы 32*32. 20*15 тайлов отрисовывалось SetDIBitsToDevice гдето 150 фпс. А потом ради интереса применил BitBlt и получилось 600 фпс
D8M писал(а):Свойство autoredraw=true берет 50-100 фпс, если его отключить форма мерцает. Как обновлять форму без мерцания при autoredraw=false?
D8M писал(а):Как работает cls? Что он делает? Всмысле понятно что заполняет окно фоновым цветом, но как он это делает физизически? Ведь он тоже присваивает цвет попиксельно... Но когда я присваиваю цвет попиксельно получается максимум 500 фпс, а при cls 8000-9000 фпс. Какой механизм работы cls?
Разве эти две функции взаимозаменяемы?
Рисовать в невидимый буфер, потом отрисовывать картинку целиком. Причём в событии _Paint, а не абы где.
А RtlFillMemory вместо своего цикла -- пробовал?
D8M писал(а):Рисовать в невидимый буфер, потом отрисовывать картинку целиком. Причём в событии _Paint, а не абы где.
Гм... Что за "невидимый буффер"? И как "отрисовывать картинку целиком"? Названия функций хоть скажи
D8M писал(а):А RtlFillMemory вместо своего цикла -- пробовал?
Так вроде всеравно прийдется каждый элемент массива RtlFillMemory заполнять... Или нет? Как без цикла заполнить сразу весь массив?
Сейчас этот форум просматривают: Google-бот и гости: 24