Wie schnelle Graphen zeichnen?
Verfasst: Freitag 2. November 2007, 02:19
Ich arbeite mich gerade in Grafikausgabe ein, dazu habe ich mal ein kleines
Testprogramm geschrieben was Messwerte als Graphen aus einer List ausgibt.
Das ganze erzeugt leider zwischen 30-50% CPU Last, ist mein Ansatz total falsch bzw. wo könnte man das noch optimieren?
Testprogramm geschrieben was Messwerte als Graphen aus einer List ausgibt.
Code: Alles auswählen
import wx
import threading
import time
import random
class myPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.bmp = wx.EmptyBitmap(300,300)
dc = wx.MemoryDC(self.bmp)
dc.SetPen(wx.RED_PEN)
dc.DrawLine(0,0,300,300)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.val1 = [0] * 500
self.val2 = [0] * 500
self.x1 = 0
self.x2 = 100
self.x1dir = False
self.x2dir = True
self.t1 = threading.Thread(target=self.thread1)
self.t1.start()
def OnPaint(self, evt):
wx.BufferedPaintDC(self, self.bmp, style = wx.BUFFER_VIRTUAL_AREA)
def thread1(self):
while 1:
time.sleep(0.005)
dc = wx.MemoryDC(self.bmp)
dc.SetBackground(wx.Brush("black"))
dc.Clear()
if self.x1dir == False: self.x1 += random.randint(1,5)
if self.x1dir == True: self.x1 -= random.randint(1,5)
if self.x2dir == False: self.x2 += random.randint(1,10)
if self.x2dir == True: self.x2 -= random.randint(1,10)
if self.x1 > random.randint(50,100): self.x1dir = True
if self.x1 <= 0: self.x1dir = False
if self.x2 > random.randint(50,100): self.x2dir = True
if self.x2 <= 0: self.x2dir = False
self.val1.pop()
self.val2.pop()
self.val1.insert(0,self.x1)
self.val2.insert(0,self.x2)
for i in range(1,500):
dc.SetPen(wx.RED_PEN)
dc.DrawLine(i-1, self.val1[i-1], i, self.val1[i])
dc.SetPen(wx.GREEN_PEN)
dc.DrawLine(i-1, self.val2[i-1], i, self.val2[i])
dc.SelectObject(wx.NullBitmap)
self.Refresh(False)
class myFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self,None)
panel = myPanel(self)
class myApp(wx.App):
def OnInit(self):
frame = myFrame(None)
frame.Show()
return True
def main():
app = myApp(0)
app.MainLoop()
if( __name__ == '__main__'):
main()