D3DImage мерцание при изменении размера - PullRequest
1 голос
/ 31 января 2020

У меня проблема с D3DImage при изменении размера.

Сначала у меня было мерцание, когда у меня тоже было большое количество кадров в секунду, но я мог решить его, установив только задний буфер при создании новая текстура для рендеринга (что мне нужно при изменении размера)

Проблема возникает, когда я устанавливаю задний буфер сразу после InvalidateD3DImage, что, конечно, происходит при изменении размера из-за большого количества кадров, отправляемых за короткое время.

Может использовать метод SetRenderTarget, который устанавливает буфер:

public void SetRenderTargetDx11(Texture2D target)
        {
            if (this.mRenderTarget != null)
            {
                DisposeHelper.TryDispose(ref this.mRenderTarget);
                base.Lock();
                base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero);
                base.Unlock();
            }

            if (target == null)
                return;

            if (!IsShareable(target))
                throw new ArgumentException("Texture must be created with ResourceOptionFlags.Shared");

            var format = TranslateFormat(target);
            if (format == Format.Unknown)
                throw new ArgumentException("Texture format is not compatible with OpenSharedResource");

            var handle = GetSharedHandle(target);
            if (handle == IntPtr.Zero)
                throw new ArgumentNullException("Handle");

            try
            {
                this.mRenderTarget = new Texture(mDevice, target.Description.Width, target.Description.Height, 1, Usage.RenderTarget, format, Pool.Default, ref handle);
                using (Surface surface = this.mRenderTarget.GetSurfaceLevel(0))
                {
                    base.Lock();
                    // "enableSoftwareFallback = true" makes Remote Desktop possible.
                    // See: http://msdn.microsoft.com/en-us/library/hh140978%28v=vs.110%29.aspx
                    base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.NativePointer, true);
                    base.Unlock();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

Мой метод Invalidate image для рисования буфера в D3DImage.

public void InvalidateD3DImage()
    {
            if (this.mRenderTarget != null)
            {
                base.Lock();
                base.AddDirtyRect(new Int32Rect(0, 0, base.PixelWidth, base.PixelHeight));
                base.Unlock();
            }
        }

Есть ли способ избежать этого мерцания ? Это никак не влияет на функциональность, но все равно не очень приятно видеть.

...