Kinect v2 BodyFrameReader.FrameArrived事件突发停止触发:是否存在IDisposable泄漏?
Kinect v2 BodyFrameReader.FrameArrived 事件突然停止触发的排查求助
问题现象:基于C# + Kinect v2 API开发的应用中,极少出现
BodyFrameReader.FrameArrived事件突然停止触发的情况,导致订阅该事件的函数无法执行,对应用运行造成严重影响。该Bug仅在3-4人面对传感器时才可能出现,目前无法明确此场景与Bug的关联,且难以独自复现。已锁定两种可能性:一是事件在源端停止触发,二是订阅的方法被意外取消订阅(后者可能性极低)。排查情况:参考微软开发者视频,此类问题通常由FrameReference泄漏(未调用
Dispose())导致,目前代码中已手动调用frame.Dispose(),且确认注释间的应用专属函数(gatherBodies()、sortBodies()、affectBodiesToPlayers())未抛出异常,不会阻碍frame.Dispose()执行,暂未发现泄漏点。求助需求:计划改用
using关键字管理frame资源,但因无法复现问题,希望确认此举能否真正解决事件停止触发的问题;同时希望获得进一步的排查方向建议。
当前处理帧的代码如下:
private static void onBodyFrameArrived(object sender, BodyFrameArrivedEventArgs e) { var frame = e.FrameReference.AcquireFrame(); if (frame != null) { var floorClipPlane = frame.FloorClipPlane; m_captorAngle = System.Math.Atan(floorClipPlane.Z / floorClipPlane.Y); m_captorHeight = floorClipPlane.W; if (m_bodies == null) m_bodies = new Body[m_kinectSensor.BodyFrameSource.BodyCount]; //BELOW SOME APPLICATION SPECIFIC FUNCTIONS gatherBodies(); sortBodies(); affectBodiesToPlayers(); //----------------------------------------- frame.GetAndRefreshBodyData(m_bodies); frame.Dispose(); frame = null; } }
内容的提问来源于stack exchange,提问作者Anselme
相关产品推荐
相关产品推荐

