最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在Unity中檢測死循環(huán)和卡死

 更新時間:2020年08月25日 09:28:20   作者:Qing''''s Blog  
這篇文章主要介紹了在Unity中檢測死循環(huán)和卡死的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

當(dāng)游戲在手機(jī)/模擬器上卡死,logcat沒有日志輸出,也沒有卡死堆棧信息或者bugly也沒有捕獲到異常,你是否很焦急?本文介紹一下我們項(xiàng)目中檢測Unity卡死的方法,也許適合你使用。

實(shí)現(xiàn)原理

在絕大多數(shù)情況下我們可以認(rèn)為Unity是單線程的,基于這點(diǎn)我們在Unity的系統(tǒng)函數(shù)FixedUpdate中統(tǒng)計(jì)游戲運(yùn)行期間的總幀數(shù),如果Unity沒有卡死,那么TotalFrame是會一直累加的,如果在某一段時間內(nèi)TotalFrame都不會變化了,則可以認(rèn)為Unity已經(jīng)卡死了

既然Unity的主線程已經(jīng)卡死了,我們就需要用另一個線程用來定時檢查unity主線程中的TotalFrame是否不會變化了

示例代碼

using System;
using System.Threading;
using UnityEngine;

namespace KEngine
{
 /// <summary>
 /// 開另外一個線程檢測unity是否被卡死
 /// </summary>
 public static class UnityThreadDetect
 {
  public static Thread _MainThread = System.Threading.Thread.CurrentThread;//獲取unity線程
  private static int check_interval = 3000;//檢測間隔

  public static void Start()
  {
   new Thread(CheckMainThread).Start();
  }
  
  static void CheckMainThread()
  {
   long frame = 0;
   while(!AppEngine.IsApplicationQuit)
   {
    frame = AppEngine.TotalFrame;
    Thread.Sleep(check_interval);
    if (frame == AppEngine.TotalFrame)
    {
     Log.LogToFile("unity thread dead,ThreadState:{0}",_MainThread.ThreadState);
     if (AppEngine.IsApplicationFocus)
     {
      //todo report error
     }
    }
   }
  }
 }
}

捕獲卡死的方法名

在我們的游戲中一般出現(xiàn)卡死的情況都是在定時器里面,我們的定時器是通過在Unity的Update驅(qū)動定時器列表,當(dāng)卡死時,在另一個線程中打印出定時器中正在執(zhí)行的函數(shù)就可以定位到卡死的函數(shù)了。定時器可參考:UnityTimer中的Timer.cs

同時在Unity的Update進(jìn)行派發(fā)多個事件,比如PreUpdate,Update,以便出問題更容易定位到卡在那兒

舉例說明問題

下面舉例我們遇到的出現(xiàn)卡死的問題

死循環(huán)

下面這個死循環(huán)在Unity中會卡死,而在.NET中不會,.NET中當(dāng)i超過byte的最大值255時i會從0開始

public static void TesBadCode()
{
	byte i = 0; 
	while (true)
	{
		i++;
	}
}

目前我們遇到的絕大多數(shù)情況都是邏輯代碼中寫了where(true) do xxx 然后里面某些情況不會break,導(dǎo)致循環(huán)永遠(yuǎn)退不出來

屏蔽了事件系統(tǒng)

在某些系統(tǒng)中屏蔽掉了UGUI的事件系統(tǒng),導(dǎo)致無法接受用戶輸入,這個問題不應(yīng)該歸類為Unity卡死,但用戶反饋來看就是卡死了,無法操作。

重復(fù)添加定時器

起因是底層沒有對同名定時器進(jìn)行限制,在某些邏輯中誤使用,出現(xiàn)每秒添加一個定時器,而定時器中的邏輯很大且長時間不退出的,當(dāng)不斷添加重復(fù)定時器就導(dǎo)致游戲運(yùn)行越來越慢

重復(fù)注冊事件

在一些界面的刷新函數(shù)和控制器函數(shù),被頻繁重復(fù)注冊了事件,導(dǎo)致在拋出事件時,同一個函數(shù)被調(diào)用了N次,這個問題在Unity的Profiler中可以清晰看到函數(shù)的調(diào)用次數(shù)

擴(kuò)展

遞歸調(diào)用

遞歸調(diào)用,會報stack overflow,不會讓unity卡死

為什么無限循環(huán)遞歸調(diào)用不會卡死Unity?

這是因?yàn)槊總€方法的方法調(diào)用棧容量是有限的,當(dāng)超出之后就會跳出報stack overflow,不會讓應(yīng)用程序卡死

public static void TesBadCode()
{
	while (true)
	{
		TesBadCode();
	}
}

總結(jié)

到此這篇關(guān)于在Unity中檢測死循環(huán)和卡死的文章就介紹到這了,更多相關(guān)Unity檢測死循環(huán)和卡死內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c# datetime 格式化大全

    c# datetime 格式化大全

    這篇文章主要介紹了c# datetime 格式化大全,有需要的朋友可以參考一下
    2014-01-01
  • 深入理解C♯ 7.0中的Tuple特性

    深入理解C♯ 7.0中的Tuple特性

    這篇文章主要介紹了C#7中Tuple特性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友可以們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-03-03
  • C#中的反射(System.Reflection)

    C#中的反射(System.Reflection)

    這篇文章介紹了C#中的反射(System.Reflection),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 通過VS中的數(shù)據(jù)源選擇對話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]

    通過VS中的數(shù)據(jù)源選擇對話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]

    通過VS中的數(shù)據(jù)源選擇對話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]...
    2007-03-03
  • C#操作xml文件之Linq To Xml詳解

    C#操作xml文件之Linq To Xml詳解

    Linq To Xml,不看其他,單純的看名字都能感覺到,其可以使用靈活且強(qiáng)大的Linq語法,同時也可以使用lambda以及Xpath定位。本文將利用C#實(shí)現(xiàn)操作Linq To Xml,感興趣的可以了解一下
    2022-11-11
  • C#判斷指定驅(qū)動器是否是Fat分區(qū)格式的方法

    C#判斷指定驅(qū)動器是否是Fat分區(qū)格式的方法

    這篇文章主要介紹了C#判斷指定驅(qū)動器是否是Fat分區(qū)格式的方法,涉及C#中DriveFormat屬性的使用技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2015-04-04
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的關(guān)鍵字,用以提高用戶界面響應(yīng)能力和對Web資源的訪問能力,同時它使異步代碼的編寫變得更加容易,下面這篇文章主要給大家介紹了關(guān)于C#中async和await的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C#查看/寫入日志到Windows事件查看器的操作方法

    C#查看/寫入日志到Windows事件查看器的操作方法

    Windows 操作系統(tǒng)將與計(jì)算機(jī)的系統(tǒng)性能、應(yīng)用程序和安全方面相關(guān)的每個事件記錄在 C:\WINDOWS\system32\winevt 的日志中,事件查看器從這些原始事件日志中讀取信息,然后以可讀格式呈現(xiàn)信息,本文介紹了C#如何查看/寫入日志到Windows事件查看器,需要的朋友可以參考下
    2024-09-09
  • C# 遞歸算法詳解

    C# 遞歸算法詳解

    什么是遞歸函數(shù)/方法?任何一個方法既可以調(diào)用其他方法也可以調(diào)用自己,而當(dāng)這個方法調(diào)用自己時,我們就叫它遞歸函數(shù)或遞歸算法,接下來詳細(xì)介紹需要了解的朋友可以參考下
    2021-11-11
  • C#實(shí)現(xiàn)將聊天數(shù)據(jù)發(fā)送加密

    C#實(shí)現(xiàn)將聊天數(shù)據(jù)發(fā)送加密

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)將聊天數(shù)據(jù)發(fā)送加密的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評論

通州市| 广西| 云阳县| 远安县| 齐河县| 平武县| 潜江市| 德庆县| 镇安县| 丹江口市| 鄂尔多斯市| 平昌县| 铁岭市| 南和县| 吴川市| 潮安县| 专栏| 焦作市| 兴文县| 昂仁县| 民勤县| 杨浦区| 孙吴县| 商河县| 盱眙县| 澄迈县| 德化县| 天台县| 栾城县| 连山| 体育| 额济纳旗| 多伦县| 盐源县| 蒙阴县| 宝坻区| 拉萨市| 东宁县| 元阳县| 庄河市| 胶南市|