回 帖 发 新 帖 刷新版面

主题:有关GDI双缓存问题:为什么bitblt向后台写入数据反而更慢?

学到网上说的双缓存技术,想试试看,但却发现用bitblt向后台内存中写数据反而比直接向picture.hdc写入更慢?(就算只在后台绘图,不把后台图像拷贝到前台也比在前台绘图慢)请问这是怎么回事?关于双缓存绘图我哪里搞错了么?



下面的例子分别向3种hdc中绘图



'添加3个picturebox 及1个timer

Option Explicit
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
 Private Declare Function QueryPerformanceCounter Lib "kernel32" (x As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (x As Currency) As Boolean
Dim hb As Long
Dim state As Long, FPS As Long
Dim theHdc As Long, hdc3 As Long


Private Sub Form_Click()
state = (state + 1) Mod 3
Select Case state
Case 0
theHdc = Picture1.hdc
Case 1
theHdc = Picture2.hdc
Case 2
theHdc = hdc3
End Select
Caption = IIf(state = 0, "Picture1 Autoredraw=true 使用内存设备场景hdc", IIf(state = 1, "Picture2 Autoredraw=false 使用设备场景句柄", "使用 CreateCompatibleDC的hdc (每半秒复制到 picture2)")) 
Picture3.Cls
Picture3.Print Rnd
Picture3.Line (0, 0)-(520 * Rnd, 520)
Timer1.Enabled = True
End Sub


Private Sub Form_Load()
Timer1.Enabled = False
Width = 1024 * 15
Height = 600 * 15
Picture1.BackColor = &HFFFFFF
Picture2.BackColor = &HFFFFFF
Picture3.BackColor = &HFFFFFF
Left = 0
Picture1.Move 0, 0, 512 * 15, 512 * 15
Picture2.Move 512 * 15, 0, 512 * 15, 512 * 15
Picture3.Move 0, 512 * 15, 32 * 15, 32 * 15
Picture1.AutoRedraw = True
Picture3.AutoRedraw = True
Show
Picture1.Print "Picture1   Autoredraw=true   hDC是其内存设备场景句柄"
Picture2.Print "Picture2   Autoredraw=flase   hDC是其设备场景句柄"
Picture3.Print Rnd
Picture3.Line (0, 0)-(520, 520)
Timer1.Interval = 32
Caption = "点击窗体开始绘图、切换目标   "
state = 2
hdc3 = CreateCompatibleDC(Picture2.hdc)
hb = CreateCompatibleBitmap(hdc3, 512, 512)'创建后台缓存
SelectObject hdc3, hb
End Sub



Private Sub Timer1_Timer()
''''''''''计算帧频
Static st As Long, T2 As Currency, T1 As Currency
If st > 8 Then
st = 1
QueryPerformanceCounter T2
T2 = T2 - T1
QueryPerformanceFrequency T1
T2 = T2 / T1
FPS = 8 / T2
Caption = IIf(state = 0, "Picture1 Autoredraw=true 使用内存设备场景hdc", IIf(state = 1, "Picture2 Autoredraw=false 使用设备场景句柄", "使用 CreateCompatibleDC的hdc (每半秒复制到 picture2)")) & " " & "FPS:" & FPS
Picture1.Refresh
If state = 2 Then BitBlt Picture2.hdc, 0, 0, 512, 512, theHdc, 0, 0, vbSrcCopy '将后台图像绘制到前台就算将本句注释掉速度也是一样
QueryPerformanceCounter T1
ElseIf st = 0 Then
QueryPerformanceCounter T1
End If
st = st + 1

'''''''''简单绘图
Dim x As Long
Dim y As Long

For x = 1 To 16
For y = 1 To 16
BitBlt theHdc, (x - 1) * 32, (y - 1) * 32, 32, 32, Picture3.hdc, 0, 0, vbSrcCopy
Next
Next
End Sub



回复列表 (共2个回复)

沙发

试了下DirectX帧频居然达到了200 ....

板凳

额。。果断沉了啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册