首页 > 解决方案 > Tkinter 图像渲染很慢。我应该如何改进它?

问题描述

我设置了一个引擎,并且我必须使用的必需 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

所以这样做是:对于每个附加了渲染器的对象,主摄像机检查它是否可以看到该对象。如果是这样,该对象将在画布上创建其图像。此过程完成后,画布被清除并重复该过程

问题:这个过程可能需要超过分配的 33 毫秒才能在屏幕上移动 1 128x128 png。有哪些方法可以改进我的渲染方法?

标签: pythonpython-3.xtkintertkinter-canvas

解决方案


您不应该在每次要移动画布图像时重新创建它。相反,只需创建一次图像并将其保存到变量:my_image = canvas.create_image(self.pos.x, self.pos.y, image=self.sprite.image).

当您调用该create_image方法时,它会返回画布与图像相关联的整数值,因此您可以稍后在代码中使用它来对图像执行操作,例如移动它: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)

推荐阅读