2011-08-20 23 views
8

私の状況は次のとおりです。私はAS3ベースのゲームで作業しています。問題を報告したいと思います。ユーザーが私にフィードバックを送ることができるように、ゲーム内で機能します。ActionScriptには「コアダンプ」と同等の機能がありますか?

私のユーザーが問題を報告したとき、私は自分のゲームの状態についてできるだけ多くの情報を得たいと思います。基本的にどのオブジェクトがメモリ内にあるか、それらのオブジェクト内のすべての変数の値私がデバッガでブレークポイントに達したときに得られる情報と本質的に同じです。

これを行う簡単な方法はありますか?私は数日間、私のためにすべての情報を取得する関数を作成しようとしているのですが、後で誰かに私に「ああ、どうしてあなたはASUtils.getSnapshot()を呼び出さなかったのですか? ?

+0

通常のFlash Playerは、意味のある一般的なダンプを実行するのに十分な情報を実行時に保持していないといういくつかの状況の証拠があります。特に、 'Error.getStackTrace()'はデバッグプレイヤーでしか動作しません。 –

+0

パブリッシュする前に実行するスクリプトを使用して、コールトレースを挿入できます。これにより、非デバッグ・フラッシュ・プレイヤーで関数呼び出しの履歴を記録することができます。 (下の私の答えを参照してください) – Toxikman

答えて

7

あなたの変数の状態をダンプするAS3には、一般的な方法はありませんが、あなたが有用見つけるかもしれないことを私たちはいくつかあります。

  1. 最近のクリックアクティビティのログをキャプチャが。ステージイベントリスナーを使用してクリックを記録し、オブジェクトの「パス」を親チェーンの上にステージまでトレースします。オブジェクトのパスは、次のようなDisplayObjectの名前だけです。screenMain.dialogBu​​yItem.buttonBuy
  2. スクリーンショットをキャプチャし、小さなサムネイルに縮小し、JPEGエンコードしてフィードバックとともにサーバーにアップロードします。例外がある場合もこれを行います(#4を参照)。 as3corelibにはJPEG符号化機能がありますcom/adobe/images
  3. AS3コードで実行できるコマンドラインパールまたはPHPスクリプトを作成してから、各関数呼び出しの先頭にコールトレースを挿入します。これにより、通話履歴を記録できます。それは完全なスタックほど良くはありませんが、あなたのコードが最近何をしているかを示すものです。
  4. トラップがアサートされ、未処理の例外が発生し、クリックアクティビティと通話履歴のトレースによってサーバーにログに記録されます。未処理の例外リスナーは、Flash 10.1で新しく追加されましたが、ほとんどのユーザーにこの機能があります。あなたはそのサポートのためにチェックして、次のようにリスナーを追加することができます:あなたがフィードバックを記録したいグローバル状態変数を持っている場合は、あなたがアップロードするための文字列にそれらをダンプする関数を書くことができます

    // Check for the presence of the Flash 10.1 global Error event (exception) handler class. 
    // If it exists, we'll listen for it and it will allow us to report errors to our server. 
    if (loaderInfo.hasOwnProperty('uncaughtErrorEvents')) 
        loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError); // UncaughtErrorEvent.UNCAUGHT_ERROR 
    
  5. ユーザーからのフィードバック。 for eachを使用してクラスとオブジェクトのプロパティを列挙することはできますが、これはパブリックメンバーに対してのみ機能します。 Googleの周りには、この列挙トリックを使用して、オブジェクトをダンプしてデータを再帰的に配列するために人々が書いた関数がいくつかあります。

+0

非常に徹底的。変数を文字列にダンプする方法については、ここで私が使用しているものです:[ObjectUtil.as](https://github.com/magicalhobo/SWFWire/blob/master/SWFWireUtils/src/com/swfwire/utils/ObjectUtil.as)。それは、パフォーマンスよりもかなり見栄えに焦点を当てています。 –

+0

オブジェクトをダンプするSeanのコードは良いです。 SWFWireは印象的な、素晴らしい仕事ショーンです!私はSWFWireデバッガを使用してゲームを実行しようとしましたが、動作しませんでした。 :(私はGitHubにバグを投稿しました。ガベージコレクションを取得していないオブジェクトを検出するための素晴らしいツールでしょうか。 – Toxikman

1

私はコメントとしてこれを追加したいのですが、これは、私は複雑なオブジェクトを追跡するために使用しているものです
をフォーマットコードを失いたくない:

private function parseObject(o:Object, prefix:String = '>'):String { 
     var retStr:String = ''; 
     for (var s:String in o) { 
      retStr += prefix + s + ' = ' + o[s] + '\n'; 
      if (typeof(o[s]) == 'object') { 
       retStr += parseObject(o[s], prefix + '>'); 
      } 
     } 
     return retStr; 
    } 

役に立つと願っています

関連する問題