Fixed three big memory leaks: LevelSetupManagers never being destroyed, wall grid closures retaining Lanks, and real-time-multiplayer:new-opponent-code retaining Spells.

This commit is contained in:
Nick Winter 2014-11-09 16:19:18 -08:00
parent fb040fd882
commit ad06000ceb
7 changed files with 27 additions and 10 deletions

View file

@ -76,3 +76,8 @@ module.exports = class LevelSetupManager extends CocoClass
viewClass: viewClass
viewArgs: [{supermodel: @supermodel}, @options.levelID]
}
destroy: ->
@heroesModalDestroy.call @heroesModal unless @heroesModal.destroyed
@inventoryModalDestroy.call @inventoryModal unless @inventoryModal.destroyed
super()

View file

@ -230,11 +230,12 @@ module.exports = class LankBoss extends CocoClass
cacheObstacles: (updatedObstacles=null) ->
return if @cachedObstacles and not updatedObstacles
wallLanks = (lank for lank in @lankArray when lank.thangType?.get('name').search(/(dungeon|indoor).wall/i) isnt -1)
lankArray = @lankArray
wallLanks = (lank for lank in lankArray when lank.thangType?.get('name').search(/(dungeon|indoor).wall/i) isnt -1)
return if _.any (s.stillLoading for s in wallLanks)
walls = (lank.thang for lank in wallLanks)
@world.calculateBounds()
wallGrid = new Grid walls, @world.size()...
wallGrid = new Grid walls, @world.width, @world.height
if updatedObstacles
possiblyUpdatedWallLanks = (lank for lank in wallLanks when _.find updatedObstacles, (w2) -> lank is w2 or (Math.abs(lank.thang.pos.x - w2.thang.pos.x) + Math.abs(lank.thang.pos.y - w2.thang.pos.y)) <= 16)
else

View file

@ -434,6 +434,7 @@ module.exports = class InventoryModal extends ModalView
onHidden: ->
# Called when the modal itself is dismissed
@endHighlight()
super()
onClickChooseHero: ->
@hide()

View file

@ -49,6 +49,7 @@ module.exports = class WorldMapView extends RootView
window.tracker?.trackEvent 'World Map', Action: 'Loaded'
destroy: ->
@setupManager?.destroy()
$(window).off 'resize', @onWindowResize
if ambientSound = @ambientSound
# Doesn't seem to work; stops immediately.
@ -150,8 +151,9 @@ module.exports = class WorldMapView extends RootView
@startLevel $(e.target).parents('.level-info-container')
startLevel: (levelElement) ->
setupManager = new LevelSetupManager supermodel: @supermodel, levelID: levelElement.data('level-id'), levelPath: levelElement.data('level-path'), levelName: levelElement.data('level-name'), hadEverChosenHero: @hadEverChosenHero, parent: @
setupManager.open()
@setupManager?.destroy()
@setupManager = new LevelSetupManager supermodel: @supermodel, levelID: levelElement.data('level-id'), levelPath: levelElement.data('level-path'), levelName: levelElement.data('level-name'), hadEverChosenHero: @hadEverChosenHero, parent: @
@setupManager.open()
@$levelInfo?.hide()
onMouseEnterLevel: (e) ->

View file

@ -69,8 +69,9 @@ module.exports = class ControlBarView extends CocoView
gameMenuModal = new GameMenuModal level: @level, session: @session, supermodel: @supermodel
@openModalView gameMenuModal
@listenToOnce gameMenuModal, 'change-hero', ->
setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @level.get('slug'), parent: @})
setupManager.open()
@setupManager?.destroy()
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @level.get('slug'), parent: @})
@setupManager.open()
onClickHome: (e) ->
e.preventDefault()
@ -84,3 +85,7 @@ module.exports = class ControlBarView extends CocoView
return if enabled is @controlsEnabled
@controlsEnabled = enabled
@$el.toggleClass 'controls-disabled', not enabled
destroy: ->
@setupManager?.destroy()
super()

View file

@ -280,8 +280,9 @@ module.exports = class PlayLevelView extends RootView
onSessionLoaded: (e) ->
# Just the level and session have been loaded by the level loader
if e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] and not _.size e.session.get('heroConfig')?.inventory ? {}
setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @})
setupManager.open()
@setupManager?.destroy()
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @})
@setupManager.open()
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['ladder', 'hero-ladder']
@ -556,6 +557,7 @@ module.exports = class PlayLevelView extends RootView
@god?.destroy()
@goalManager?.destroy()
@scriptManager?.destroy()
@setupManager?.destroy()
if ambientSound = @ambientSound
# Doesn't seem to work; stops immediately.
createjs.Tween.get(ambientSound).to({volume: 0.0}, 1500).call -> ambientSound.stop()

View file

@ -52,13 +52,14 @@ module.exports = class Spell
@tabView.render()
@team = @permissions.readwrite[0] ? 'common'
Backbone.Mediator.publish 'tome:spell-created', spell: @
Backbone.Mediator.subscribe 'real-time-multiplayer:new-opponent-code', @onNewOpponentCode
Backbone.Mediator.subscribe 'real-time-multiplayer:new-opponent-code', @onNewOpponentCode, @
destroy: ->
@view?.destroy()
@tabView?.destroy()
@thangs = null
@worker = null
Backbone.Mediator.unsubscribe 'real-time-multiplayer:new-opponent-code', @onNewOpponentCode, @
setLanguage: (@language) ->
#console.log 'setting language to', @language, 'so using original source', @languages[language] ? @languages.javascript
@ -192,7 +193,7 @@ module.exports = class Spell
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true))
false
onNewOpponentCode: (e) =>
onNewOpponentCode: (e) ->
return unless @spellKey and @canWrite e.team
if e.codeLanguage and e.code
[thangSlug, methodSlug] = @spellKey.split '/'