Tkinter 图像渲染很慢。我应该如何改进它?
Tkinter image rendering is slow. How should I improve it?
我设置了一个引擎,我必须使用的必需 GUI 库(并且只有我被允许使用的非内置库)是 tkinter。虽然我在 TK 方面不是很有经验,但我想帮助提高我的渲染性能。我实现渲染的方式大致如下:
# assign png as PhotoImage
Resources.register(PhotoImage, '...circle-alpha.png')
# init window and canvas
root = Tk()
root.geometry = "600x1000"
canvas = Canvas(root, width=600, height=1000)
canvas.pack()
# using root.after I call this function every ~33ms
def main_loop():
canvas.delete(ALL)
Camera.main_camera.render()
# camera.render eventually calls this:
# sprite.image references the prviously-mentioned image
def render(self, camera):
canvas.create_image(self.pos.x, self.pos.y, image=self.sprite.image
所以这是在做什么:
对于每个附加了渲染器的对象,主摄像头检查它是否可以看到该对象。
如果是这样,该对象将在 canvas 上创建其图像。
此过程完成后,canvas 将被清除并重复该过程
问题:
此过程可能需要超过分配的 33 毫秒才能在屏幕上移动 1 128x128 png。我可以通过哪些方式改进我的渲染方法?
您不应在每次要移动图像时都重新创建 canvas 图像。相反,只创建一次图像并将其保存到变量中:my_image = canvas.create_image(self.pos.x, self.pos.y, image=self.sprite.image)
.
当您调用 create_image
方法时,它 returns 一个 canvas 与图像相关联的整数值,因此您稍后可以在代码中使用它来执行操作到图像,就像移动它:canvas.moveto(my_image, self.pos.x, self.pos.y)
。所以 render()
函数看起来像这样:
def render(self, camera):
canvas.moveto(my_image, self.pos.x, self.pos.y)
我设置了一个引擎,我必须使用的必需 GUI 库(并且只有我被允许使用的非内置库)是 tkinter。虽然我在 TK 方面不是很有经验,但我想帮助提高我的渲染性能。我实现渲染的方式大致如下:
# assign png as PhotoImage
Resources.register(PhotoImage, '...circle-alpha.png')
# init window and canvas
root = Tk()
root.geometry = "600x1000"
canvas = Canvas(root, width=600, height=1000)
canvas.pack()
# using root.after I call this function every ~33ms
def main_loop():
canvas.delete(ALL)
Camera.main_camera.render()
# camera.render eventually calls this:
# sprite.image references the prviously-mentioned image
def render(self, camera):
canvas.create_image(self.pos.x, self.pos.y, image=self.sprite.image
所以这是在做什么: 对于每个附加了渲染器的对象,主摄像头检查它是否可以看到该对象。 如果是这样,该对象将在 canvas 上创建其图像。 此过程完成后,canvas 将被清除并重复该过程
问题: 此过程可能需要超过分配的 33 毫秒才能在屏幕上移动 1 128x128 png。我可以通过哪些方式改进我的渲染方法?
您不应在每次要移动图像时都重新创建 canvas 图像。相反,只创建一次图像并将其保存到变量中:my_image = canvas.create_image(self.pos.x, self.pos.y, image=self.sprite.image)
.
当您调用 create_image
方法时,它 returns 一个 canvas 与图像相关联的整数值,因此您稍后可以在代码中使用它来执行操作到图像,就像移动它:canvas.moveto(my_image, self.pos.x, self.pos.y)
。所以 render()
函数看起来像这样:
def render(self, camera):
canvas.moveto(my_image, self.pos.x, self.pos.y)