Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在全息透镜上使用多线程_C#_Multithreading_Unity3d_Hololens - Fatal编程技术网

C# 如何在全息透镜上使用多线程

C# 如何在全息透镜上使用多线程,c#,multithreading,unity3d,hololens,C#,Multithreading,Unity3d,Hololens,我们试图在全息透镜上使用多线程,但失败了。 因为我们不知道如何以及在附加线程中实现什么 目前,我们的应用程序正在主线程中运行许多操作,如果我们启动“实时流”(使用WebcamTexture),全息图将不再显示 因此,首先我们想问,如何使用线程更有效地运行部分photocapture代码(见下文)?因此,我们可以了解在不同线程中运行哪些部分 我们使用的是Unity 2018.4.10f1 使用UnityEngine; 使用System.Linq; 使用UnityEngine.XR.WSA.WebC

我们试图在全息透镜上使用多线程,但失败了。 因为我们不知道如何以及在附加线程中实现什么

目前,我们的应用程序正在主线程中运行许多操作,如果我们启动“实时流”(使用WebcamTexture),全息图将不再显示

因此,首先我们想问,如何使用线程更有效地运行部分photocapture代码(见下文)?因此,我们可以了解在不同线程中运行哪些部分

我们使用的是Unity 2018.4.10f1

使用UnityEngine;
使用System.Linq;
使用UnityEngine.XR.WSA.WebCam;
公共部分类光电捕获框架:单行为
{
公共PhotoCapture photoCaptureObject=null;
公共游戏对象;
公共静态PhotocaptureFrame实例{get;set;}
私有纹理2d图像纹理;
私人摄像机参数c;
私人分辨率相机分辨率;
私有void Start()
{
cameraResolution=PhotoCapture.SupportedResolutions.OrderByDescending((res)=>res.width*res.height).First();
CreateAsync(false,委托(PhotoCaptureObject)
{
photoCaptureObject=captureObject;
//CameraParameters c=新的CameraParameters();
c、 全息容量=0.0f;
c、 cameraResolutionWidth=cameraResolution.width;
c、 cameraResolutionHeight=cameraResolution.height;
c、 pixelFormat=CapturePixelFormat.BGRA32;
captureObject.StartPhotoModeAsync(c,委托(PhotoCapture.PhotoCaptureResult)
{
TakePhotoAsync(OnCapturedPhotoToMemory);
});
});
实例=此;
}
公共空间MakePhoto()
{
CreateAsync(false,委托(PhotoCaptureObject)
{
photoCaptureObject=captureObject;
captureObject.StartPhotoModeAsync(c,委托(PhotoCapture.PhotoCaptureResult)
{
TakePhotoAsync(OnCapturedPhotoToMemory);
});
});
}
public void OnCapturedPhotoToMemory(PhotoCapture.photocapturesult结果,PhotoCaptureFrame PhotoCaptureFrame)
{
Resolution cameraResolution=PhotoCapture.SupportedResolutions.OrderByDescending((res)=>res.width*res.height)。First();//创建要使用的纹理2D并设置正确的分辨率
Texture2D targetTexture=新的Texture2D(cameraResolution.width、cameraResolution.height);
photoCaptureFrame.UploadImageDataToTexture(targetTexture);//将原始图像数据复制到目标纹理中
imageTexture=targetTexture;//将图像保存到新纹理,以避免图像丢失
quad.GetComponent().material.mainTexture=imageTexture;//根据我们的意愿处理纹理,例如将其应用于材质等。
//photoCaptureObject.StopHotoModeAsync(OnStoppedPhotoModeEnd);
//清理
photoCaptureObject.StopHotoModeAsync(OnStoppedPhotoModeEnd);
}
公共无效OnStoppedPhotoModeEnd(PhotoCapture.PhotoCaptureResult)
{
photoCaptureObject.Dispose();
photoCaptureObject=null;
Log(“照片对象已处理”);
}
}
我们的预期输出是知道哪些块可以在不同的线程中运行,以及如何在Hololens上调用不同的线程

非常感谢您的帮助。

Texture2D targetTexture=新的Texture2D(cameraResolution.width,cameraResolution.height);
        Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);

        ...

        quad.GetComponent<Renderer>().material.mainTexture = imageTexture; 
... quad.GetComponent().material.mainTexture=imageTexture;
只能在Unity中的主线程上创建和指定纹理。正确且唯一的解决方案是调查
WebCamTexture
。您可能遇到了权限问题。

Texture2D targetTexture=new Texture2D(cameraResolution.width,cameraResolution.height);
...
quad.GetComponent().material.mainTexture=imageTexture;

只能在Unity中的主线程上创建和指定纹理。正确且唯一的解决方案是调查
WebCamTexture
。您可能遇到了权限问题。

我建议您异步使用该类进行视频流捕获。在实际示例中,Microsoft中的类使用MediaCapture类访问HoloLens相机的视频流。它在线声明MediaCapture类的一个实例,并在下一段代码中异步从摄像机获取视频帧。

我建议您异步使用该类进行视频流捕获。在实际示例中,Microsoft中的类使用MediaCapture类访问HoloLens相机的视频流。在线上,它声明了MediaCapture类的一个实例,并在下一个代码中从相机异步获取视频帧。

虽然这并不能直接回答您的问题,但我确实可以推荐这个插件:它在内部使用了
MediaCapture
类。 帧是异步获取的,这意味着视频捕获本身基本上在自己的线程中运行。此外,与使用
PhotoCapture
的方法相比,性能更好(可以获得更多帧)。 您将在回调函数中获得每个帧

由于此回调不在Unity主线程上运行,因此需要利用某种作业系统来调用Unity函数。我使用这个方便的脚本:


如果这有帮助,并且您还有其他问题,我可以添加更多关于如何设置的详细信息。

虽然这并不能直接回答您的问题,但我确实可以推荐这个插件:它在内部使用
MediaCapture
类。 帧是异步获取的,这意味着视频捕获本身基本上在自己的线程中运行。此外,与其他方法相比,性能更好(可以获得更多帧)