Unity3D - AdMob在Android中的回調造成崩潰的處理方式

版權聲明:本文爲博主原創文章,轉載請註明出處。 https://blog.csdn.net/xmousez/article/details/75068904

遊戲開發總是要接入各種各樣的SDK,廣告也成了一種常用的變現方式。而AdMob對於遊戲開發的老鳥來說一定不會陌生。 AdMob for Unity

RewardBasedVideoAd.Instance.OnAdFailedToLoad;
RewardBasedVideoAd.Instance.OnAdLoaded;
RewardBasedVideoAd.Instance.OnAdOpening;
RewardBasedVideoAd.Instance.OnAdStarted;
RewardBasedVideoAd.Instance.OnAdRewarded;
RewardBasedVideoAd.Instance.OnAdClosed;
RewardBasedVideoAd.Instance.OnAdLeavingApplication;

關鍵的地方無非就是監聽這幾個事件。本人在最初測試工程中並未發現任何異常,但是同樣的腳本放在項目中時卻出現了崩潰和UI顯示異常的狀況。具體現象:無論在OnAdRewarded還是在OnAdClosed中,如果有UI相關的邏輯,那麼就會出現顯示異常,如果有粒子特效,那麼就會出現崩潰後自動重啓應用。

Unity捕獲不到相關異常,但是Android日誌中會有這樣一個錯誤:call to OpenGL ES API with no current context (logged once per thread)

從內容和崩潰現象上看,這個是渲染異常造成的。根據之前瞭解的部分Android開發知識分析,廣告視頻在Android中會由單獨的Activity去播放,no current context,是否因爲回調發生在廣告視頻的Activity中,而此時Unity的Activity被掛起造成了渲染失敗呢?

於是想出了一個解決辦法:

RewardBasedVideoAd.Instance.OnAdRewarded += HandleOnAdRewarded;
private void HandleAdRewarded(object sender, Reward reward)
{
    reward = true;
}

void OnApplicationPause(bool pauseStatus)
{
    if (!pauseStatus && reward)
    {
        // do reward
        reward = false;
    }
}

果然,在這種先標記然後等待Unity的OnApplicationPause消息去調用的情況下,回調會在廣告播放完畢UnityActivity變爲活動狀態時執行,崩潰重啓的情況沒有再出現。

但是問題又來了,在iOS中並不是Activity這種機制,廣告播放時遊戲並不會暫停,也就不會出現OnApplicationPause消息。解決方案很簡單,將回調放到Update裏去執行即可。

另外,需要監聽的消息並不是只有這一個。在簡單優化後,代碼如下

private Queue<Action> callbackQueue = new Queue<Action>();

private void HandleAdRewarded(object sender, Reward reward)
{
    callbackQueue.Enqueue(delegate { Debug.Log("rewarded"); });
}
private void HandleAdClosed(object sender, EventArgs args)
{
    callbackQueue.Enqueue(delegate { Debug.Log("closed"); });
}

void Update()
{
    while (callbackQueue.Count > 0)
    {
        callbackQueue.Dequeue().Invoke();
    }
}

這樣就能避免在Android上的崩潰,同時在iOS下也能保證獎勵回調成功。

PS:雖然有人指出call to OpenGL ES API with no current context (logged once per thread)造成崩潰的情況應該算是OpenGL的Bug,但是作爲Unity的SDK,AdMob for Unity的回調並不在Unity的Activity中,這也實在是不太合理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章