定时器与循环 - 内存使用

时间:2011-08-16 19:22:04

标签: c# memory timer while-loop thread-sleep

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

6 个答案:

答案 0 :(得分:4)

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

您是否尝试过分析应用程序的内存使用情况?您可能会抓住不再需要的物体。分析器可能能够帮助您确定位置。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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.

答案 4 :(得分:1)

不完全是一个答案,而是另一种选择。我认为事件驱动的方法会优于任何重复检查(无论您如何实施重复检查)。当一段代码杀死玩家时,它也应该调用其他代码可以挂钩的事件。

至于你的记忆问题,没有任何来源,我只能建议你描述一下你的代码,看看那些记忆是什么。

答案 5 :(得分:1)

你的while循环是个不错的选择。游戏循环是建立游戏的最常用方式。

您可以查看this article以了解不同类型的游戏循环。

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

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