Pyglet 内存泄漏 & 页面错误 以及(可能)有用的解决方法 ...

篮之新喜  金牌会员 | 2024-6-24 16:47:58 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 869|帖子 869|积分 2617

Charapter 1: 端倪

最近不绝在用Pyglet做一个小的案例,但是实际运行起来时发现了严重的内存泄漏。经调查后发现平均每秒会爆出80-120不等的页面错误。且可以观察到内存正在不绝地以0.2-0.4mb不等的速度增长
可以或许复原此题目的代码如下:
  1. # 导入库
  2. import pyglet
  3. win = pyglet.window.Window()
  4. # 注册函数
  5. @win.event('on_draw')
  6. def Draw():
  7.         # 绘制一个白色的正方形
  8.         pyglet.shapes.Rectangle(0, 0, 100, 100, color = (255, 255, 255, 255)).draw()
  9. # 使程序运行
  10. pyglet.app.run()
复制代码
在步伐启动后,可以或许明显发现内存在不绝增加。如下图:


(第二空为pid,第三空为提交内存,第四空和第五空分别为页面错误总数和页面错误增量)
Charapter 2: 调试

后来,在查阅一些资料后,发现了Pyglet存在"双缓冲区机制"(这个机制给我的感觉就是可有可无,还请大佬在评论区赐教),试图去掉双缓冲区后代码如下:
  1. # 导入库
  2. import pyglet
  3. win = pyglet.window.Window(config = pyglet.gl.Config(double_buffer = False)) # 去掉双缓冲
  4. # 注册函数
  5. @win.event('on_draw')
  6. def Draw():
  7.         # 绘制一个白色的正方形
  8.         pyglet.shapes.Rectangle(0, 0, 100, 100, color = (255, 255, 255, 255)).draw()
  9. # 使程序运行
  10. pyglet.app.run()
复制代码



(第一张和第三张为正常利用时的图片,第二张为突发帧,相较之前错误少了一半)
看上去像是好一点了。
Charapter 3: 削除

仍然会有泄露的题目。观察了下gc,发现字典,元组和函数的数目在不绝增加。而一个最简单的示例里就没有这些题目。我想了好一阵,两个示例里最大的差异就是,在之前的示例中,on_draw()函数实验了在窗口上绘制了白色正方形的任务。所以,题目有没有可能出在正方形上呢?
将示例中的正方形删掉之后,错误立即淘汰了很多。不绝降至0-1。题目修复了。由此可知:函数内不能创建Pyglet的任何图形对象。
之后,尝试在函数外就先创建一个正方形,果然没有了题目。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表