定时器与While循环-内存使用
本文关键字:内存 循环 While 定时器 | 更新日期: 2023-09-27 18:05:51
我正在用c#编程一种游戏,我想知道什么是更好的内存使用方法。现在我有了它,所以它会通过一个while循环,当游戏运行时,它会检查某些事情(这个人是否死了,等等),睡一秒钟,然后再试一次。一旦游戏结束,while设置为false并退出该方法。计时器会是更好的方法吗?当我运行这个游戏时,我注意到内存问题。
while
循环方法可能不是您的问题。Timer
实际上比这种方法要重一些,并且会消耗更多的系统资源,但这将是一次性分配。换句话说,将主循环代码从一种结构更改为另一种结构,不太可能显著改变应用程序的内存配置文件。
你试过分析你的应用程序的内存使用吗?您可能会持有不再需要的对象。分析器可以帮助您确定。
(如果您很好奇,使用Timer
可能会有非常小的性能影响,因为每次迭代都会导致函数指针调用,CPU和jit编译器无法很好地优化。使用while
循环意味着你的代码总是在运行;Thread.Sleep()
调用可以很好地优化,因为它不是通过函数指针。考虑到Timer
方法也可能导致代码可读性降低,我强烈建议您继续使用while
循环
将其更改为计时器与睡眠将(有效地)对内存使用没有影响。主要区别在于应用程序运行的逻辑——使用计时器时,在while循环中不会有顺序的进程,而是有规律间隔发生的一系列"事件"。
我认为while循环是这种任务的最佳方法(可能与线程结合使用)。计时器主要用于更长的和精确的时间段。
是的,你应该在你的主要游戏循环中使用while循环,但你不应该使用Sleep。相反,你应该用时间戳来标记上一次绘制帧的时间,每次循环时检查是否过了1/30秒或其他时间。如果不存在,则反复进行busy-loop,直到通过为止。
你的每秒钟"人死亡"的事情(即使这是一个坏的例子在我看来)可以简单地用一个不同的时间戳来完成,通过检查来保护它,看看它是1秒自从"人死亡"代码最后一次运行。除非你有非常令人信服的理由在一个计时器线程中做这个处理,否则最好是同步的。
你的内存问题在很大程度上与使用while循环无关。确保您没有重复地向列表或其他东西添加项目,并确保使用using
构造完成任何资源初始化:
using (StreamReader sr = File.OpenText(path))
{
// blah blah using sr
}
// The streamreader has been automatically disposed by this point.
不是确切的答案,而是另一种选择。我认为事件驱动的方法比任何重复出现的检查都要好(不管您如何实现重复出现的检查)。当一段代码杀死玩家时,它也应该调用一个其他代码可以挂钩的事件。
至于你的内存问题,没有任何来源,我只能建议你分析你的代码,看看所有的内存是什么。
while循环是个不错的选择。游戏循环是构建游戏最常见的方式。
你可以查看这篇文章来了解不同类型的游戏循环。
如果你正在学习,你也可以使用xna作为游戏的基础。游戏循环已经为你实现了。
在任何情况下,它不应该是你的记忆问题的原因。