FileReference.save () дублирует ByteArray - PullRequest
0 голосов
/ 15 мая 2009

Я столкнулся с проблемой памяти при использовании FileReference.save (). Мое приложение Flash генерирует много данных в режиме реального времени и должно сохранить эти данные в локальном файле. Как я понимаю, Flash 10 (в отличие от AIR) не поддерживает потоковую передачу в файл. Но что еще хуже, FileReference.save () дублирует все данные перед их сохранением. Я искал обходной путь к этому удвоенному использованию памяти и думал о следующем подходе:

Что если я передам пользовательский подкласс ByteArray в качестве аргумента FileReference.save (), где этот подкласс ByteArray переопределит все методы read * (). Переопределенные методы read * () будут ожидать, пока мое приложение сгенерирует фрагмент данных, вернут этот фрагмент данных и немедленно удалят его из памяти. Я знаю, сколько данных будет сгенерировано, поэтому я также могу переопределить методы length / bytesAvailable.

Возможно ли это? Не могли бы вы дать мне подсказку, как это сделать? Я создал подкласс ByteArray, зарегистрировал для него псевдоним, передал экземпляр этого подкласса в FileReference.save (), но каким-то образом FileReference.save (), кажется, обрабатывает его так же, как это был экземпляр ByteArray, и не вызвать любой из моих переопределенных методов ...

Большое спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 16 мая 2009

Это интересная идея. Возможно, для начала вам нужно просто добавить трассировки в расширенный массив ByteArray, чтобы увидеть, как FileReference # save () работает внутри.

Если у него есть какое-то

while( originalByteArray.bytesAvailable ) 
  writeToSaveBuffer( originalByteArray.readByte() );

функциональность переопределений может просто обрезать исходный буфер при каждом чтении, как вы говорите, что-то вроде:

override function readByte() : uint {
  var b : uint = super.readByte();
  // Truncate the bytes (assuming bytesAvailable = length - removedBytes)
  length = length - bytesAvailable;
  return b;
}

С другой стороны, если это теперь работает, я предполагаю, что оригинальный байтовый массив больше не будет доступен в приложении.

(я сам не проверял, усечение может потребовать больше работы, чем в примере)

0 голосов
/ 15 мая 2009

Это не то, что я пробовал раньше, но вы можете попробовать отправить данные в php-приложение, которое будет обрабатывать сохранение ByteArray на сервер, так же, как сохранение изображения на сервере, поэтому вы будете использовать URLLoader Вместо этого .data, используя что-то вроде этого:

http://www.zedia.net/2008/sending-bytearray-and-variables-to-server-side-script-at-the-same-time/

...