Trying to do some memory cleanup.

This commit is contained in:
Nick Winter 2014-02-15 15:44:45 -08:00
parent c418e282ae
commit 3c7cac8ba9
6 changed files with 48 additions and 31 deletions

View file

@ -110,7 +110,7 @@ module.exports = class God
newWorld.findFirstChangedFrame @world
@world = newWorld
errorCount = (t for t in @world.thangs when t.errorsOut).length
Backbone.Mediator.publish('god:new-world-created', world: @world, firstWorld: @firstWorld, errorCount: errorCount, goalStates: @latestGoalStates)
Backbone.Mediator.publish('god:new-world-created', world: @world, firstWorld: @firstWorld, errorCount: errorCount, goalStates: @latestGoalStates, team: me.team)
for scriptNote in @world.scriptNotes
Backbone.Mediator.publish scriptNote.channel, scriptNote.event
@goalManager?.world = newWorld
@ -130,6 +130,7 @@ module.exports = class God
angel.destroy() for angel in @angels
@dead = true
Backbone.Mediator.unsubscribe('tome:cast-spells', @onTomeCast, @)
@goalManager.destroy()
@goalManager = null
@fillWorkerPool = null
@simulateWorld = null

View file

@ -22,8 +22,15 @@ module.exports = class LevelLoader extends CocoClass
subscriptions:
'god:new-world-created': 'loadSoundsForWorld'
constructor: (@levelID, @supermodel, @sessionID, @team, @opponentSessionID) ->
constructor: (options) ->
super()
@supermodel = options.supermodel
@levelID = options.levelID
@sessionID = options.sessionID
@opponentSessionID = options.opponentSessionID
@team = options.team
@headless = options.headless
@loadSession()
@loadLevelModels()
@loadAudio()
@ -31,6 +38,7 @@ module.exports = class LevelLoader extends CocoClass
_.defer @update # Lets everything else resolve first
playJingle: ->
return if @headless
jingles = ["ident_1", "ident_2"]
AudioPlayer.playInterfaceSound jingles[Math.floor Math.random() * jingles.length]
@ -42,18 +50,18 @@ module.exports = class LevelLoader extends CocoClass
else
url = "/db/level/#{@levelID}/session"
url += "?team=#{@team}" if @team
@session = new LevelSession()
@session.url = -> url
@session.fetch()
@session.once 'sync', @onSessionLoaded, @
if @opponentSessionID
@opponentSession = new LevelSession()
@opponentSession.url = "/db/level_session/#{@opponentSessionID}"
@opponentSession.fetch()
@opponentSession.once 'sync', @onSessionLoaded, @
sessionsLoaded: ->
@session.loaded and ((not @opponentSession) or @opponentSession.loaded)
@ -71,6 +79,7 @@ module.exports = class LevelLoader extends CocoClass
@supermodel.once 'error', @onSupermodelError, @
@level = @supermodel.getModel(Level, @levelID) or new Level _id: @levelID
levelID = @levelID
headless = @headless
@supermodel.shouldPopulate = (model) ->
# if left unchecked, the supermodel would load this level
@ -78,6 +87,11 @@ module.exports = class LevelLoader extends CocoClass
handles = [model.id, model.get 'slug']
return model.constructor.className isnt "Level" or levelID in handles
@supermodel.shouldLoadReference = (model) ->
#return false if headless and model.constructor.className is 'ThangType'
# would be great if we didn't have to load ThangTypes, but need their names
true
@supermodel.populateModel @level
onSupermodelError: ->
@ -87,22 +101,11 @@ module.exports = class LevelLoader extends CocoClass
onSupermodelLoadedOne: (e) ->
@notifyProgress()
# if e.model.type() is 'ThangType'
# thangType = e.model
# options = {async: true}
# if thangType.get('name') is 'Wizard'
# options.colorConfig = me.get('wizard')?.colorConfig or {}
# building = thangType.buildSpriteSheet options
# if building
# @spriteSheetsToBuild += 1
# thangType.once 'build-complete', =>
# @spriteSheetsBuilt += 1
# @notifyProgress()
onSupermodelLoadedAll: ->
@trigger 'loaded-supermodel'
@stopListening(@supermodel)
@update()
@update?()
# Things to do when either the Session or Supermodel load
@ -140,6 +143,7 @@ module.exports = class LevelLoader extends CocoClass
@buildSpriteSheets()
buildSpriteSheets: ->
return if @headless
thangTypes = {}
thangTypes[tt.get('name')] = tt for tt in @supermodel.getModels(ThangType)
@ -175,9 +179,11 @@ module.exports = class LevelLoader extends CocoClass
# Initial Sound Loading
loadAudio: ->
return if @headless
AudioPlayer.preloadInterfaceSounds ["victory"]
loadLevelSounds: ->
return if @headless
scripts = @level.get 'scripts'
return unless scripts
@ -194,6 +200,7 @@ module.exports = class LevelLoader extends CocoClass
# Dynamic sound loading
loadSoundsForWorld: (e) ->
return if @headless
world = e.world
thangTypes = @supermodel.getModels(ThangType)
for [spriteName, message] in world.thangDialogueSounds()
@ -212,8 +219,11 @@ module.exports = class LevelLoader extends CocoClass
supermodelProgress = @supermodel.progress()
overallProgress += supermodelProgress * 0.7
overallProgress += 0.1 if @sessionsLoaded()
spriteMapProgress = if supermodelProgress is 1 then 0.2 else 0
spriteMapProgress *= @spriteSheetsBuilt / @spriteSheetsToBuild if @spriteSheetsToBuild
if @headless
spriteMapProgress = 0.2
else
spriteMapProgress = if supermodelProgress is 1 then 0.2 else 0
spriteMapProgress *= @spriteSheetsBuilt / @spriteSheetsToBuild if @spriteSheetsToBuild
overallProgress += spriteMapProgress
return overallProgress
@ -223,8 +233,8 @@ module.exports = class LevelLoader extends CocoClass
@trigger 'loaded-all' if @progress() is 1
destroy: ->
super()
@world = null # don't hold onto garbage
@supermodel.off 'loaded-one', @onSupermodelLoadedOne
@onSupermodelLoadedOne = null
@notifyProgress = null
@update = null
super()

View file

@ -29,9 +29,8 @@ module.exports = class Simulator
setupSimulationAndLoadLevel: (taskData) =>
@task = new SimulationTask(taskData)
@supermodel = new SuperModel()
@god = new God()
@levelLoader = new LevelLoader @task.getLevelName(), @supermodel, @task.getFirstSessionID()
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @task.getLevelName(), sessionID: @task.getFirstSessionID(), headless: true
@levelLoader.once 'loaded-all', @simulateGame
simulateGame: =>
@ -48,8 +47,10 @@ module.exports = class Simulator
@world = @levelLoader.world
@level = @levelLoader.level
@levelLoader.destroy()
@levelLoader = null
setupGod: ->
@god = new God()
@god.level = @level.serialize @supermodel
@god.worldClassMap = @world.classMap
@setupGoalManager()
@ -88,6 +89,10 @@ module.exports = class Simulator
@fetchAndSimulateTask()
cleanupSimulation: ->
@god.destroy()
@god = null
@world = null
@level = null
formTaskResultsObject: (simulationResults) ->
taskResults =
@ -234,4 +239,3 @@ class SimulationTask
_.merge spellKeyToSourceMap, _.pick(session.code, commonSpells) if commonSpells?
spellKeyToSourceMap

View file

@ -15,8 +15,9 @@ class SuperModel
@modelLoaded(model) if model.loaded
# replace or overwrite
shouldPopulate: (url) -> return true
shouldSaveBackups: (model) -> return false
shouldLoadReference: (model) -> true
shouldPopulate: (url) -> true
shouldSaveBackups: (model) -> false
modelErrored: (model) ->
@trigger 'error'
@ -28,7 +29,7 @@ class SuperModel
refs = model.getReferencedModels(model.attributes, schema.attributes)
refs = [] unless @mustPopulate is model or @shouldPopulate(model)
# console.log 'Loaded', model.get('name')
for ref, i in refs
for ref, i in refs when @shouldLoadReference ref
ref.saveBackups = @shouldSaveBackups(ref)
refURL = ref.url()
continue if @models[refURL]

View file

@ -104,7 +104,7 @@ module.exports = class PlayLevelView extends View
@load()
load: ->
@levelLoader = new LevelLoader(@levelID, @supermodel, @sessionID, @getQueryVariable("team"), @getQueryVariable('opponent'))
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @getQueryVariable('opponent'), team: @getQueryVariable("team")
@levelLoader.once 'loaded-all', @onLevelLoaderLoaded
@god = new God()
@ -124,7 +124,7 @@ module.exports = class PlayLevelView extends View
@session = @levelLoader.session
@world = @levelLoader.world
@level = @levelLoader.level
if s = @levelLoader.opponentSession
spells = s.get('teamSpells')?[s.get('team')]
opponentCode = s.get('code')
@ -133,7 +133,7 @@ module.exports = class PlayLevelView extends View
continue unless c = opponentCode[spell]
myCode[spell] = c
@session.set('code', myCode)
@levelLoader.destroy()
@levelLoader = null
@loadingScreen.destroy()
@ -387,6 +387,7 @@ module.exports = class PlayLevelView extends View
team = team?.team unless _.isString team
team ?= 'humans'
me.team = team
console.log "level:team-set to", team
Backbone.Mediator.publish 'level:team-set', team: team
destroy: ->

View file

@ -90,7 +90,7 @@ module.exports = class SpectateLevelView extends View
@load()
load: ->
@levelLoader = new LevelLoader(@levelID, @supermodel, @sessionID)
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @getQueryVariable('opponent'), team: @getQueryVariable("team")
@levelLoader.once 'loaded-all', @onLevelLoaderLoaded
@god = new God()