python - 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。有哪些方法可以改进我的渲染方法?
解决方案
您不应该在每次要移动画布图像时重新创建它。相反,只需创建一次图像并将其保存到变量: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)
推荐阅读
- css - 如何将边距设置为另一个 div 内的两个 div?
- mysql - Laravel where 如果两个字段的差异不为0,则查询获取记录
- android - 片段布局和操作栏在被选中时重复显示
- karate - 空手道 - 如何匹配字段的部分字符串作为响应?
- c# - 如何检索具有相关实体子集的实体?
- wordpress - 如何在帖子页面中显示分类的自定义字段值?
- android - lib中的Realm db +使用该lib的应用程序中的Realm db相互冲突
- ms-media-foundation - 多个 MediaEngines SetSource 阻止渲染
- c# - 使用 Xml 序列化从类中读取标签内的 xml 值
- php - Docusign SOAP API 为现有 pdf 字段设置必填字段