3

Flash のLocalConnectionメカニズムでは、 に渡される個々のメッセージのサイズが 40k に制限されていますsend()。送信する必要がある複雑なオブジェクトがあり、最終的に大きすぎる可能性がある状況に遭遇しています。

オブジェクトを複数の小さなオブジェクトに分割できますが、効率的な方法で分割したいと考えています。何百もの小さなオブジェクトになる可能性があり、それぞれを個別に送信する必要はありません. さらに、各オブジェクトは任意のサイズになる可能性があるため、それらをグループ化するための数値を選択することはできません。

送信する前にオブジェクトのサイズを決定する方法はありますか? もしそうなら、私はそれを使っていくつかの簡単な計算を行い、オブジェクトをある程度最適に分割することができます (または、十分に小さい場合は直接送信するだけです)。

4

2 に答える 2

1

データを使用して一時的な SharedObject を構築することにより、オブジェクトを LocalConnection に送信する前に、オブジェクトのサイズを少なくとも推定する方法を見つけました。SharedObject はディスクに書き込まれることはないため、ローカル ストレージが許可されていない場合でも機能するようです。

サイズを決定するために使用する関数は次のとおりです。

public static function getObjectSize(o:Object):Number {
  var so:SharedObject = SharedObject.getLocal("__getObjectSizeHelper");
  so.data.o = o;
  var size:Number = so.getSize();
  so.clear();
  return size;
}

送信している大きすぎるメッセージは、複雑なオブジェクトの配列です。個々のオブジェクトが大きすぎることはないと仮定します (100% 保証されているわけではありませんが、十分な大きさにするのに十分なデータを入力するユーザーはいない可能性が高く、今のところこのケースを無視することで、物事がはるかに簡単になります)。この前提を踏まえて、送信する前に配列をチェックします。大きすぎる場合は、半分に分割して、これら 2 つの配列を試します。すべてが十分に小さい一連の配列に到達するまで、再帰的に半分に分割し続けます (ほとんどの場合、1 つ以上の分割が必要になることはありませんが、必要な場合は 2 つまたは 3 つだけです)。

次に、アレイの各部分を個別に送信し、通信チャネルの反対側で再結合できます。

配列を複数の配列に分割するために作成したコードを次に示します。これらの配列はすべて送信するのに十分小さいです。

public static function isTooBigForLC(o:Object):Boolean {
  return getObjectSize(o) > 35000;
}

public static function splitArrayForLC(a:Array):Array {
  if (!isTooBigForLC(a)) { return [a]; }

  if (a.length <= 1) {
    LOG.warn("individual object is too big for LocalConnection! Skipping");
    return [];
  }

  var mid:Number = Math.floor(a.length / 2);

  var left:Array = splitArrayForLC(a.slice(0, mid));
  var right:Array = splitArrayForLC(a.slice(mid));

  return left.concat(right);
}

送信する前に大きすぎる可能性のある配列でこれを呼び出すように送信コードを変更し、「分割された」配列のそれぞれを個別に送信します。次に、受信コードでそれらを再結合し、結合されたデータで単一のイベントを発生させます。

私は今のところこれを更新し続けています(ドキュメント付き)。

http://gist.github.com/224258

于 2009-11-02T16:39:27.933 に答える
0

100% 確信があるわけではありませんが、Ultrashock に関するこの投稿は、必要なものと似ています

「大量のテキストや XML オブジェクトを文字列として送信する必要がある場合、すぐにこの上限にぶつかります。事実上無制限の文字列を送信できるようにする LocalConnection への小さな変更を共有したいと思います。それは単純に分割されます。すべてが 40K 未満に留まるように、必要な数の「send」ステートメントにまとめます。」

サイズを知る必要なく、送信された各セグメントが課された制限を下回っていることを確認します。

于 2009-10-29T21:55:59.453 に答える