VB在picture控制元件里面畫實心圓最快的方法是什么?circle太慢了
Picture1.FillColor = RGB(255,0,0)
Picture1.Circle (200, 200, 100, vbBlue
一次性畫少一些還行,當一次性要畫上萬個的時候,速度就非常慢了
有什么可以快速畫實心圓的方法沒,謝謝
uj5u.com熱心網友回復:
考慮一下OpenGL或者DirectDraw吧。uj5u.com熱心網友回復:
事先用 ImageList 控制元件保存內含不同直徑實心圓的正方形圖片(最好各邊與圓相切,便于確定位置),用 PaintPicture 方法復制到 Picture 控制元件中。uj5u.com熱心網友回復:
實際上,圖片就是一個個像素的狀態。采用畫圓和填充的方式,是要實時對生成的像素進行計算處理,而且計算了兩輪(畫圓和填充)。如果還要實時改變顯示,則更慢。采用現成的實心圓,等于事先準備好了像素矩陣,直接貼進去。
處理程序中,最好將 Picture 控制元件設定為 visible = False。
uj5u.com熱心網友回復:
我的每個圓的顏色是不同的,而且要實時更新的,比如1秒鐘更新15次這樣,1萬個圓都得更新的uj5u.com熱心網友回復:
你究竟是做的什么東西?真有必要這樣嗎……

真要搞這樣的,恐怕只有用DX或OpenGL介面來做。
uj5u.com熱心網友回復:
我想做一個采集GIF圖片的像素,比如說采集1萬個像素點,然后把這1萬個像素點顯示到picture里面,顯示的時候像素點不能太小,并且顯示的速度要跟上GIF影像變化的速度,也就是一邊采集一邊顯示,基本要與GIF變化同步,采集可以用GetDIBits,然后再提取想要像素的坐標,就是顯示這塊,用picture.circle太慢了,閣下有什么好的建議嗎,謝謝uj5u.com熱心網友回復:
1秒鐘更新15次這樣,1萬個圓都得更新的?!給誰看?
誰又能看得清?
你說你“1秒鐘更新15次,1萬個圓都更新”;我說你“1秒鐘更新僅10次,1萬個圓只更新了1000個”。誰來證明你對還是我對?怎么證明?
牛皮只適合用來吹吹。當真就鉆牛角尖了。
uj5u.com熱心網友回復:
就幾個問題:這么多圓圈,這么高的重繪率,給特么誰看的?他會數你每個圈圈重繪幾次么?少畫幾個圈圈,少重繪幾次他看得出來么?你給他那么多圈圈他分得清楚哪個是哪個么?那一萬多個圈圈圈的場景給他看過么?他罵你了沒有?uj5u.com熱心網友回復:
這種需求根本就不需要考慮技術實作,根本就是偽需求,你即使用DX或OpenGL啥的搞定了,用的人看一眼也就叫你改了,根本沒法用。勸你先確認需求。uj5u.com熱心網友回復:
每個圓顏色不同,有一萬個。你這一萬種顏色是怎么配的?看的人怎么分得清一萬種顏色?uj5u.com熱心網友回復:
每次上萬個實心圓, 每秒15次重繪.我覺得你還是把你最終需要做的東西給說一下吧, 你這個需求不見得就是合理的.
uj5u.com熱心網友回復:
好的,我做的東西其實很簡單的,我先用GetDIBits函式采集一段視頻或者影片的RGB值,然后提取其中1萬個點RGB(30k的資料)的像素保存在.bin檔案中,這個程序是正確的,速度10萬個點每秒可以做到25幀,這里沒有問題,采集的程序在Timer1_Timer()r控制元件里面完成lrtn = GetDIBits(DC, iBitmap, 0&, iHeight, Bits1(0, 0, 0), bi24BitInfo, 0&)
ReleaseDC 0, DC
Dim r As Integer
Dim g As Integer
Dim b As Integer
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim i4 As Long
For i = 0 To 99
For j = 0 To 99
Bits2(2, i, j) = Bits1(2, a2(i), b2(j)) ‘a2(i),b2(i)就是要采集點的坐標啦
Bits2(1, i, j) = Bits1(1, a2(i), b2(j))
Bits2(0, i, j) = Bits1(0, a2(i), b2(j))
'Bits1(2, i, j) = 255
'Bits1(1, i, j) = 0
'Bits1(0, i, j) = 0
Next j
Next i
'For ix = 0 To ik
Open "d:\1.bin" For Binary As #1
Put #1, k, Bits2
k = k + 30000(每次提取30k的資料,將這30K的資料保存到bin檔案中)
Close #1
再者,采集完后,就要查看采集的效果怎么樣,所以我就要把上面1.bin檔案的資料顯示到picture控制元件里面去
比如說我一共采集1萬點,在picture控制元件上面顯示1萬個點
Dim Buff(0 to 29999) As Byte' 1萬個點30k的資料
Open "d:\1.bin" For Binary As #1 ’打開1.bin檔案
For i1 = 1 To 100 ‘采集了100幀,就得重繪100次,讀取100次資料
Get #1, wei, Buff '每次提取30K的資料放到Buff中,wei為每次讀取的位置,初始值1
wei = wei + 30000
Picture1.Cls
Picture1.Picture = LoadPicture()
For i = 0 To 99
For j = 0 To 99
wei1 = i*j+j ‘計算畫的圓與采集的資料對應的坐標
Picture1.FillColor = RGB(Buff(wei1) * 2, Buff(wei1 + 1) * 2, Buff(wei1 + 2) * 2)‘給圓填充顏色
Picture1.Circle (a1(i), b1(j)), 100, vbBlue’畫圓
Next j
Next i
Picture1.Picture = Picture1.Image
Next i1
Close #1
現在的的問題就是顯示這塊刷幀的時候太慢了,幾千個點的時候蠻快的,就是Picture1.Circle (a1(i), b1(j)), 100, vbBlue’畫圓這里太耗時間,顯示幾張圖片,呵呵

uj5u.com熱心網友回復:
就是像素點放大成一個圓顯示uj5u.com熱心網友回復:
是的,就是像素點放大顯示uj5u.com熱心網友回復:
首先,沒必要畫成圓顯示,因為實際的像素不是圓。其次,就算要畫成圓顯示,也沒必要用Circle陳述句逐個畫圓,畫一個圓到一幅小的Picture上,再用PaintPicture將小Picture畫到大Picture上應比用Circle陳述句略快。嫌PaintPicture還不夠快,還可以改用API BitBlt
最后,視窗中當前看不見的部分當然沒必要畫了。
另外,請參考這個軟體:https://docs.microsoft.com/zh-cn/sysinternals/downloads/zoomit
uj5u.com熱心網友回復:
放在imagelist里,直接貼圖uj5u.com熱心網友回復:
我這試了一下,1萬個圓圈處理在70ms左右,差不多就在15幀左右設定picturebox 的autoredraw屬性效率提升明顯。另外看樓主代碼scalmode貌似用的是默認的twip建議 用Pixel
下面用的代碼,表單里面放一個picturebox 一個按鈕 一個timer即可
用了timer可能會被吐槽,我只是為了省事,可以自己用回圈去處理。
另外,如果只是為了界面演示,其實真不介意跳幾幀
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim r As Double
Const rad = 3.14 / 360
Private Sub Command1_Click()
Me.ScaleMode = 3
Picture1.Width = 500
Picture1.Height = 500
Picture1.FillStyle = 0
Picture1.ScaleMode = 3 '這兩行是重點
Picture1.AutoRedraw = True
Timer1.Interval = 1
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Dim i As Integer
Dim j As Integer
Dim t As Long
t = GetTickCount
r = r + 10
For i = 1 To 100
For j = 1 To 100
' 畫1萬個圈圈,加了點影片免得覺得沒動
Picture1.FillColor = RGB(128 * (Sin((Sqr(i ^ 2 + j ^ 2) + r) * rad * 10) + 1), 128 * (Sin((Sqr(i ^ 2 + j ^ 2) + r + 60) * rad * 10) + 1), 255)
Picture1.Circle (i * 5, j * 5), 2, vbBlack
Next
Next
Me.Caption = GetTickCount - t '在表單標題欄顯示單次渲染毫秒數,我這里顯示在70毫秒以內 剛剛好在15幀左右
End Sub
uj5u.com熱心網友回復:
感覺樓主在做一個LED屏的編輯器,支持把gif匯入到LED控制器里,然后實作一個預覽功能。uj5u.com熱心網友回復:
謝謝各位老師
uj5u.com熱心網友回復:
測驗了下 我這邊40左右 編譯成exe 是30左右
uj5u.com熱心網友回復:
應該主要還看CPU,我的測驗機是一臺5年前的機器。
uj5u.com熱心網友回復:
我的09年的機,測驗了一下330這樣,電腦確實老了轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/52846.html
標籤:VB基礎類
上一篇:大神幫忙看看代碼怎么寫?
下一篇:"error LNK2019: 無法決議的外部符號, 該符號在函式 _main 中被參考" 錯誤,有代碼,求解答
