2011-08-20 103 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. 編寫一個命令行珍珠或PHP腳本,您可以在您的AS3代碼上運行,然後發佈它,在每個函數調用的頂部插入呼叫跟蹤。這允許記錄通話記錄。儘管它不如完整的堆棧,它會給你一些你的代碼最近在做什麼的跡象。
  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來枚舉類和對象屬性,但這隻適用於公共成員。谷歌周圍,你會發現人們已經寫了一些函數遞歸使用這種枚舉技巧轉儲對象和數組數據。

+0

非常徹底。關於將變量轉儲到字符串,下面是我使用的變量:[ObjectUtil.as](https://github.com/magicalhobo/SWFWire/blob/master/SWFWireUtils/src/com/swfwire/utils/ObjectUtil.as)。它側重於看起來漂亮而不是表現。 –

+0

肖恩的轉儲對象的代碼是很好的。 SWFWire是令人印象深刻的,不錯的作品肖恩!我試圖通過SWFWire調試器來運行我們的遊戲,但它失敗了。 :(我在GitHub上發佈了一個bug,它是一個很好的工具,可以檢測沒有收集垃圾的對象。 – 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; 
    } 

希望這會有所幫助

相關問題