OnTangoImageAvailableEventHandler()多线程?

时间:2017-04-27 08:33:16

标签: android multithreading unity3d unity5 google-project-tango

我目前正试图通过使用相机中的数据作为环境地图和采样灯来实现环境照明。

我做的是

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&lt; noOfSamples。

删除检查noOfLights&lt; noOfSamples,在每个帧中需要再次计算样本,导致性能非常差。是因为OnTangoImageAvailableEventHandler方法是多线程的吗?有没有办法只创建前64个灯?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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