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



我正在被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);
}

由于 Vector2 是结构体,除非我创建一个新值,否则我无法更改对象向量内的 x 值。我阅读了Microsoft关于何时首选结构的示例,但我不确定它是否以相同的方式应用。

我想单声道中的一些工具可以为我做到这一点,但我仍然想知道每秒进行多次迭代是否会改变事情。

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


上述评论的摘要。


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

告诉我更多

  • 肖恩·哈格里夫斯博客 通往垃圾收集器涅槃的双路

  • Foreach、垃圾和 CLR 探查器

相关内容

  • 没有找到相关文章

最新更新