C# Timer 实现Tick 使用精度问题

C# Timer 实现Tick 使用精度问题


我们想在C#中实现一秒钟执行n次的一个事件, 然后其他方法可以监听这个事件, 最终实现每一帧随着Tick改变, 我们的倒计时开始计数.
在使用Timer过程中发现Timer的精度有问题, 最高频率是1秒调用62次, 不满足我们的使用需求, 100帧每秒, 于是我们采用了别的方式实现这样的功能

实现效果

在这里插入图片描述

实现误区

我们最早实现方法是直接开启一个新线程, 在线程内部开启一个Timer, 设定Timer的延迟, 但是最终发现它的执行精度最高只能达到62帧每秒, 我就算把Timer的间隔时间设置为1ms也是只能执行62帧每秒, 原因我们初步推测是因为Timer的精度不足.

解决思路

于是我们前往了C#源码查看, 发现源码是通过Stopwatch实现的Timer类, Stopwatch类主要是一个倒计时秒表, 既然知道是什么东西了那么就好实现了, 我们开启一个新线程, 保证线程一直执行就加上无限循环while(true). 在外部 我们开启Stopwatch, 然后我们在while中判断秒表是否达到我们的需求, 如果达到了那么就调用一个事件, 然后在外部监听这个事件,就可以实现了

代码片段

class Program
    {

        /// <summary>
        /// 10ms trigger ont time
        /// </summary>
        private const int tickTime = 10;
        private static Action<long> Tick;

        static void Main(string[] args)
        {

            Tick += (x) => { Console.WriteLine("Time:" + x); };

            Thread t = new Thread(() =>
            {

                Stopwatch s = new Stopwatch();
                s.Start();

                long temp = 0;

                while (true)
                {
                    if (s.ElapsedMilliseconds >= temp + 10)
                    {
                        temp = s.ElapsedMilliseconds;
                        Tick?.Invoke(temp);
                    }
                }

            });

            t.IsBackground = true;
            t.Start();

            while (true) { }

        }
    }

效率

测试上述代码后发现, 设定为10ms执行一次的,按照理论上执行次数是1秒钟100帧, 但实际效果是90帧, 于是我们得出结论, 使用这种方式在10ms的时候, 效率是90%, 然后我们测试了1ms执行一次的效果, 效率为50%, 也就是1秒钟执行了500次.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值