Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 1个综合计时器与多个计时器,每个对象一个计时器_C#_Winforms_Timer - Fatal编程技术网

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线程上运行
    勾选
    事件委托。