我的头撞到了墙上(就像,是的,身体上,在我现在的位置,我正在破坏我的头盖骨)。基本上,我有一个Python/Pygame游戏,有一些典型的游戏“房间”或“屏幕”,例如标题屏幕、高分屏幕和实际的游戏室。当我在不同的房间之间切换时,一些不好的事情发生了:旧的房间(及其各种项目)没有从内存中删除,也没有从我的事件侦听器中删除。不仅如此,而且每次我回到某个房间,我的事件侦听器数量就会增加,内存也会被消耗掉!(例如,如果我在标题屏幕和“游戏室”之间来回切换,事件侦听器的数量和内存使用量就会不断增加。在
主要的问题是所有的事件侦听器都开始累加并真正耗尽CPU。我是Python新手,不知道我在这里做了什么明显的错误,还是什么。在
如果你能帮我,我会非常爱你!在
主.PYclass RoomController(object):
"""Controls which room is currently active (eg Title Screen)"""
def __init__(self, screen, ev_manager):
self.room = None
self.screen = screen
self.ev_manager = ev_manager
self.ev_manager.register_listener(self)
self.room = self.set_room(config.room)
def set_room(self, room_const):
#Unregister old room from ev_manager
if self.room:
self.room.ev_manager.unregister_listener(self.room)
self.room = None
#Set new room based on const
if room_const == config.TITLE_SCREEN:
return rooms.TitleScreen(self.screen, self.ev_manager)
elif room_const == config.GAME_MODE_ROOM:
return rooms.GameModeRoom(self.screen, self.ev_manager)
elif room_const == config.GAME_ROOM:
return rooms.GameRoom(self.screen, self.ev_manager)
elif room_const == config.HIGH_SCORES_ROOM:
return rooms.HighScoresRoom(self.screen, self.ev_manager)
def notify(self, event):
if isinstance(event, ChangeRoomRequest):
if event.game_mode:
config.game_mode = event.game_mode
self.room = self.set_room(event.new_room)
#Run game
def main():
pygame.init()
screen = pygame.display.set_mode(config.screen_size)
ev_manager = EventManager()
spinner = CPUSpinnerController(ev_manager)
room_controller = RoomController(screen, ev_manager)
pygame_event_controller = PyGameEventController(ev_manager)
spinner.run()
事件_经理.PY
^{pr2}$
使用事件管理器的示例类class Timer(object):
def __init__(self, ev_manager, time_left):
self.ev_manager = ev_manager
self.ev_manager.register_listener(self)
self.time_left = time_left
self.paused = False
def __repr__(self):
return str(self.time_left)
def pause(self):
self.paused = True
def unpause(self):
self.paused = False
def notify(self, event):
#Pause Event
if isinstance(event, Pause):
self.pause()
#Unpause Event
elif isinstance(event, Unpause):
self.unpause()
#Second Event
elif isinstance(event, SecondEvent):
if not self.paused:
self.time_left -= 1