C# 1个综合计时器与多个计时器,每个对象一个计时器
我有一个关于良好实践的问题。我在做一个简单的游戏,我在和一些精灵鬼混 我上雪碧课。在该类中,有一个计时器每几毫秒运行一次 现在,我有一个C# 1个综合计时器与多个计时器,每个对象一个计时器,c#,winforms,timer,C#,Winforms,Timer,我有一个关于良好实践的问题。我在做一个简单的游戏,我在和一些精灵鬼混 我上雪碧课。在该类中,有一个计时器每几毫秒运行一次 现在,我有一个列表,每个“生物”都有一个精灵对象来运行动画。这就意味着每种生物都有一个计时器来做同样的事情 我决定改变这一点,制作一个计时器,在列表上迭代,并调用为每个“生物”创建动画的函数 什么是好的实践 给每个“生物”一个自己的计时器 以在列表上迭代的形式创建一个“大”计时器,并调用从每个对象创建动画的函数 另一种方式 如果它们都在相同的时间间隔运行,那么一个大计时器肯定
列表
,每个“生物”都有一个精灵对象来运行动画。这就意味着每种生物都有一个计时器来做同样的事情
我决定改变这一点,制作一个计时器,在列表上迭代,并调用为每个“生物”创建动画的函数
什么是好的实践
如果它们都在相同的时间间隔运行,那么一个大计时器肯定是最好的选择 即使它们以不同的时间间隔运行,一个大计时器(用逻辑确定哪个子处理程序启动)通常仍然是最好的
有些库会在内部添加此逻辑,并且只从操作系统请求一个计时器。您还没有确切说明您使用的是哪个计时器(.NET至少有四个),因此我建议您自己使用一个集中计时器。如果它们都以相同的间隔运行,那么一个大计时器肯定是最好的选择 即使它们以不同的时间间隔运行,一个大计时器(用逻辑确定哪个子处理程序启动)通常仍然是最好的 有些库会在内部添加此逻辑,并且只从操作系统请求一个计时器。您还没有确切说明您正在使用的计时器(.NET至少有四个),因此我建议您自己使用集中式计时器 我上雪碧课。在该类中,有一个计时器每几毫秒运行一次 不幸的是,事实并非如此。您受到(非高性能)系统时钟分辨率的限制,该分辨率约为15毫秒。所以,如果你愿意,你可以设置一个1的间隔,但这不是你真正得到的 回到主题上来,对于一个游戏来说,一切都应该在同一个时钟上运行。对于每个勾号,您将有一个循环,该循环将更新游戏的逻辑状态(位置和诸如此类),然后更新显示(动画帧、blit到屏幕等)。如果对象位于不同的计时器上,则可能会遇到问题,因为在并行更新对象时,协调对象的状态将变得极其困难 还要认识到,您需要规范化更新速率,以确保内容不会更新得太快或太慢(取决于渲染帧所需的时间)。您需要检查上次更新和新更新之间的增量,并采取相应的行动 我上雪碧课。在该类中,有一个计时器每几毫秒运行一次 不幸的是,事实并非如此。您受到(非高性能)系统时钟分辨率的限制,该分辨率约为15毫秒。所以,如果你愿意,你可以设置一个1的间隔,但这不是你真正得到的 回到主题上来,对于一个游戏来说,一切都应该在同一个时钟上运行。对于每个勾号,您将有一个循环,该循环将更新游戏的逻辑状态(位置和诸如此类),然后更新显示(动画帧、blit到屏幕等)。如果对象位于不同的计时器上,则可能会遇到问题,因为在并行更新对象时,协调对象的状态将变得极其困难
还要认识到,您需要规范化更新速率,以确保内容不会更新得太快或太慢(取决于渲染帧所需的时间)。您需要检查上一次更新和新更新之间的增量,并相应地采取行动。您最好的选择是实现一个游戏循环,该循环跟踪自上次循环迭代以来经过的时间,然后将经过的时间量传递给所有需要自我更新的实体 例如,每次通过游戏循环时发生的实现(例如onUpdate帧、OnRenderFrame) 每个事件都传递一个类型为的参数,该参数具有一个时间属性:
/// <summary>
/// Gets a <see cref="System.Double"/> that indicates how many seconds of time elapsed since the previous event.
/// </summary>
public double Time
{
get { return elapsed; }
internal set
{
if (value <= 0)
throw new ArgumentOutOfRangeException();
elapsed = value;
}
}
//
///获取一个值,该值指示自上一个事件以来经过了多少秒。
///
公共双倍时间
{
获取{return appeased;}
内部集
{
如果(value您最好的选择是实现一个游戏循环,该循环跟踪自上次循环迭代以来经过的时间,然后将经过的时间量传递给需要更新自身的所有实体
例如,每次通过游戏循环时发生的实现(例如onUpdate帧、OnRenderFrame)
每个事件都传递一个类型为的参数,该参数具有一个时间属性:
/// <summary>
/// Gets a <see cref="System.Double"/> that indicates how many seconds of time elapsed since the previous event.
/// </summary>
public double Time
{
get { return elapsed; }
internal set
{
if (value <= 0)
throw new ArgumentOutOfRangeException();
elapsed = value;
}
}
//
///获取一个值,该值指示自上一个事件以来经过了多少秒。
///
公共双倍时间
{
获取{return appeased;}
内部集
{
if(值)im使用System.Windows.Forms。Timer@samy:了解此计时器使用System.Windows.Forms在UI thread.im上运行勾选
事件委托。Timer@samy:了解此计时器在UI线程上运行勾选
事件委托。