Multithreading &引用;当前顶点声明不包括所需的所有元素;

Multithreading &引用;当前顶点声明不包括所需的所有元素;,multithreading,xna,Multithreading,Xna,“当前顶点声明不包括当前顶点着色器所需的所有元素。缺少TextureCoordination 0。” 当我尝试使用spriteFont在屏幕上绘制FPS时,在我调用spriteBatch.End()的行上,出现了这个错误 我的效果甚至不使用纹理坐标。 但我已经找到了问题的根源,而不是如何解决它。 我有一个单独的线程来构建几何体(LOD算法),这似乎就是我遇到问题的原因。 如果我将其设置为非线程化,并且只更新每帧的网格,则不会出现错误。 而且,如果我保持多线程,但不尝试在屏幕上绘制文本,它也可以正

“当前顶点声明不包括当前顶点着色器所需的所有元素。缺少TextureCoordination 0。”

当我尝试使用spriteFont在屏幕上绘制FPS时,在我调用spriteBatch.End()的行上,出现了这个错误

我的效果甚至不使用纹理坐标。 但我已经找到了问题的根源,而不是如何解决它。 我有一个单独的线程来构建几何体(LOD算法),这似乎就是我遇到问题的原因。 如果我将其设置为非线程化,并且只更新每帧的网格,则不会出现错误。 而且,如果我保持多线程,但不尝试在屏幕上绘制文本,它也可以正常工作。 我不能两者兼得

更奇怪的是,它实际上编译并运行了一段时间。但总是崩溃。 我在构建网格的方法中加入了一个Thread.Sleep,这样它发生的次数就更少了,我发现我让这个线程睡眠的次数越多,调用的次数越少,它在崩溃之前平均运行的时间就越长。 如果它睡1000毫秒,它可能会跑一分钟。如果它休眠10毫秒,在崩溃前甚至不会显示一帧。这让我相信这与在屏幕上绘制文本的同时在网格构建线程上执行的某行代码有关

似乎在绘制文本时我必须锁定某些内容,但我没有任何线索。
有什么想法吗?

我的信息来自GDC 2008的“演示文稿”。它说:

  • GraphicsDevice在某种程度上是线程安全的
    • 一次不能从多个线程渲染
    • 可以在另一个线程呈现时创建资源和
      SetData
  • ContentManager不是线程安全的
    • 可以有多个实例,但每个线程只有一个
我猜你在什么地方违反了这些规则之一。或者您正在修改用于渲染的缓冲区,而不使用适当的锁定