在游戏循环中使用结构与引用变量
using a struct vs a reference variable in a game loop
我对 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 关于何时首选结构的示例,但我不确定它是否适用于相同的方式。
我想在 mono 中有一些工具可以为我做这件事,但我仍然想知道每秒进行多次迭代是否会改变事情。
最后,我知道我可以在游戏中声明 Vector class,但我试图让游戏对象管理它们自己的位置。
以上评论的总结。
TL; DR: 对于像游戏这样的高性能应用程序,您应该尽可能使用 struct
s,特别是对于循环中的短暂情况。
所有 XNA 论坛都逐字讨论了这一点;指南和文章以及共识是您应该尽可能使用 struct
s 以避免 GC 的 deadly pauses 这会损害游戏。此外,您通常应该 避免 foreach
因为我相信它会创建另一个会影响 GC 的对象,因为装箱。对于为 XBox 360 编写的 c# 游戏或 .NET 4 之前的 c# 游戏,这个问题在当时尤为严重。
顺便说一下,Monogame 是 XNA 的一个分支,也有同样的问题
在典型的 desktop/web 开发中,继续使用引用类型,因为 GC 效率更高,并且不会在 GC 进行时暂停整个应用程序。
- .NET 4+ 在 Windows 桌面上有后台 GC
- .NET 4.5+ on Windows 服务器有后台 GC
告诉我更多
我对 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 关于何时首选结构的示例,但我不确定它是否适用于相同的方式。
我想在 mono 中有一些工具可以为我做这件事,但我仍然想知道每秒进行多次迭代是否会改变事情。
最后,我知道我可以在游戏中声明 Vector class,但我试图让游戏对象管理它们自己的位置。
以上评论的总结。
TL; DR: 对于像游戏这样的高性能应用程序,您应该尽可能使用 struct
s,特别是对于循环中的短暂情况。
所有 XNA 论坛都逐字讨论了这一点;指南和文章以及共识是您应该尽可能使用 struct
s 以避免 GC 的 deadly pauses 这会损害游戏。此外,您通常应该 避免 foreach
因为我相信它会创建另一个会影响 GC 的对象,因为装箱。对于为 XBox 360 编写的 c# 游戏或 .NET 4 之前的 c# 游戏,这个问题在当时尤为严重。
顺便说一下,Monogame 是 XNA 的一个分支,也有同样的问题
在典型的 desktop/web 开发中,继续使用引用类型,因为 GC 效率更高,并且不会在 GC 进行时暂停整个应用程序。
- .NET 4+ 在 Windows 桌面上有后台 GC
- .NET 4.5+ on Windows 服务器有后台 GC