1

「現在の頂点宣言には、現在の頂点シェーダーに必要なすべての要素が含まれていません。TextureCoordinate0 がありません。」

spriteBatch.End() を呼び出す行で、spriteFont を使用して FPS を画面に描画しようとすると、このエラーが発生します。

私の効果はテクスチャ座標さえ使用しません。しかし、私は問題の根本を見つけましたが、それを修正する方法ではありません. ジオメトリ (LOD アルゴリズム) を構築する別のスレッドがあり、どういうわけかこれが問題の原因のようです。非スレッド化してフレームごとにメッシュを更新すると、エラーは発生しません。また、マルチスレッドを維持しても、画面にテキストを描画しようとしない場合は、正常に動作します。私は両方を行うことはできません。

さらに奇妙なことに、実際にはコンパイルして少しだけ実行します。しかし、常にクラッシュします。メッシュを構築するメソッドに Thread.Sleep を入れて、あまり頻繁に発生しないようにしました。このスレッドをスリープ状態にすればするほど、呼び出される回数が減るほど、クラッシュするまでの平均実行時間が長くなることがわかりました。1000ミリ秒スリープすると、おそらく1分間実行されます。10ms スリープすると、クラッシュする前に 1 フレームも表示されません。これは、画面にテキストを描画しているときに、メッシュ構築スレッドで特定のコード行が実行されていることに関係していると思われます。

テキストを描画するときに何かをロックする必要があるようですが、手がかりがありません。何か案は?

4

1 に答える 1

3

私の情報は、GDC 2008のプレゼンテーション「Understanding XNA Framework Performance 」から得ています。

  • GraphicsDevice はある程度スレッドセーフです
    • 一度に複数のスレッドからレンダリングすることはできません
    • リソースを作成できSetData、別のスレッドがレンダリングされている間
  • ContentManager はスレッドセーフではありません
    • 複数のインスタンスを使用できますが、スレッドごとに 1 つだけです

私の推測では、あなたはこれらの規則のいずれかをどこかで破っていると思います。または、適切なロックなしでレンダリングに使用されているバッファーを変更しています。

于 2012-08-07T05:39:38.093 に答える