我一直在用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开始“跳跃”50 mbs,并以300mb左右结束(对我而言)。 我以为我可能只是在运行垃圾收集器,但是大量的对象进出内存只是出血记忆,即使只是一次。我让程序运行而不添加或删除对象。没有记忆被回收。
每个循环添加和删除一个对象都没有泄漏,并且在非常低且恒定的内存上运行。
我发现pymunk不会泄漏的情况,但应用该方法无法解决问题。 (较慢的添加和删除或不使用添加(列表)和删除(列表)。)Pymunk本身一个对象不会泄漏。我的游戏中一次有一个对象是。
我已经尝试过我的darnedest找到任何迷路参考或参考周期。此示例显示没有太多复杂的引用,并且有内存回收问题。
任何意见都会受到赞赏?
其他信息: 每帧以60 fps的速度添加和删除1个对象,以每秒3 mbs的速度爬升内存。 我的引擎是在一个单独的线程,直到我发现这不是问题。同步运行仍然泄露。