c# - 在游戏循环中使用结构体与引用变量

标签 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);
}

由于 Vector2 是结构体,因此我无法更改对象向量内的 x 值,除非创建一个新向量。我读过微软关于何时首选结构的示例,但我不确定它是否也适用。

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

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

最佳答案


上述评论的摘要。


TL; DR:对于游戏等高性能应用,您应该尽可能尝试使用struct,特别是对于循环中的短暂情况。

所有 XNA 论坛都对此进行了逐字讨论;指南和文章以及共识是,您应该尽可能使用struct,以避免 GC 的致命暂停,这可能会损害游戏。此外,您通常应该避免 foreach 因为它会创建另一个对象,我认为该对象会因装箱而影响 GC。对于当时为 Xbox 360 编写的 C# 游戏或 .NET 4 之前的 C# 游戏,这个问题尤其严重。

顺便说一句,Monogame 是 XNA 的一个分支,也面临着同样的问题

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

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

告诉我更多

关于c# - 在游戏循环中使用结构体与引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421721/

相关文章:

c# - 我从哪里开始面向方面编程?

java - 添加/保存的数据无效 (addPerson)

c# - 当前用户全局变量 C# 桌面应用程序

java - 压缩超过 2 个循环的字符串

BASH - 使用 Loop 和 If 语句从唯一字段中的多个字段汇总信息

java - 将数字保存到循环JAVA中的变量

c++ - 在另一个类中定义静态类指针

c# - Resharper Inspection/Context Actions 不适用于一个文件

c# - Thread 类中 Thread.BeginThreadAffinity() 方法的用途是什么?

c# - 内存泄漏: ListView with Bitmaps