一般游戏服务器里定时任务是通过什么样的方式完成呢?

如果是linux服务器下,提供两种编码比较简单的常见方案,抛砖引玉: 一种是使用内核提供的定时器功能,定时精度可达纳秒级(当然普通硬件的纳秒级几乎不可靠): 通过timerfd_create(2)函数创建一个定时器描述符,在flags参数里设置非阻塞和exec后关闭,然后设置好定时间隔和是否只执行一次之后,把描述符加入到epoll的事件驱动系统里,当epoll_wait返回该描述符可读时,说明定时器到点,可以执行回调任务函数了。 另一种类似的常见定时器实现是,通过select/epoll_wait函数的超时功能,同时定义定时任务节点,用一个最小单位间隔时间设置timeval结构体,传入事件驱动主循环中select/epoll_wait的阻塞时间参数。这种实现方法的关键是要设计好一个管理定时任务节点的数据结构,尽可能地减少执行定时任务和增删定时任务的时间复杂度,保证最快到点的时间最先弹出数据结构容器,执行任务回调函数。常见的数据结构容器有,按到点时间排序的有序链表,最小时间堆等。这种方式精度为微秒级。 这两种方案的共同优点是,定时任务处理和普通网络socket读写事件处理都能使用同一个I/O多路复用机制,提升服务器负载能力,避免了另开线程。严重不推荐通过alarm函数或sleep函数来实现的定时功能。原因很简单:一,定时精度不够;二,线程大部分时间处于睡觉状态,程序性能,cpu使用率低下。TG:li9047

尚美源码坑位教程提供精美的网站源码教程,小程序、公众号、H5、APP、游戏、直播、支付、区块链、商城、影音、小说等源码信息大全。
尚美源码教程库 » 一般游戏服务器里定时任务是通过什么样的方式完成呢?
赞助VIP 享更多特权,立即登录下载海量资源
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡