我在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