C# 单博弈子更新方法滞后

C# 单博弈子更新方法滞后,c#,monogame,C#,Monogame,所以我对计算机编程相当陌生,但我知道C#的基础知识 我正在做一个单游戏项目,为我的精灵做一个更新方法。因为我的精灵是基于terraria的(我的意思是每个精灵都是不同的身体部位),所以我列出了一个儿童列表。在该列表中,我放置所有身体精灵,并将该列表附加到父级(玩家的中心精灵) 这是我的基本精灵更新方法:(不仅适用于玩家) 这是另一个类中我的播放器精灵更新方法: public override void Update(GameTime gameTime, Rectangle clientBound

所以我对计算机编程相当陌生,但我知道C#的基础知识

我正在做一个单游戏项目,为我的精灵做一个更新方法。因为我的精灵是基于terraria的(我的意思是每个精灵都是不同的身体部位),所以我列出了一个儿童列表。在该列表中,我放置所有身体精灵,并将该列表附加到父级(玩家的中心精灵)

这是我的基本精灵更新方法:(不仅适用于玩家)

这是另一个类中我的播放器精灵更新方法:

public override void Update(GameTime gameTime, Rectangle clientBounds)
{
    position += direction;

    // If sprite moves off screen
    if (position.X < 0)
    {
        position.X = 0;
    }

    if (position.Y < 0)
    {
        position.Y = 0;
    }

    if (position.X > clientBounds.Width - frameSize.X)
    {
        position.X = clientBounds.Width - frameSize.X;
    }

    if (position.Y > clientBounds.Height - frameSize.Y)
    {
        position.Y = clientBounds.Height - frameSize.Y;
    } 

    // Continue base update method 
    base.Update(gameTime, clientBounds);
}
但更新方法滞后:

public override void Update(GameTime gameTime)
{
    player.children.Add(playerDeux);
    float millisecondsRunning = 30;
    float millisecondsWalking = millisecondsRunning  * 2f;

    if (player.running == true)
    {
        player.millisecondsPerFrame = millisecondsRunning;
    }

    else if (player.running == false)
    {
        player.millisecondsPerFrame = 65;
        playerDeux.millisecondsPerFrame = 30;
    }

    if (player.walking == false)
    {
        player.textureImage = Game.Content.Load<Texture2D>(@"Images/" + s1[1]);
    }

    player.Update(gameTime, Game.Window.ClientBounds);
    player.children.ForEach(c => c.Update(gameTime, Game.Window.ClientBounds));
    base.Update(gameTime);
}
公共覆盖无效更新(游戏时间游戏时间)
{
player.children.Add(playerDeux);
浮点毫秒运行=30;
浮动毫秒Swalking=毫秒运行*2f;
如果(player.running==true)
{
player.millissecondsperframe=毫秒运行;
}
else if(player.running==false)
{
player.millissecondsperframe=65;
playerDeux.毫秒帧=30;
}
if(player.walking==false)
{
player.textureImage=Game.Content.Load(@“Images/”+s1[1]);
}
更新(游戏时间,游戏窗口,客户端边界);
player.children.ForEach(c=>c.Update(gameTime,Game.Window.ClientBounds));
更新(游戏时间);
}
因此,当我在所有子对象上调用draw方法时,它工作得很好,但是当我在子对象上调用Update方法时,它会非常滞后,程序甚至停止工作

有更好的方法吗

编辑:还要注意,这个类还没有完成,它只是一个测试,我画了两个精灵并更新(动画播放)它们。
+player.textureImage=Game.Content.Load(@“Images/”+s1[1])中的s1[1];只是数组中的一个字符串名。

您的代码有一些奇怪之处,但我认为罪魁祸首是
播放器.children.Add(playerDeux)
。现在的方式是,每次更新都要将
playerDeux
添加到子列表中,然后每次运行
update
时更新
playerDeux
一次。看起来您想将这行代码移动到
初始化
加载内容
方法


此外,您可能应该在
LoadContent
方法中只加载纹理一次,并且在
Update
方法中只引用内存中的纹理。这并不是游戏如此滞后的主要原因,但这是不必要的开销。

在游戏开始时,滞后是明显的,但你可以看到一些运动(很少运动),并且增长非常快。游戏大约5秒后就停止了。我不知道如何发布答案,但那
Load()
调用看起来非常可疑。我希望它不是从磁盘上为每一帧的每一个对象重新加载纹理load@Jelle我认为你说的不对。
Load
方法实际上每次都从磁盘加载纹理-因此,您通常应该在
LoadContent
方法中加载纹理。是的,但我的意思是我的方法是错误的。当我写那堂课的时候,我没有想到。谢谢!不久前我犯了一个错误,无法在Loadcontent中使用该行,所以我暂时将其放在Update方法中,但忘记将其放回Loadcontent()方法中。
public override void Draw(GameTime gameTime)
{
    spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise);
    player.Draw(gameTime, spriteBatch);
    player.children.ForEach(c => c.Draw(gameTime, spriteBatch));
    spriteBatch.End();

    base.Draw(gameTime);
}
public override void Update(GameTime gameTime)
{
    player.children.Add(playerDeux);
    float millisecondsRunning = 30;
    float millisecondsWalking = millisecondsRunning  * 2f;

    if (player.running == true)
    {
        player.millisecondsPerFrame = millisecondsRunning;
    }

    else if (player.running == false)
    {
        player.millisecondsPerFrame = 65;
        playerDeux.millisecondsPerFrame = 30;
    }

    if (player.walking == false)
    {
        player.textureImage = Game.Content.Load<Texture2D>(@"Images/" + s1[1]);
    }

    player.Update(gameTime, Game.Window.ClientBounds);
    player.children.ForEach(c => c.Update(gameTime, Game.Window.ClientBounds));
    base.Update(gameTime);
}