2017-04-27 37 views
1

我目前正试图通过使用来自相机的数据作为环境地图和采样灯来实现环境照明。是OnTangoImageAvailableEventHandler()多线程?

我所做的是

private int noOfSamples = 64; 
private int noOfLights = 0; 

public void OnTangoImageAvailableEventHandler(TangoEnums.TangoCameraId cameraId, TangoUnityImageData imageBuffer) 
{ 
    createSamples(imageBuffer); 
} 

然后在createSamples():

public void createSamples(TangoUnityImageData imageBuffer) 
{ 
    if (m_enableEnvironmentalLighting && noOfLights < noOfSamples) 
    { 
      ----- generate samples ------- 
      for (int i = 0; i < noOfSamples; i++) 
      { 
       ---- create light game object, set the position and rgb of the light. 
      noOfLights++; 
      } 
    } 
} 

这工作正常,在Unity编辑器,它只是创造了第一个64个灯,反射和阴影作品精细。但是,当它位于Tango设备上时,除非我删除noOfLights检查noOfSamples,否则不会创建光源。

删除检查noOfLights < noOfSamples后,在每一帧中都需要再次计算样本,导致性能很差。是否因为OnTangoImageAvailableEventHandler方法是多线程的?有没有办法只创建前64个灯?

谢谢!

回答

0

创建imageBuffer var来保存缓冲区。在onTango中...只需将缓冲区复制到该目录即可。然后创建一个方法只在需要信息时询问存储的缓冲区。

当你抓取信息时,在本地复制缓冲区并使用它。因为探戈回调在另一个线程上,并且可能会在长时间运行时导致分段错误(如您的样本测试)

+0

谢谢您的回答!出于好奇,而不是使用图像缓冲区,会不会实施ITangoVideoOverlayMultithreaded解决这个问题? – dddddddaxing