标题:躲避球游戏
只看楼主
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
太久的贴子再回复也默认不会在第一页的。
PropertyBag 本来就是一个大包裹,啥东西都可以装,前面有人用来装 数据库的对象来。本地调用远程MDB。

-----------------
因为多线程不是我的框架,所以 多线程的 代码不发,好像弄丢了。
把 一个循环里跑的内容,分拆到 4个线程里去跑,然后 子线程跑完后,主线程再把图像显示 出来。
VB6 的所有控件操作都是线程非安全,子线程不能操作涉及控件、GDI 等操作,只能操作内存。

授人于鱼,不如授人于渔
早已停用QQ了
2022-08-29 13:23
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:109
专家分:0
注 册:2009-3-17
得分:0 
我知道 PropertyBag 啥东西都可以装。

我说的重点是:PropertyBag 用在这个地方,很少见。更多的时候用在 ActiveX 控件上,用于保存属性值 ,使得控件在“设计状态”和“运行状态”能够得到保存,使其不丢失。

看你的代码,是用 PropertyBag 获得位图的 Bits, 其实一些 gdi 函数也可以达到同样的目的(如:GetDIBits、GetObject)

自我感觉:用 PropertyBag 反而不会提高效率,因为:
先开始要:PBag.WriteProperty "Picture", Picture1.Image
然后在:Pbb = PBag.Contents
'--------------------------
Pbb 数组 处理过程
'--------------------------
Pbb 数组 经过处理后,然后在:
Pb1.Contents = Pbb                     
Set Picture1.Picture = Pb1.ReadProperty("Picture")      

感觉,一进一出,都要用 PropertyBag 过一遍手,多一道工序,还不如直接用 gdi 函数在内存DC里画图,然后 BitBlt 到目标DC上。



2022-08-31 09:03
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
写这些代码,我主要的目的是 多线程使用
使用VB6自带绘图函数,会造成 子线程崩溃 ,然后我猜想  GDI 函数 也应该会导致这个问题。

这个程序的主要运算量,就是在屏幕上画这个圆的图形,单线程绘制 VB 效率上不去,FPS 达不到要求。
----------------------------
在初始化使用一次。得到原始数据,并初始化数组大小。这里使用 image 属于是为了不出现背景图形,如果有
PBag.WriteProperty "Picture", Picture1.Image

在每次重绘时使用一次。这里使用 picture 属性,是为了得到一个持久的图形
Pb1.Contents = Pbb                     
Set Picture1.Picture = Pb1.ReadProperty("Picture")  

--------------
Picture控件绘图区域,我理解分成二层,底层是 Picture ,上层是 Image ,VB 的绘图命令只操作到 Image 层,自动重绘开关也只影响这层。
Picture 层只有载入图像命令才能写入数据,并且是自动重绘的。


[此贴子已经被作者于2022-9-1 10:52编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2022-09-01 10:36
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:109
专家分:0
注 册:2009-3-17
得分:0 
Set Picture1.Picture = Pb1.ReadProperty("Picture")
是一种很慢的操作,而且还是在 Timer()事件中频繁被调用,会拖累整个程序。我还是建议 放弃使用 PropertyBag。

可以用以下代码测试一下:
测试前的准备:
1、在窗体中装2个picture,并使2个picture大小相同,最好尺寸调大点,测试效果会更明显。
2、picture 1 放一张图片,(随便什么图片 都行,最好是大图,不要16*16的小图标),picture 2保持原样(空白)。
程序代码:
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 Sub Command1_Click()
    Dim P   As Long
    Dim TTT As Single

TTT = Timer
    For P = 0 To 100
        Set Picture2.Picture = Picture1.Picture
    Next
Debug.Print "Set xxx = yyy ,用时 = " & (Timer - TTT) * 1000
End Sub

Private Sub Command2_Click()
    Dim P   As Long
    Dim TTT As Single
    Dim PBag As New PropertyBag
    
    PBag.WriteProperty "Picture", Picture1.Picture
TTT = Timer
    For P = 0 To 100
        Set Picture2.Picture = PBag.ReadProperty("Picture")
    Next
Debug.Print "PropertyBag , 用时 = " & (Timer - TTT) * 1000
End Sub

Private Sub Command3_Click()
    Dim P   As Long
    Dim TTT As Single

TTT = Timer
    For P = 0 To 100
        Call BitBlt(Picture2.hDc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hDc, 0, 0, vbSrcCopy)
    Next
Debug.Print "BitBlt , 用时 = " & (Timer - TTT) * 1000
End Sub

看看哪种用时最长?

2022-09-03 11:08
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:109
专家分:0
注 册:2009-3-17
得分:0 
新建文件夹.rar (644.97 KB)

这是我修改的程序。(单线程, gdi 画图)
但 我没有足够的信心。不确定在你电脑上的运行效果如何?所以,我只把与 PropertyBag 相关的代码进行修改。

[此贴子已经被作者于2022-9-3 11:30编辑过]

2022-09-03 11:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-481230-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014607 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved