我一直在用 Python 编写一个游戏,该游戏需要能够从物理引擎中添加和删除大量对象。在极端的测试场景中,我可以用完内存是几秒钟。在正常情况下,它需要一段时间才能积累。经过两天的工作,我发现了一个小测试场景,它可以准确显示正在发生的事情。我的平台是 Windows 7 64x。
import pymunk
import time
from os import system
space=pymunk.Space()
width=5
height=5
poly=[(-width/2.0,-height/2.0),(-width/2.0,height/2.0),(width/2.0,height/2.0),(width/2.0,-height/2.0)]
while(True):
#time.sleep(.5) #
system("pause")
bodys=[pymunk.Body(mass=5,moment=pymunk.moment_for_poly(5, poly)) for a in range(200)] #num of objects here
print "1"
shapes=[pymunk.Poly(bod, poly) for bod in bodys]
print "2"
space.add(bodys)
print "3"
space.add(shapes)
print "4"
space.step(.5) #step has no effect on leak
print "5"
space.remove(space.bodies)
print "6"
space.remove(space.shapes)
print "7"
#space.remove(shapes)
#print "6"
#space.remove(bodys)
#print "7"
所以,如果你玩一点。曾经有一段时间,它没有挂起,并且会超出记忆。但目前它挂在删除形状上。形状删除都不会做任何事情。我的游戏从不挂起,只是吞噬内存。
在每隔几秒对每个循环进行 200 次测试时,它会从 50mb 开始“跳跃”50mbs,并在 300mb 左右结束(对我来说)。我想我可能只是在运行垃圾收集器,但大量对象进出只是出血内存,即使只是一次。I 让程序在不添加或删除对象的情况下运行。没有内存被回收。
每个循环只添加和删除一个对象没有泄漏,并且运行在非常低且恒定的内存上。
我发现 pymunk 不会泄漏但应用该方法无法解决任何问题的情况。(较慢的添加和删除或不使用 add(list) 和 remove(list)。) Pymunk 本身一个对象不会泄漏。在我的游戏中一次一个对象是。
我已经尽我所能找到任何杂散的引用或引用循环。此示例显示没有太多复杂的引用,并且存在内存回收问题。
任何输入将不胜感激?
附加信息:以 60 fps 的速度每帧添加和删除 1 个对象会使内存以每秒 3 mbs 左右的速度攀升。我的引擎在一个单独的线程中,直到我发现这不是问题所在。同步运行仍然泄漏。