1

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

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

我的效果甚至不使用纹理坐标。但是我找到了问题的根源,只是没有找到解决方法。我有一个单独的线程来构建几何(一个 LOD 算法),不知何故这似乎就是我遇到问题的原因。如果我使它成为非线程化的并且只是每帧更新我的网格,我不会收到错误消息。而且,如果我保持多线程但不尝试在屏幕上绘制文本,它工作正常。我不能两者都做。

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

似乎我在绘制文本时必须锁定某些东西,但我不知道。有任何想法吗?

4

1 回答 1

3

我的信息来自GDC 2008的演示文稿“了解 XNA 框架性能”。它说:

  • GraphicsDevice 在某种程度上是线程安全的
    • 一次不能从多个线程渲染
    • 可以创建资源,SetData而另一个线程呈现
  • ContentManager 不是线程安全的
    • 可以有多个实例,但每个线程只有一个

我的猜测是你在某处违反了这些规则之一。或者您正在修改一个缓冲区,该缓冲区用于在没有适当锁定的情况下进行渲染。

于 2012-08-07T05:39:38.093 回答