怎么样加快picturebox的绘图速度?

wangwei244157887 2013-01-05 09:53:07
系统平台是WINCE 5.0
开发工具 VB.NET 2008
我自定义在Picturebox上建立一个坐标系,然后再这个坐标系上根据采集的数据绘制波形曲线如下图所示


我采集数据点大概有6000point
下面是我的程序段
其中点的计算是放在线程里的

'放在线程里计算的
For iCount = 0 To UBound(volArr)
Drawpoints(iCount).X = iCount / k * 58 * 10 + Org_x
Drawpoints(iCount).Y = Org_Y - volArr(iCount) * 31
Next


下面是我测算绘制坐标系和波形的时间

lbl_Xyplot.Text = CStr(Environment.TickCount - starttime) '绘制坐标轴耗时 显示43ms
If Not volArr Is Nothing Then
linepen.Width = 2
linepen.Color = Color.Green
xyplot.DrawLines(linepen, Drawpoints) '绘制波形
lbl_WAVE.Text = CStr(Environment.TickCount - starttime) '显示波形耗时 显示5183ms
volArr = Nothing
RecDataArr = Nothing
End If


绘制坐标系耗时了43毫秒,绘制波形应该是耗时(5183-43)毫秒,这个时间太漫长,我该怎么样加快这个绘图速度呢

xyplot是我在PicturBox里面生成的一个对象如下面所示

'PictureBox重绘过程
Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

xyplot = e.Graphics '生成XYplot
DrawXYPlotCanvas()
End Sub


...全文
479 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxyzjm62 2013-01-09
  • 打赏
  • 举报
回复
640*480像素:一屏画300个点就足够了。
「已注销」 2013-01-07
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
引用 4 楼 wangwei244157887 的回复:没用过bitmap,比如我想在bitmap上绘制一条直线,怎么写呢 不要掉到“沟里”去了。
大哥,沟里,是什么意思?已经会了在bitmap,呵呵,初学VB
wood87654321 2013-01-06
  • 打赏
  • 举报
回复
如果你能确定耗时主要是在绘图操作而不是点坐标计算上的话,那么不要直接使用picturebox的Graphics而是建一个bitmap,用它的Graphics把点全部绘制完再picturebox.image=bitmap
「已注销」 2013-01-06
  • 打赏
  • 举报
回复
这是我的系统配置 显示尺寸 10.4" TFT 分辨率 640*480像素 显示色彩 65536彩色 亮度 400d/m2 背光灯 2 CCFL CPU 32-bit 520MHz RISC 操作系统 Windows CE 5.0 RAM 64MB (RAM frequency 104MHz) Flash 32MB NOR flash

 '电压转换过程
    Public Sub Threadcal()
        Dim i As Integer
        Dim j As Integer
        Dim Volint As Integer
        Dim ax, bx As Integer
        ThreadStart = Environment.TickCount
        For i = 0 To UBound(RecDataArr)
            If ((i + 23) < UBound(RecDataArr)) Then
                ax = 0
                bx = 0
                ax = CInt(RecDataArr(i)) + CInt(RecDataArr(i + 1))
                bx = CInt(RecDataArr(i + 22)) + CInt(RecDataArr(i + 23))
                If ((bx - ax) = 10) Then
                    For j = i + 2 To i + 19
                        If volArr Is Nothing Then
                            ReDim volArr(0)
                            Volint = RecDataArr(j) * 256 + RecDataArr(j + 1)
                            If Volint > 32768 Then '负数判断
                                Volint = DEC_to_Neg(Volint)
                            End If
                            volArr(0) = Volint / 32768 * 5
                        Else
                            ReDim Preserve volArr(UBound(volArr) + 1)
                            Volint = RecDataArr(j) * 256 + RecDataArr(j + 1)
                            If Volint > 32768 Then '负数判断
                                Volint = DEC_to_Neg(Volint)
                            End If
                            volArr(UBound(volArr)) = Volint / 32768 * 5
                        End If
                        j = j + 1
                    Next
                    i = i + 21
                End If
            End If
        Next
        '如果采样的数据量小于500 则直接退出程序
        If UBound(volArr) < 500 Then Exit Sub
        '电压转换为坐标像素点
        Dim iCount As Integer
        Dim k As Integer
        k = UBound(volArr)
        ReDim Drawpoints(k)
 
        For iCount = 0 To UBound(volArr)
            Drawpoints(iCount).X = iCount / k * 58 * 10 + Org_x
            Drawpoints(iCount).Y = Org_Y - volArr(iCount) * 31
        Next
        Threadend = Environment.TickCount - ThreadStart
        ThreadStart = 0
        AccessControl()
        b_Recived = False '接收完成标志复位
    End Sub

这是我把串口接收到的数据转换为电压值的过程和转换为像素点的过程,我统计了,大概耗时是3456毫秒,我用断点设置也是差不多这个时间,我把这个线程的优先级设置到最高了,然后绘图,绘图过程经常要消耗10秒左右,而且我也是先用bitmap绘制,然后把设置picturebox1,image=bitmap来绘制,速度没有多少提高,在线程里面转换的字节一共有13K的字节,转换成6.5K字左右,然后把这个字转换坐标像素 难道真的是配置不行?
「已注销」 2013-01-06
  • 打赏
  • 举报
回复
1秒钟左右吧,是6K多个字
  • 打赏
  • 举报
回复
引用 4 楼 wangwei244157887 的回复:
没用过bitmap,比如我想在bitmap上绘制一条直线,怎么写呢
不要掉到“沟里”去了。
  • 打赏
  • 举报
回复
另外,你的这台机器也很重要、操作系统也很重要。
  • 打赏
  • 举报
回复
引用 1 楼 Going1981 的回复:
你这是多少时间采集多少数据啊? 没弄过绘图速度的优化,不过你有必要6000点都画吗?分辨率这么高,人眼其实是根本看不出来的,我觉得画1/10就差不多了吧,600个点生成的曲线跟你这个看起来 应该没太大区别。
同意! “抽稀”是一个可编程的技术,不需要“看起来”。当两个点的距离小于2的时候,你其实就没有必要画第二个点,直接跳过去就可以了。因此一个6000点的曲线,也许画3000点、也许画1000点,也许画500点,反正不是6000点!
「已注销」 2013-01-06
  • 打赏
  • 举报
回复
没用过bitmap,比如我想在bitmap上绘制一条直线,怎么写呢
一只熊猫 2013-01-05
  • 打赏
  • 举报
回复
你这是多少时间采集多少数据啊? 没弄过绘图速度的优化,不过你有必要6000点都画吗?分辨率这么高,人眼其实是根本看不出来的,我觉得画1/10就差不多了吧,600个点生成的曲线跟你这个看起来 应该没太大区别。

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧