我有以下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],在每个步骤中这些圆圈可以更新它们的位置。
我写的方法有效(圆圈也有反锯齿),但速度很慢。 有没有办法改善我的解决方案?
答案 0 :(得分:1)
我认为提高性能的基本思路是在屏幕外绘制到内存,然后将结果blit到屏幕。您可以使用BufferedCanvas来完成此操作(链接页面底部给出的示例)。
答案 1 :(得分:0)
你应该更好地解释为什么你把它描述得很慢。 (这段代码看起来可能是台球桌模拟的一部分)。一些时间分析会帮助你。我不得不添加大量代码来运行代码片段,但是一些快速观察是1)你可能需要在你的OnPaint()例程中使用dc.Clear(),否则你将获得所有先前绘制的圆圈的“踪迹” 。此外,您可以通过更改
使用缓冲DC来获得更平滑的图形更新// boot-client.ts file
import 'ngx-charts';
// some.component.ts
import { isBrowser } from 'angular2-universal';
import * as $ from 'jquery';
// inside ngOnInit
if (isBrowser) {
$('body').hide(); // or whatever call you need to make
}
到
def OnPaint(self, evt):
self.DrawEntities(wx.PaintDC(self))