God prepares Workers for Angelic consumption ahead of time.

This commit is contained in:
Nick Winter 2014-02-10 17:09:19 -08:00
parent f812241bd5
commit 7d5db41f5d
2 changed files with 30 additions and 11 deletions

View file

@ -1,4 +1,5 @@
{now} = require './world/world_utils'
{now} = require 'lib/world/world_utils'
World = require 'lib/world/world'
## Uncomment to imitate IE9 (and in world_utils.coffee)
#window.Worker = null
@ -13,17 +14,35 @@ module.exports = class God
maxAngels: 2 # how many concurrent web workers to use; if set past 8, make up more names
worldWaiting: false # whether we're waiting for a worker to free up and run the world
constructor: (@world, @level) ->
constructor: ->
@id = God.nextID()
@angels = []
@firstWorld = true
Backbone.Mediator.subscribe 'tome:cast-spells', @onTomeCast, @
@fillWorkerPool = _.throttle @fillWorkerPool, 3000, leading: false
@fillWorkerPool()
onTomeCast: (e) ->
return if @dead
@spells = e.spells
@createWorld()
fillWorkerPool: =>
return unless Worker
@workerPool ?= []
while @workerPool.length < @maxAngels
@workerPool.push @createWorker()
getWorker: ->
@fillWorkerPool()
worker = @workerPool.shift()
return worker if worker
@createWorker()
createWorker: ->
console.log "yo create worker"
new Worker '/javascripts/workers/worker_world.js'
getAngel: ->
freeAngel = null
for angel in @angels
@ -67,7 +86,7 @@ module.exports = class God
@worldWaiting = true
return
angel.worker.postMessage {func: 'runWorld', args: {
worldName: @world.name
worldName: @level.name
userCodeMap: @getUserCodeMap()
level: @level
firstWorld: @firstWorld
@ -81,7 +100,7 @@ module.exports = class God
@latestWorldCreation = worldCreation
@latestGoalStates = goalStates
window.BOX2D_ENABLED = false # Flip this off so that if we have box2d in the namespace, the Collides Components still don't try to create bodies for deserialized Thangs upon attachment
@world.constructor.deserialize serialized, @world.classMap, @lastSerializedWorldFrames, worldCreation, @finishBeholdingWorld
World.deserialize serialized, @worldClassMap, @lastSerializedWorldFrames, worldCreation, @finishBeholdingWorld
window.BOX2D_ENABLED = true
@lastSerializedWorldFrames = serialized.frames
@ -133,7 +152,7 @@ module.exports = class God
@latestGoalStates = @testGM?.getGoalStates()
serialized = @testWorld.serialize().serializedWorld
window.BOX2D_ENABLED = false
@testWorld.constructor.deserialize serialized, @world.classMap, @lastSerializedWorldFrames, @t0, @finishBeholdingWorld
World.deserialize serialized, @worldClassMap, @lastSerializedWorldFrames, @t0, @finishBeholdingWorld
window.BOX2D_ENABLED = true
@lastSerializedWorldFrames = serialized.frames
@ -168,7 +187,8 @@ class Angel
@spawnWorker()
spawnWorker: ->
@worker = new Worker '/javascripts/workers/worker_world.js'
@worker = @god.getWorker()
console.log "yo got worker", @worker
@listen()
enslave: ->

View file

@ -104,6 +104,7 @@ module.exports = class PlayLevelView extends View
load: ->
@levelLoader = new LevelLoader(@levelID, @supermodel, @sessionID)
@levelLoader.once 'loaded-all', @onLevelLoaderLoaded
@god = new God()
getRenderData: ->
c = super()
@ -118,15 +119,16 @@ module.exports = class PlayLevelView extends View
onLevelLoaderLoaded: =>
@session = @levelLoader.session
@level = @levelLoader.level
@world = @levelLoader.world
@level = @levelLoader.level
@levelLoader.destroy()
@levelLoader = null
@loadingScreen.destroy()
@god.level = @level.serialize @supermodel
@god.worldClassMap = @world.classMap
#@setTeam @world.teamForPlayer _.size @session.get 'players' # TODO: players aren't initialized yet?
@setTeam @getQueryVariable("team") ? @world.teamForPlayer(0)
@initSurface()
@initGod()
@initGoalManager()
@initScriptManager()
@insertSubviews()
@ -320,9 +322,6 @@ module.exports = class PlayLevelView extends View
@surface.camera.setBounds(bounds)
@surface.camera.zoomTo({x:0, y:0}, 0.1, 0)
initGod: ->
@god = new God @world, @level.serialize @supermodel
initGoalManager: ->
@goalManager = new GoalManager(@world)
@god.goalManager = @goalManager