Async queries was Re: [vworld-tech] Re: Database usage

Brian Hook hook_l at pyrogon.com
Sat Feb 14 17:50:05 PST 2004


So the whole async query thing has caused a bit of a design quandary 
for me.  The simple, straightforward to handle async queries would be 
to do something where you iterate over all game objects, allowing them 
to 'tick'.  If one of them is needs something from the DB, it would do 
something like this (in Lua code)

-- Lua supports multiple return values
while true do
   lock, status = Lock.get_lock( lock_id )
   -- fired off a query that hasn't had its results
   -- cached, so we should yeild
   if status == 'pending' then
      coroutine.yield( self.co, 'waiting' )
   end
   break
end

The main meta-tick routine iterates over all objects in the world, 
letting them tick, and does this until all of them return 'finished' 
when they yield.  So in a game object tick routine you do something 
like this:

function GameObject:tick()
   while true do
      self:do_update_stuff();
      coroutine.yield( self.co, 'done')
   end
end

Which is basically an infinite loop that yields with a 'done' status 
when it's done doing internal updates.

Okay, so the world constantly resumes all the coroutines until they 
have all reported they're done for that tick.

Easy in theory, but there is a big problem with synchronization 
points.  Assume you update the world at a fixed tick, and within each 
tick different objects have different priorities (e.g. in combat 
you're dealing with initiative), then you _can't_ allow some objects 
to go before the previous object has completed its tick.  

It would seem that this would be a fairly common case -- am I missing 
something glaringly obvious, or will there simply be either a bunch of 
sync points or, even worse, a bunch of sorting by non-competing 
objects into buckets that can be updated safely out of order?

Brian



More information about the vworld-tech mailing list