0

FileReference.save() を使用してメモリの問題が発生しました。私の Flash アプリケーションはリアルタイムで大量のデータを生成し、このデータをローカル ファイルに保存する必要があります。私が理解しているように、Flash 10 (AIR とは対照的に) はファイルへのストリーミングをサポートしていません。しかし、さらに悪いことに、 FileReference.save() は保存する前にすべてのデータを複製します。この 2 倍のメモリ使用量に対する回避策を探していて、次のアプローチについて考えました。

ByteArray のカスタム サブクラスを引数として FileReference.save() に渡すとどうなるでしょうか。この ByteArray サブクラスはすべての read*() メソッドをオーバーライドします。オーバーライドされた read*() メソッドは、アプリケーションによってデータが生成されるのを待ち、このデータを返し、すぐにメモリから削除します。生成されるデータの量はわかっているので、length/bytesAvailable メソッドをオーバーライドすることもできます。

それは可能でしょうか?やり方のヒントを教えてください。ByteArray のサブクラスを作成し、そのエイリアスを登録し、このサブクラスのインスタンスを FileReference.save() に渡しましたが、どういうわけか FileReference.save() はそれを ByteArray インスタンスと同じように扱っているようで、そうではありませんオーバーライドされたメソッドのいずれかを呼び出します...

助けてくれてありがとう!

4

2 に答える 2

0

これは私が以前に試したことではありませんが、画像をサーバーに保存するのと同じように、ByteArray をサーバーに保存することを処理する php アプリケーションにデータを送信してみてください。代わりに URLLoader.data を使用します。 、次のようなものを使用します。

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

于 2009-05-15T18:24:27.457 に答える
0

面白いアイデアです。おそらく、拡張された 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;
}

一方、これが機能するようになった場合、元のバイト配列は後でアプリケーションで使用できなくなると思います。

(私はこれを自分でテストしていません。切り捨てには、例よりも多くの作業が必要になる場合があります)

于 2009-05-16T14:11:01.240 に答える