目錄
- 1、問題描述
- 2、解決辦法
1、問題描述
今天收到私信,提問者想要的效果為如何動態更新點的位置,而他重繪畫布的方式是在回圈內直接對部件GLViewWidget進行重置操作,并遇到了記憶體泄漏的問題,
這個問題我考慮了一下:對GLViewWidget進行初始化,會直接把該部件內的所有內容(畫布、坐標軸等)直接洗掉,若想繼續更新點的位置,需要重新添加新的畫布和坐標軸等,而這一塊是需要占用記憶體和時間的,若在回圈內一直做這個操作,不僅容易造成記憶體泄漏,也可能會造成視窗卡頓(多執行緒QThread情況下),
2、解決辦法
抓住問題關鍵,我們想要一直更新點的位置,并提高幀數,GLViewWidget是我們最基礎的部件,我們是在其上添加畫布,添加坐標軸然后更新點的位置,
打個比方:我們想在黑板上的坐標軸上畫3D圖,并持續更新點的位置,每次更新我們需要做的僅僅是用黑板擦擦掉之前的點,然后再標上新的點,這樣便完成了一次更新操作,而為了重繪點去把GLViewWidget重置就得不償失了,這是把整個黑板重置了,連帶添加的畫布和坐標軸一起洗掉了,當更新點時又要添加新的畫布和坐標軸,這顯然造成了記憶體的浪費,不免出現記憶體泄漏的問題,
切記,我們想要的僅僅是更新點的位置,最簡單的操作即:擦掉之前的點,并畫上新的點,GLViewWidget只需要初始化一次,回圈內只需擦除和重新描點即可,
具體解決辦法如下:
# 類內,若不做類,可以把self去掉
self.distance = 120 # 設定初始視角高度
self.pos = np.zeros((100, 3)) # 初始化100個點位置
self.size = np.ones(100) * 0.5 # 設定初始點大小0.5
self.color = np.zeros((100, 4)) # 設定初始100個點的顏色,(0, 0, 0, 0)為透明無色
self.g = gl.GLGridItem()
self.size_axes = self.distance / 4
self.g.setSize(x=self.size_axes, y=self.size_axes, z=self.size_axes)
self.guiplot.addItem(self.g) # guiplot為GLViewWidget部件
self.sp = gl.GLScatterPlotItem(pos=self.pos, size=self.size, color=self.color, pxMode=False)
self.guiplot.addItem(self.sp) # 最主要的時間花費在這
# 添加坐標軸Item
ax = gl.GLAxisItem()
ax.setSize(40, 40, 40)
self.guiplot.addItem(ax)
# 上一步完成了部件初始化,并畫了初始點
# 撰寫更新點集坐標的函式,update()
def update():
pass
def draw():
while(True):
self.update()
self.sp.setData(pos=self.pos, size=self.size, color=self.color, pxMode=False)# 本步即畫圖,更新點顯示
希望能幫助到你,若有問題,歡迎留言交流學習!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/259272.html
標籤:其他
下一篇:字體檔案格式詳解
