Hi David,

On Tue, Sep 8, 2009 at 10:24 AM, David Given <[email protected]> wrote:

>
> Brandon N. Wirtz wrote:
> > You could build one of these... You'd go broke running it.  A MUD is
> always
> > running.. It handles multiple threads and not only accepts requests but
> > sends them to the user..
>
> I actually *am* building something like one of these (using Java).
>
> The biggest problem I've got is that GAE has no synchronisation
> mechanisms. None. There are transactions, but as they only work on
> single entities they're useless. This means that it's very hard to run
> game logic that needs to synchronously touch the global database.
>

Not true - Transactions can encompass entire entity groups. With the correct
entity group configuration, you could perform updates on local areas of the
map transactionally.


> To work round this I've implemented my own semaphore backed by the
> datastore; it's extremely nasty but does actually work. I then read the
> entire game database out of a blob in a single entity into RAM, run the
> game logic, write the database back again, and release the semaphore.
> That is also extremely nasty but it does all actually work. (My game's
> actually intended to be run on a standalone server, not GAE, but the
> persistence layers are all abstracted out to let me host on GAE for
> development purposes.) It'll congest rather badly but by the time
> congestion becomes an issue I should have a more suitable server.
>
> Performance isn't bad; I'm usually getting request times of about 500ms
> when the server's hot. That breaks down to:
>
> startup:             anything from 10 to 5000ms
> db load:             50ms
> game logic:          <50ms
> build client update: 50ms (varies according to the size of the update)
> db save:             100ms
>
> Startup time is very strange. Sometimes it's practically nil, usually
> it's 100ms or so, and if the server's not hot it something takes many
> seconds (together with weird warnings about failing to start the
> finalisation thread). It's all out of my control --- it happens before
> the app starts.
>
> Note that the cheapest part of the whole process is actually running the
> game logic! Most of the time most requests take 0ms, as nothing will
> have actually happened since the last request...
>
> > GAE no process can run for more than a few seconds, so you'd have to use
> > some polling tricks on the client to ask what happened and have a chron
> job
> > run the main thread every few seconds...
>
> I'm running the game logic asynchronously on-demand. After all, you only
> need to change things when someone's looking! This works beautifully,
> but if it's been a couple of days since the last request it can take a
> while; I'm planning to use a cron job to update the server every half
> hour or so to avoid this.
>
> If you're writing a text-based game things will be both easier and
> harder. Easier, in that you don't have to do all the complex database
> synchronisation between the client and the server that I'm doing, and
> harder, because the game logic itself will be more complex and the
> client will need to poll much more frequently. (I can get away with a
> poll every ten minutes or so. A MUD can't.)
>
> --
> ┌─── dg@cowlark.com ───── http://www.cowlark.com ─────
> │
> │ "They laughed at Newton. They laughed at Einstein. Of course, they
> │ also laughed at Bozo the Clown." --- Carl Sagan
>
> >
>


-- 
Nick Johnson, Developer Programs Engineer, App Engine

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to