Прямой контроль над буфером в DirectDraw

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 02.05.2007 (Ср) 21:56

А есть уверенность, что тормозит именно StretchDIBits?
Изображение

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 03.05.2007 (Чт) 13:09

ещё бы!
делаю привязку к окну.. когда окно мелкое - быстро рисуется, как только в полный экран - тормозец...

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 03.05.2007 (Чт) 13:16

короче вот полный код моего эксперимента... хочу чтоб работало быстрей (заполнение матрицы не так важно)
Код: Выделить всё
Private Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long
    biHeight As Long
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type
Private Type RGBQUAD
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
    rgbReserved As Byte
End Type
Private Type BITMAPINFO
    bmiHeader As BITMAPINFOHEADER
    bmiColors As RGBQUAD
End Type
Private Type RGB_Col
    B As Byte
    G As Byte
    R As Byte
End Type
Private Declare Function SetDIBitsToDevice Lib "gdi32" _
    (ByVal hdc As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal dx As Long, _
    ByVal dy As Long, _
    ByVal SrcX As Long, _
    ByVal SrcY As Long, _
    ByVal Scan As Long, _
    ByVal NumScans As Long, _
    Bits As Any, _
    BitsInfo As BITMAPINFO, _
    ByVal wUsage As Long) As Long
Private Declare Function StretchDIBits Lib "gdi32" _
    (ByVal hdc As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal dx As Long, _
    ByVal dy As Long, _
    ByVal SrcX As Long, _
    ByVal SrcY As Long, _
    ByVal wSrcWidth As Long, _
    ByVal wSrcHeight As Long, _
    lpBits As Any, _
    lpBitsInfo As BITMAPINFO, _
    ByVal wUsage As Long, _
    ByVal dwRop As Long) As Long
   
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    End
End Sub

Private Sub Timer1_Timer()
    xx = 256
    yy = 192
    Dim bi24BitInfo As BITMAPINFO, bBytes() As RGB_Col
    With bi24BitInfo.bmiHeader
        .biBitCount = 24
        .biCompression = BI_RGB
        .biPlanes = 1
        .biSize = Len(bi24BitInfo.bmiHeader)
        .biWidth = xx  '256
        .biHeight = yy '192
    End With
    ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth, 1 To bi24BitInfo.bmiHeader.biHeight) As RGB_Col
    For x = 1 To xx Step 1
        For y = 1 To yy Step 1
            bBytes(x, y).R = Rnd * (x - 1)
            bBytes(x, y).G = Rnd * (255 - y)
            bBytes(x, y).B = Rnd * y
        Next
    Next
    'SetDIBitsToDevice Form1.hdc, 0, 0, 256, 192, 0, 0, 0, 192, bBytes(1, 1), bi24BitInfo, 0
    StretchDIBits Form1.hdc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, 0, 0, 256, 192, bBytes(1, 1), bi24BitInfo, 0, vbSrcCopy
    'StretchDIBits Form1.hdc, 0, 0, 300, 400, 0, 0, BITMAPINFOHEADER.biWidth, BITMAPINFOHEADER.biHeight, bBytes(1, 1), bi24BitInfo, 0, vbSrcCopy
End Sub

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.05.2007 (Чт) 14:57

Закономерно. Больший растр - дольше копировать
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.05.2007 (Чт) 15:07

(заполнение матрицы не так важно)


А ты не думал что это оно медлено работает? А ведь так и есть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.05.2007 (Чт) 15:08

keks-n
Размер растра не зависет от размера формы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.05.2007 (Чт) 15:51

Хакер
Да? То есть, для закрашивания формы 100x100 и 200x200 на экране надо изменить равное количество пикселей?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.05.2007 (Чт) 15:59

Нет, не равное. Но потери скорости не из-за этого, разве не ясно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 03.05.2007 (Чт) 16:14

дык веть растр-то одного размера, меняется только размер приёмника.
В общем-то не подходит мне этот способ, медленный да и сглаживания нет, может как-нибудь решим вопрос о "Lock"?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.05.2007 (Чт) 19:35

SGO
Изменение размера приёмника означает, что картинку надо растягивать. Причём цикл идёт именно по приёмнику, подсчитывая цвет пикселя. Так что, можешь только сделать соотношение источника и приёмника как 1:1. Быстрее уже не будет.
Изображение

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 04.05.2007 (Пт) 16:30

да всё я понял, мне про директ расскажите

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2007 (Пт) 16:39

SGO, первый же вопрос, который я задал тебе в этом топике, состоял в том, переносить или не переносить в раздел про DirectX.
Я понимаю, что ты сам не понимаешь, чего хочешь, но раз ты решил остаться в этом разделе, про DirectX спрашивать бесполезно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 04.05.2007 (Пт) 16:48

ну перенеси, откуда я знаю какие тут разделы есть

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.05.2007 (Пт) 16:52

Не знаешь? Так зацени жэ ЭТО : http://bbs.vbstreets.ru/
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 05.05.2007 (Сб) 4:55

Свершилось! :P Спустя несколько часов тупого сидения в интернете и сотни неудачных экспериментов мне всё-таки удалось получить доступ к "пикселям"!
А надо-то было всего:

objDDBackBuffer.Lock RectBuf, ddsdBackBuffer, DDLOCK_WAIT, 0
objDDBackBuffer.SetLockedPixel a, s, color
objDDBackBuffer.Unlock RectBuf

Простое заполнение циклом из матрицы даёт примерно 60фпс, что меня оооочень устраивает.

Чтож, перестаю вас мучать, а тему можно удалить. :wink:

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 05.05.2007 (Сб) 5:01

Пардон, ещё вопрос :-) сглаживание выключается?

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 05.05.2007 (Сб) 8:14

SGO
покажи код целиком пожалуйста. Любопытно взглянуть.

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 05.05.2007 (Сб) 14:07

Код: Выделить всё
Dim DirX As New DirectX7
Dim DirD As DirectDraw7
Dim objDDScreen As DirectDrawSurface7
Dim objDDBackBuffer As DirectDrawSurface7
Dim objDDClip As DirectDrawClipper
Dim ddsdLake As DDSURFACEDESC2
Dim ddsdScreen As DDSURFACEDESC2
Dim ddsdBackBuffer As DDSURFACEDESC2
Dim RectBuf As RECT
Dim RectScr As RECT
Private framen As Long
Private lasttime As String

'Всяческие подготовки

    Set DirD = DirX.DirectDrawCreate("")
    Call DirD.SetCooperativeLevel(Form1.hWnd, DDSCL_NORMAL)
    ddsdScreen.lFlags = DDSD_CAPS
    ddsdScreen.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE
    Set objDDScreen = DirD.CreateSurface(ddsdScreen)
    Set objDDClip = DirD.CreateClipper(0)
    ddsdBackBuffer.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
    ddsdBackBuffer.lWidth = xx 'Picture1.Width
    ddsdBackBuffer.lHeight = yy 'Picture1.Height
    Set objDDBackBuffer = DirD.CreateSurface(ddsdBackBuffer)
    ddsdLake.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
    ddsdLake.lWidth = xx 'Picture1.Width
    ddsdLake.lHeight = yy 'Picture1.Height
ddsdLake)
DDBLTFAST_WAIT)
    objDDClip.SetHWnd Form1.Picture1.hWnd
    objDDScreen.SetClipper objDDClip


'Далее идёт прорисовка одного кадра
    objDDBackBuffer.Lock RectBuf, ddsdBackBuffer, DDLOCK_WAIT, 0
    For a = 0 To 255: For s = 0 To 191
        r = Rnd * 256' Собственно из-за этого заполнения показывается фпс чуть больше 20, а если просто перекидывать из матрицы будет 60-64
        objDDBackBuffer.SetLockedPixel a, s, RGB(0, 0, r)
    Next s, a
    objDDBackBuffer.Unlock RectBuf
    DirX.GetWindowRect Form1.Picture1.hWnd, RectScr
    objDDScreen.Blt RectScr, objDDBackBuffer, RectBuf, DDBLT_WAIT
[/list]

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 05.05.2007 (Сб) 14:13

сама функция RGB тоже заметно з амедляет процесс (правильно, этож её надо в моём примере вызвать почти 50 000 за один кадр)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.05.2007 (Сб) 14:14

А посчитать RGB зараннее, а потом использовать или же вообще юзать цветовую константу не судьба?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SGO
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 08.01.2007 (Пн) 12:58

Сообщение SGO » 05.05.2007 (Сб) 14:19

я так и делаю :roll:

Пред.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Yandex-бот и гости: 64

    TopList