Как получить серию изображений из потока пользовательского интерфейса в поток отрисовки в Silverlight 5 с помощью XNA - PullRequest
1 голос
/ 09 октября 2011

в Silverlight Я пытаюсь текстурировать кадры потока веб-камеры (в режиме реального времени) на серии 3D-четырехугольников. Я использую VideoSink в классе контроллера веб-камеры в классе контроллера веб-камеры. Затем я рисую квадраты в DrawingSurface. Но я продолжаю работать в CrossAppDomainMarshaledException. В качестве решения я пытаюсь использовать Dispatcher.BeginInvoke, но иногда код в BeginInvoke, кажется, перепрыгивает или выходит из потока. Как можно подходить к таким вещам?

    //Video sink capture
    // Is called every time the webcam provides a complete frame (Push)   
    protected override void OnSample(long sampleTime, long frameDuration, byte[] sampleData)
    {
        System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            WriteableBitmap bmp = new WriteableBitmap(vidFormat.PixelWidth, vidFormat.PixelHeight);
            RaiseFrameCapture(new FrameCapturedEventArgs { Frame = bmp.FromByteArray(sampleData) });
        });
    }

    //Capture from sink into WebCamController
    void sink_FrameCaptured(object sender, FrameCapturedEventArgs e)
    {

        //List<WriteableBitmap>
        _WebCamSource.AddImage(e.Frame.Clone());

    }


    //XNA draw event handler
    private void DrawingSurface_Draw(object sender, DrawEventArgs e)
    {
        List<WriteableBitmap> frames = new List<WriteableBitmap>();

        if (webCamSource.Frames.Count > 0)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                frames = new List<WriteableBitmap>(webCamSource.Frames.ToArray());

            });
        }

        Draw(frames);

        e.InvalidateSurface();
    }

1 Ответ

0 голосов
/ 24 октября 2011

Даже если вы решили свою проблему, возможно, я смогу дать некоторое представление.XNA сильно отличается от классического рендеринга Silverlight.

В классическом конвейере рендеринга Silverlight вы декларативно создаете визуальное дерево и вносите в него изменения.Цикл рендеринга исчезает из поля зрения, и вам редко приходится с ним связываться.

Поэтому вы хотите как можно быстрее перенести свои изменения в визуальное дерево.Если вы обновите визуальное дерево в другом потоке, а не в потоке пользовательского интерфейса (который работает), обновление может произойти во время рендеринга, что будет катастрофическим.Поэтому поток пользовательского интерфейса предоставляет насос сообщений, который можно использовать через Dispatcher.BeginInvoke, для обеспечения безопасности потока.

С XNA у вас ничего этого нет ... Поскольку вы реализуете свой собственный конвейер рендеринга и имеетеполный контроль над ним.

Каждый раз, когда вы обрабатываете кадр веб-камеры, устанавливайте его в контроллере веб-камеры (используя блокировку).В каждом кадре XNA, если контроллер веб-камеры получил новый кадр, получите кадр веб-камеры (используя блокировку) и обновите текстуру XNA (не создавайте новую текстуру для каждого кадра, это НЕ эффективно).Затем визуализируйте ваш 3D-объект, используя эту текстуру.

...