在游戏循环中使用结构与参考变量

时间:2018-05-19 04:19:26

标签: c# loops variables struct game-development

我正在用Mono游戏弄湿我的脚。主要是因为我觉得它是一种更有趣的方法来提高我的编码技巧。

我的问题是,我最好在游戏循环的更新方法中使用引用变量,还是使用轻量级结构?(仅用2个整数初始化)

var GameObject GObject = new GameObject(); 
int Move=1;
void update  
{
    if(key.left)
   GObject.Location.x -= Move;
}

或代替做

 void update  
{
    if(key.left)
   GObject.Location = new Vector2(updatedX,Y);
}

由于Vector2s是结构体,我不能更改对象向量内的x值,除非我创建一个新值。我读了微软关于什么时候首选结构的例子,但我不确定它是否适用相同的方式。

我想有单声道的工具可以为我做这件事,但我仍然想知道是否有多次迭代会改变一些事情。

最后,我知道我可以在Game类中声明Vector,但我试图让Game对象管理自己的位置。

1 个答案:

答案 0 :(得分:3)

上述评论摘要。

<强> TL; DR:对于游戏等高性能应用,您应该尽可能使用struct,特别是对于短暂的情况,如循环播放。

所有XNA论坛都逐字讨论过这个问题;指南和文章以及共识是,您应尽可能使用struct,以避免来自GC的致命暂停,这可能会伤害游戏。此外,您通常应该避免 foreach,因为它会创建另一个因拳击而影响GC的对象我相信。对于为XBox 360或.NET 4之前的c#游戏编写的c#游戏,当天的问题特别严重。

顺便说一句,Monogame是XNA的一个分支,并且遇到同样的问题

在典型的桌面/ Web开发中,请继续使用引用类型,因为GC更高效,并且在GC正在进行时不会暂停整个应用程序。

  • Windows桌面上的.NET 4+具有后台GC
  • Windows Server上的.NET 4.5+具有后台GC

告诉我更多