我在Unity3D中爲iOS和Android構建面部檢測應用程序。該應用程序應該檢測每秒10張臉。但是,每個人臉檢測需要大約50ms,所以我決定讓人臉檢測在另一個線程的後臺運行,以防止出現小的滯後尖峯(應用程序需要每幀更新視覺材料,50ms停止使它laggy)。線程化導致應用程序在iOS上滯後,但不在Android上
問題是線程導致應用程序在iOS上滯後。沒有線程,它用於檢測每秒10個面,現在有2個線程。它在Android上工作正常。
有什麼不可思議的是是該應用程序在iOS上運行良好的前5秒。不管它是否檢測到臉部,5秒後都會出現嚴重滯後。編輯:如果我暫停應用程序,然後恢復它滯後5秒鐘消失像在開始。這是什麼!?
下面是一個協同處理臉部檢測的例子,它每秒運行10次。如果面部檢測線程在100毫秒內未完成,則會阻止另一個線程啓動。
IEnumerator FaceDetection()
{
while (true)
{
if (faceDetectionThreadDone)
{
rgbaMat = webCamTextureToMatHelper.GetMat();
if (rgbaMat != null)
{
OpenCVForUnityUtils.SetImage(faceLandmarkDetector, rgbaMat);
faceDetectionThreadDone = false;
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
// heavy computing stuff (50 ms)
List<UnityEngine.Rect> detectResult = faceLandmarkDetector.Detect();
if (detectResult.Count > 0)
{
points = faceLandmarkDetector.DetectLandmark(detectResult[0]);
}
faceDetectionThreadDone = true;
}).Start();
}
}
yield return new WaitForSeconds(0.1f);
}
}
是否有一些嚴重的問題,我如何創建新的線程?我讀過一些地方,他們完成執行後會被垃圾收集器清理乾淨。可能會造成滯後?編譯設置設置爲高性能等。
編輯:好吧,我很確定現在問題是不涉及內存管理。我已經在Xcode中運行了內部剖析器,並觀察了堆的使用情況。演出]沒有得到受影響時,垃圾收集踢
,我測試的應用程序上的設備:iPhone 6,索尼Z3,三星S4
有你檢查了iOS和Android的構建設置。我認爲可以啓用多線程功能。 – MyIsaak
是的,我已經看過,並嘗試各種構建設置。雖然沒有找到任何特定的多線程。 – Johan
你檢查我的答案了嗎? – Programmer