Как использовать многопоточность на Hololens - PullRequest
0 голосов
/ 05 ноября 2019

Мы пытаемся использовать многопоточность на Hololens, но безуспешно. Поскольку мы не знаем, как и что реализовать в дополнительных потоках.

В настоящее время наше приложение выполняет множество операций в основном потоке, что, если мы запустим наш «живой поток» (работающий с WebcamTexture),Голограммы больше не появляются.

Итак, для начала мы хотим спросить, как мы можем использовать потоки для более эффективного выполнения частей нашего кода фотозахвата (см. Ниже)? Таким образом, мы можем понять, какие части следует запускать в разных потоках.

Мы используем Unity 2018.4.10f1

using UnityEngine;
using System.Linq;
using UnityEngine.XR.WSA.WebCam;

public partial class PhotocaptureFrame : MonoBehaviour
{

    public PhotoCapture photoCaptureObject = null;
    public GameObject quad;

    public static PhotocaptureFrame Instance { get; set; }

    private Texture2D imageTexture;
    private CameraParameters c;
    private Resolution cameraResolution;

    private void Start()
    {
        cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();

        PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)
        {
            photoCaptureObject = captureObject;

            //CameraParameters c = new CameraParameters();
            c.hologramOpacity = 0.0f;
            c.cameraResolutionWidth = cameraResolution.width;
            c.cameraResolutionHeight = cameraResolution.height;
            c.pixelFormat = CapturePixelFormat.BGRA32;

            captureObject.StartPhotoModeAsync(c, delegate (PhotoCapture.PhotoCaptureResult result)
            {
                photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
            });

        });

        Instance = this;
    }

    public void MakePhoto()
    {
        PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)
{
    photoCaptureObject = captureObject;

    captureObject.StartPhotoModeAsync(c, delegate (PhotoCapture.PhotoCaptureResult result)
    {
        photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
    });

});

    }

    public void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
    {

        Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First(); // Create our Texture2D for use and set the correct resolution
        Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);

        photoCaptureFrame.UploadImageDataToTexture(targetTexture);  // Copy the raw image data into our target texture

        imageTexture = targetTexture;       //Save image to new Texture to not loose it

        quad.GetComponent<Renderer>().material.mainTexture = imageTexture;     // Do as we wish with the texture such as apply it to a material, etc.
                                                                               //photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoModeEnd);


        // Clean up
        photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoModeEnd);
    }

    public void OnStoppedPhotoModeEnd(PhotoCapture.PhotoCaptureResult result)
    {
        photoCaptureObject.Dispose();
        photoCaptureObject = null;
        Debug.Log("Photo object disposed.");

    }
}

Мы ожидаем, что выходные данные будут знать, какие чанки мы можем запустить в разных потоках икак называть разные темы на Hololens.

Спасибо большое и всякая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

При использовании WebcamTexture в HoloLens отсутствует конфигурируемость, и FPS будет очень низким.

Я рекомендую использовать класс MediaCapture для захвата видеопотока асинхронно. В данном примере класс HololensCamera в Microsoft SpectatorView использует класс MediaCapture для доступа к видеопотоку с камеры HoloLens.

Кроме того, в качестве другого примера, репозиторий HoloLensCameraStream также является оболочкой для методов MediaCapture и предоставляет образец , чтобы продемонстрировать, как получить видеокадры. со скоростью 30 кадров в секунду и отображает их на текстуре Unity. В строке 129 класса VideoCapture в этом хранилище он объявляет экземпляр класса MediaCapture и асинхронно получает видеокадр с камеры в следующем коде.

0 голосов
/ 07 ноября 2019
        Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);

        ...

        quad.GetComponent<Renderer>().material.mainTexture = imageTexture; 

Вы можете создавать и назначать текстуры только для основного потока в Unity. Правильное и единственное решение - исследовать WebCamTexture. Возможно, вы столкнулись с проблемой разрешений.

...