5

我正在用 C# 编写一种游戏,我想知道什么是更好的内存使用方法。现在我有它,所以它会经过一个while循环,当游戏运行时,它会检查某些事情(这个人是否死了等),休眠一秒钟,然后再试一次。一旦游戏结束,while 设置为 false 并退出该方法。计时器会是更好的方法吗?当我运行这个游戏时,我有时会注意到内存问题。

4

6 回答 6

7

while循环方法可能不是您的问题 。Timer实际上比这种方法要重一些,并且会消耗更多的系统资源,但这将是一次性分配。换句话说,将主循环代码从一种结构更改为另一种结构不太可能显着改变应用程序的内存配置文件。

您是否尝试过分析应用程序的内存使用情况?您可能会持有不再需要的对象。探查器可能能够帮助您确定位置。

(如果您好奇,使用 aTimer可能会对性能产生非常小的影响,因为每次迭代都会导致函数指针调用,CPU 和 JIT 编译器无法很好地优化。使用while循环意味着您的代码始终在运行;Thread.Sleep()调用可以很好地优化,因为它不是通过函数指针。考虑到这种Timer方法也可能导致代码可读性降低,我强烈建议您继续使用while循环。)

于 2011-08-16T19:25:25.297 回答
1

将其更改为计时器与睡眠将(有效地)对内存使用没有影响。主要区别在于应用程序如何运行的逻辑 - 使用计时器,您不会在 while 循环中进行顺序处理,而是定期发生一系列“事件”。

于 2011-08-16T19:26:09.273 回答
1

我认为 while 循环是此类任务的最佳方法(可能与线程结合使用)。计时器主要用于更长和更准确的时间段。

于 2011-08-16T19:26:20.733 回答
1

是的,你应该为你的主游戏循环使用一个 while 循环,但你不应该休眠。取而代之的是,您应该在最后一次绘制帧时加上时间戳,并且每次循环时检查是否 1/30 秒或其他时间已经过去。如果没有,那么忙循环一遍又一遍,直到它过去。

您的每秒“人死”之类的事情(即使这是一个糟糕的例子 IMO)可以简单地使用不同的时间戳来完成,并通过检查来查看自“人死”代码最后一次是否已经 1 秒跑。除非您有非常令人信服的理由在计时器线程中进行该处理,否则最好同步进行。

您的内存问题在很大程度上与使用 while 循环无关。确保您没有重复向列表或其他内容添加项目,并确保使用using构造完成任何资源初始化:

using (StreamReader sr = File.OpenText(path))
{
        // blah blah using sr
}

// The streamreader has been automatically disposed by this point.
于 2011-08-16T19:28:34.877 回答
1

不完全是答案,而是另一种选择。我认为事件驱动的方法会比任何重复检查更好(不管你如何实现重复检查)。当一段代码杀死玩家时,它还应该调用其他代码可以挂钩的事件。

至于您的内存问题,没有任何来源,我只能建议您分析您的代码以查看所有内存是什么。

于 2011-08-16T19:28:42.590 回答
1

您的 while 循环是不错的选择。游戏循环是构建游戏的最常见方式。

您可以查看这篇文章以了解不同类型的游戏循环。

如果您正在学习,您可能还想使用xna作为游戏的基础。游戏循环已经为您实现。

无论如何,它不应该是你的记忆问题的原因。

于 2011-08-16T19:30:14.380 回答