Запирание сокета Flash XML
-
19-09-2019 - |
Вопрос
Я пытаюсь исправить некоторые недостатки в созданном мною мультитач-приложении.Оно использует хлопья для связи с сервером сокетов XML, который отправляет события мультитач.
Все это работает отлично и отлично большую часть времени.
Но если я буду злым и наполню его событиями мультитач, Flash не сможет справиться с анализом входных данных, и сокет будет просто продолжать получать данные, которые накапливаются, пока они не догонят его или все это не выйдет из строя.
У меня нет проблем с отбрасыванием введенных данных, если их слишком много*, но мне сложно придумать умный способ сделать это.
* Приложение без проблем выполняет 6-10 одновременных вводов, но когда мне приходится иметь дело с 20+, все становится сложнее, что по сути означает, что кто-то лежит на столе ;)
Решение
Где оно задыхается?Для начала я бы начал с анализа.
Профиль «Сервер»:
- сколько времени занимает кодирование XML?
- сколько времени требуется для полной записи в сокет?
Профиль клиента:
- сколько времени занимает чтение данных из сокета?
- сколько времени требуется для декодирования XML?
Лично для чего-то подобного я бы избегал XML, если бы вы могли, и/или пытался бы лениво декодировать xml (делайте это, когда знаете, что вам это нужно... чтобы вы могли выбрасывать фрагменты XML, не тратя впустую циклы процессора, если ваша программа перегружаюсь).
Я бы попробовал использовать необработанный класс Socket. http://www.adobe.com/livedocs/flash/9.0/main/00000318.html#wp128960 и собственный формат пакета — массив, в котором каждый индекс содержит соответствующие данные.в псевдокоде:
messageArray = [message type, arg0, arg1, arg2...];
поэтому у вас может быть «событие перемещения мыши», определенное следующим образом:
MessageConstants.MOUSE_MOVE = 0; // or whatever id you want
messageArray = [MessageConstants.MOUSE_MOVE, mouseDeltaX, mouseDeltaY];
Тогда используйте AMF http://en.wikipedia.org/wiki/Action_Message_Format для сериализации данных по сети.
Надеюсь это поможет.