Unity渲染线程:纹理读/写时D3D11损坏

时间:2017-01-23 11:10:49

标签: c# multithreading unity3d direct3d

我正在使用双缓冲策略在场景中的四边形上显示视频纹理。 我有一个插件,在渲染器使用Texture2时将数据写入Texture1。 复制完成后,我使用Unity SetTexture()来交换纹理,即在复制到Texture2时渲染texture1。

但是,我有时会得到这个错误:

D3D11 CORRUPTION:ID3D11DeviceContext :: UpdateSubresource:发现两个线程同时执行与同一Device [Context]相关联的函数。这将导致内存损坏。需要在Direct3D API外部(或通过ID3D10Multithread接口)进行适当的线程同步。 4668和1584是牵连的线程ID。 [其他腐败#28:CORRUPTED_MULTITHREADING]

private IEnumerator GetFrameData()
{
      while (this.enabled)
      {
            yield return new WaitForSecondsRealtime(0.005f);
            if (this.playbackEngine != null)
            {               
                 CopyFrameData(ref this.mediaUpdateSampleArgs);  //Calls the native UpdateSubResource() function.             
            }

             while (cameraRenderingState.IsRenderingScene()) // True when OnPreRender() is called until OnPostRender() occurs.
                   yield return new WaitForEndOfFrame();

             renderer.material.SetTexture("_MainTex", switchTextureID == 1 ? this.syncTexture: this.syncTexture2);
      }                     
}

这是我现在正在做的简化代码,在播放器脚本的 Start()上调用协同程序。目标是异步写入一个纹理,因为它在60FPS应用程序中持续多个帧,而渲染使用另一个纹理(副本不在一个帧中完成,因此我不使用 GLIssuePluginEvent ()用于在渲染上同步副本的功能,该副本不需要双缓冲。如果一个视频样本已经准备好被复制,我会检查协程,并且在这种情况下我会开始复制。

我希望在不同时读取的纹理上完成复制...为此,我只在 WaitForEndOfFrame()之后启动另一个副本并将纹理交换到当 SetTexture()在渲染方尚未生效时,请确保它不会开始复制。 在我理解统一管道时,它意味着渲染完成,这样我就可以交换纹理并开始复制到另一个纹理。 一旦有时腐败错误发生,我可能会错过一些理解。

感谢您在双缓冲器工作方面提供的帮助以及使用统一管道精心设计的产品!

0 个答案:

没有答案