Xna SpriteBatch未绘制到屏幕

Xna SpriteBatch未绘制到屏幕,xna,spritebatch,Xna,Spritebatch,当游戏复位时,我试图在屏幕上画一个快速加载的精灵,但是spritebatch没有画。我在game.spritebatch.begin()上设置了一个断点;当我走过的时候,什么都没有画出来。有什么想法吗 这是我的重置功能 public void Reset() { loadingScreen = game.Content.Load<Texture2D>("Textures\\loadingScreen"); game.spriteBatch.Begin(); g

当游戏复位时,我试图在屏幕上画一个快速加载的精灵,但是spritebatch没有画。我在game.spritebatch.begin()上设置了一个断点;当我走过的时候,什么都没有画出来。有什么想法吗

这是我的重置功能

public void Reset()
{
    loadingScreen = game.Content.Load<Texture2D>("Textures\\loadingScreen");
    game.spriteBatch.Begin();
    game.spriteBatch.Draw(loadingScreen, Vector2.Zero, null, Color.Black, 0.0f, Vector2.Zero, 0.5f, SpriteEffects.None, 0f);
    game.spriteBatch.End();
    cameraPosition = original_cameraPosition;
    players.Clear();
    furthest = 0;
    enemies.Clear();
    LoadEnemies();
    ActivatePlayers();
}
public void Reset()
{
loadingScreen=game.Content.Load(“纹理\\loadingScreen”);
game.spriteBatch.Begin();
game.spriteBatch.Draw(加载屏幕,矢量2.0,空,颜色。黑色,0.0f,矢量2.0,0.5f,SpriteEffects.None,0f);
game.spriteBatch.End();
cameraPosition=原始的\u cameraPosition;
玩家。清除();
最远=0;
敌人。清除();
加载敌人();
激活层();
}

您可能没有在正确的位置轮询它。纹理重置(
loadingScreen=game.Content.Load(“纹理\\loadingScreen”
)只能执行一次,否则会造成大量资源浪费

另一方面,渲染代码:

    game.spriteBatch.Begin();
    game.spriteBatch.Draw(loadingScreen, Vector2.Zero, null, Color.Black, 0.0f, Vector2.Zero, 0.5f, SpriteEffects.None, 0f);
    game.spriteBatch.End();

这需要不断轮询,否则它将只渲染几毫秒,之后您将无法看到它。将渲染代码放入渲染方法中,它应该可以正常工作。

您是否尝试过使用
颜色。白色

在默认配置中,XNA使用双缓冲mmand正在发生-但结果正在被绘制到backbuffer。您需要将其与frontbuffer交换,以便结果显示在屏幕上

通常这是为您完成的。游戏将在循环中调用
Update
BeginDraw
Draw
EndDraw
(这些是
game
中的方法,您可以在自己的游戏类中重写)。默认的
EndDraw
实现将调用
GraphicsDevice.Present
,这将交换缓冲区

我得到的印象是,作为一个加载屏幕,您正在主游戏循环之外的某个地方绘制此屏幕。您可以调用
GraphicsDevice.Present
来翻转缓冲区

其他一些提示:

  • 通过覆盖
    BeginDraw
    并返回false.或调用
    superssdraw
    (或者通过覆盖
    EndDraw
    而不调用
    base
    方法来防止交换),可以从本质上实现相反的效果,并防止XNA自动绘制

  • 默认情况下,
    SpriteBatch
    将缓冲所有绘图,直到调用
    End
    为止。在调用之后放入您的
    Present
    调用


实际上是对
内容的后续调用。Load
将返回在原始调用中加载的同一实例。因此,它实际上并没有那么糟糕。即使是这样,它的做法也很糟糕。在其他语言中做类似的事情肯定会消耗资源,因此最好不要这样做,因为肯定没有必要。这就是当然是这样。虽然在这种特殊情况下,它只是一个加载屏幕(并且知道XNA的内容管理器进行缓存)-我会让它通过,因为这样可以避免在其他地方跟踪纹理。@AndrewRussell谢谢,我以后会记住这一点。这只是一个旁注,说明此人可能面临的问题,他可以使用我们的任一解决方案来解决:)在加载完成之前,不会调用其他绘图。这就是我这次只调用它的原因。您是否注意到,在开始调用
Reset()
时,加载纹理只会显示在一帧中?Niko是对的-加载时间是否足够长,加载屏幕是否会显示足够长的时间,以便您能够真正看到它?在它被游戏循环中的绘图所取代之前?如果在
Update
方法中调用
supersDraw
,可以防止游戏循环本身绘制任何东西,这将允许您诊断是否发生了这种情况。添加game.GraphicsDevice.Present()后,它会绘制一个紫色屏幕,并且持续时间足以显示屏幕一秒钟。另外,如果我在添加present之前在spritebatch.End()后面加了一个断点,它不会显示任何内容(意味着它不是绘图)。现在它显示紫色。是的,它没有什么区别。这可以让一些东西在屏幕上画出来,但它不能画出我的纹理。它只显示一个紫色屏幕。@jmack20093紫色屏幕是“新分配的缓冲区”颜色(表示没有绘制任何内容)。我不太清楚你为什么会这样。渲染目标有时会绊倒人-但你没有使用它们,对吗?也许你的雪碧有问题?(我想它可能是完全透明的。)您可以尝试
GraphicsDevice.Clear
来尝试识别绘图是否在您预期的时间内实际发生<代码>清除后接
显示
可以让您更改屏幕颜色-这是诊断问题的良好起点。使用清除确实可以更改颜色。是不是在幕后调用了可能导致问题的东西?游戏是3D的,所以我经常在2D和3D绘图之间切换,但是在
Draw()
中使用与
Reset()
@jmack20093
SpriteBatch
相同的方法,UI绘图很好,这可能会导致3D绘图出现问题。但不是相反。默认的
SpriteBatch.Begin
应重置2D所需的设置。我已经做了一些测试,您发布的代码在
End
之后使用
Present
应该可以工作。所以这里发生了一些其他的事情。你能用一个新的XNA项目重现这个问题吗?