views:

213

answers:

1

I'm trying to work out some kinks in a multitouch application I've built. It uses flosc to communicate with a xml socket server that sends the multitouch events.

This all works fine and dandy for most of the time.

But if I'm mean and flood it with multitouch events Flash can't keep up with parsing the input, and the socket just keeps getting data that piles up until it either catches up or the whole thing crashes.

I have no problem discarding input once there's too much*, but I'm having trouble devising a clever way to do it.

* The app does 6-10 simultaneous inputs with no problem, things start to get hairy once I have to deal with 20+ which basically means someone is lying on the table ;)

+1  A: 

Where is it choking? First I would start with doing some analysis.

Profile the "Server":

  • how much time it is taking to do XML encoding?
  • how much time it is taking to completely write to the socket?

Profile the Client:

  • how much time is it taking to read the data from the socket?
  • how much time is it taking to decode the XML?

Personally for something like this I would avoid XML if you could, and/or try to lazy-decode the xml (do it when you know you need it...so you can throw away XML chunks without wasting cpu cycles if your program is getting overloaded).

I would try to go with a raw Socket class http://www.adobe.com/livedocs/flash/9.0/main/00000318.html#wp128960 and a custom packet format, an array where each index contains relevant data. in psudocode:

messageArray = [message type, arg0, arg1, arg2...];

so you might have a 'mouse move event' defined like:

MessageConstants.MOUSE_MOVE = 0; // or whatever id you want

messageArray = [MessageConstants.MOUSE_MOVE, mouseDeltaX, mouseDeltaY];

Then use AMF http://en.wikipedia.org/wiki/Action_Message_Format to serialize the data over the wire.

Hope this helps.

Jotham
i can't touch the server at all, it runs using a standard protocol (flosc) and can connect to multiple servers. surprisingly the app spends only about 5% of time in parsing the data, the vast majority is spent rendering. right now i'm starting to suspect if it all starts with an exception throwing everything off from there on.
grapefrukt
Okay, yeah well if you aren't managing your exceptions somethings likely to bust. Are you using the Debug Player / Plugin ActiveX? Also, i'd probably simply keep a queue, maybe a FIFO of n events, and push them into it from the flosc feed and pull them out as you process them. If the queue is at maximum size, either eject one from either end (depending on what works best). The other option is to give all your event types weights based on the importance of the event, and maybe the time it was captured then using a priority queue http://en.wikipedia.org/wiki/Priority_queue of n items.
Jotham
Turns out it was in fact an exception being thrown "deeper" in my code. Once the exception was thrown flash never quite caught up and just kept getting even more exceptions. What happened was that when the app gets a lot of input it can get touch events in the wrong order, ie. a touch-move will arrive after a touch-up. My logic didn't handle this, so it tried updating something that wasn't there thus using already removed instances. But that was an easy fix once I found it.
grapefrukt
Congrats! Glad to see you sorted it out.
Jotham