我有以下wx.Window
class SketchWindow(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent, -1)
self.SetBackgroundColour('White')
# Window event binding
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_IDLE, self.OnIdle)
# run
self.Run()
def OnPaint(self, evt):
self.DrawEntities(wx.PaintDC(self))
def DrawEntities(self, dc):
dc.SetPen(wx.Pen('Black', 1, wx.SOLID))
dc.SetBrush(wx.Brush('Green', wx.SOLID))
# draw all
for e in self.entities:
x, y = e.location
dc.DrawCircle(x, y, 4)
def OnIdle(self, event):
self.Refresh(False)
def Run(self):
# update self.entities ...
# call this method again later
wx.CallLater(50, self.Run)我需要在我的窗口上每隔N毫秒(在我的例子中是50)画一个0,2000个圆圈,这些圆圈在每一步都会更新它们的位置。
我写的方法可以工作(圆圈也是抗锯齿的),但速度很慢。有没有办法改进我的解决方案?
发布于 2014-10-25 04:22:48
我认为更好的性能的基本想法是在屏幕外绘制到内存,然后将结果blit到屏幕上。您可以使用BufferedCanvas来完成此操作(链接页面底部给出了示例)。
发布于 2017-10-31 04:01:08
你最好解释一下为什么你把这个描述为相当慢。(此代码看起来可能是台球桌模拟的一部分)。在这一点上,一些时间分析会对你有所帮助。我必须添加很多代码才能运行您的代码片段,但一些快速的观察结果是: 1)您可能需要在OnPaint()例程中使用dc.Clear(),否则您将得到先前绘制的所有圆的“轨迹”。此外,您还可以使用缓冲的DC来获得更平滑的图形更新,方法是更改
def OnPaint(self, evt):
self.DrawEntities(wx.PaintDC(self))至
def OnPaint(self, evt):
self.DrawEntities(wx.BufferedPaintDC(self))https://stackoverflow.com/questions/26550473
复制相似问题