【发布时间】:2010-02-25 16:56:22
【问题描述】:
我正在使用 C# 和 XNA 开发一款 2D 高空射击游戏。我有一个名为“bullet”的类,需要每分每秒更新其中的许多实例。
我的第一种方法是创建一个通用的项目符号列表,然后根据需要简单地删除和添加新项目符号。但这样做时 GC 经常启动,我的游戏有一些周期性的生涩延迟。 (剪掉了很多代码,只是想展示一个简单的sn-p)
if (triggerButton)
{
bullets.Add(new bullet());
}
if (bulletDestroyed)
{
bullets.Remove(bullet);
}
我的第二个也是当前的尝试是拥有一个单独的通用子弹堆栈,当我用完一个子弹时我推送它,当我需要一个新的子弹时弹出一个子弹,如果堆栈中有任何东西。如果堆栈中没有任何内容,那么我将一个新项目符号添加到列表中。 似乎可以减少生涩的延迟,但话说回来,有时仍然会出现一些生涩的延迟(尽管我不知道这是否相关)。
if (triggerButton)
{
if (bulletStack.Count > 0)
{
bullet temp = bulletStack.Pop();
temp.resetPosition();
bullets.Add(temp);
}
else
{
bullets.Add(new bullet());
}
}
if (bulletDestroyed)
{
bulletStack.Push(bullet);
bullets.Remove(bullet);
}
所以,我知道过早的优化是万恶之源,但这是我可以及早发现的非常明显的低效率(这是在不必担心敌人的子弹填满屏幕之前)。所以我的问题是:将未使用的对象推送到堆栈会调用垃圾收集吗?引用会保持活动状态还是对象仍在被破坏?有没有更好的方法来处理更新许多不同的对象?例如,我是不是太花哨了?只遍历列表并以这种方式找到未使用的项目符号会很好吗?
【问题讨论】:
-
.Net 约定是 PascalCase 类名,也就是说,让类名中的每个“单词”都以大写字母开头。在您的情况下,将 bullet 重命名为 Bullet。不过,String、Int32 和其他所谓的基本类型都有小写等价物,例如。 string 和 int,但这是 C# 特定的,不会暴露在外部。
标签: c# garbage-collection xna