我正在尝试使用一台计算机上的XNA游戏(4.0,Visual Studio 2015,.NET 4.0 Framework)在我的笔记本电脑上工作,但某些部分的性能下降到2,然后又回到60在其他人(我的意思是在我列举的某些不同的GameStates)。为了清楚起见,我编写的计算机完美运行并保持恒定的60 fps,而另一台计算机则非常滞后。
内存/ CPU的使用率不到它们两者的25%,所以我不认为它与代码有关,不过这里是在只运行空白屏幕的Update方法部分调用的内容: / p>
private void switchGameMode()
{
switch (state)
{
case GameState.preTitleScreen:
if (playing != paganBackground)
{
MediaPlayer.Stop();
playing = paganBackground;
}
MediaPlayer.Stop();
surprisePreTitleScreen();
break;
其余的是switch语句的结尾。方法是:
private void surprisePreTitleScreen()
{
if ((oldpad1.Buttons.Start == ButtonState.Released && pad1.Buttons.Start == ButtonState.Pressed) || (oldkeys.IsKeyUp(Keys.Enter) && keys.IsKeyDown(Keys.Enter)))
{
jeopardyTitle.Play();
state = GameState.titleScreen;
}
}
以下是绘制方法中绘制的内容:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Wheat);
spriteBatch.Begin();
switch(state)
{
case GameState.preTitleScreen:
break;
完成方法并切换语句后当然。
有没有人对错误提出建议?
答案 0 :(得分:1)
由于没有提供足够的代码,我必须假设有问题
据我所知,切换状态不应该太慢你的游戏。可能的问题是您在没有实时考虑的情况下更新每个“更新”。我的意思是:
假设你有一名球员。在更新方法中,您在右侧更新他的poition(Vector2)1。所以,它看起来像这样:
protected override void Update (GameTime gameTime) { palyer1.Position.X += 1; }
现在,这意味着每次处理器更新游戏时,它都会在玩家位置的X上加1。那么,如果你的处理器速度慢,该怎么办?公式中的1将是5,这将在您的PC上看起来很好。但是,你将游戏带到另一台PC,它移动得太快,因为另一台PC拥有更强大的处理器,它可以更频繁地更新你的游戏。此外,如果后台处理经常开始和结束,fps将下降或增加。 这是我认为有问题的。
这个问题的解决方案很简单。你打电话告诉你上次更新过去了多少实时。您的代码现在看起来像这样,并且您的播放器将在每台PC上向右移动相同的数量。
protected override void Update (GameTime gameTime) { elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds; palyer1.Position.X += elapsedTime * ASD; }
其中 ASD 表示每秒移动的像素数
这样,每个处理器都会将经过的时间与您想要创建的移动量相乘,并在每个处理器上创建所需的确切数量。
至于声音,它在慢速计算机上几乎总是滞后。