Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

C#实时游戏游戏组件,用于将多种延时事件转为待处理事件队列。

License

Notifications You must be signed in to change notification settings

Sweetnow/DelayedEventManager

Repository files navigation

DelayedEventManager


简介

本项目用于解决在线实时游戏中,多种延时事件与单线程游戏逻辑之间的冲突,采用线程安全的优先级队列将延时事件根据预计到期的时间排序,将到期事件送入输出队列中供实际处理程序完成处理,提供了可靠的、资源占用低的延时事件处理机制。

  • 支持多线程并发加入延时事件
  • 支持可调节、动态的性能平衡(CPU占用与事件预期/实际时间差)
  • 线程池、定时器等资源占用低
  • 锁结构简单

实现

ConcurrentPriorityQueue.cs

线程安全的优先级队列(最小堆),提供如下接口:

接口 备注
Count 队列元素数量
Peek TryPeek 获取队列中优先级Key最小的元素
Enqueue 加入新的数据对(Key, Value)
Dequeue TryDequeue 获取队列中优先级Key最小的元素并将其移出队列

提供如下参数用于性能调优:

参数 备注
InitCapacity 队列初始分配大小

TaskManager.cs

将多种延时事件按预期发生事件转为待处理事件的组件,提供如下接口:

接口 备注
Output 达到时限的待处理事件队列(供外部程序处理)
Closed 组件是否停止工作
Start 启动组件
Close 关闭组件(其中对外告知Output终止的机制不完善)
Add 加入新的延时事件

提供如下参数用于性能调优:

参数(单位ms) 备注
InitBusy 忙等待初始时限
ToleratedDelta 容忍的事件预期/实际时间差
MinusStep 产生容忍的时间差内的处理时,忙等待时限减少量
MultipleRatio 产生容忍的时间差外的处理时,忙等待时限倍率
MaxBusy MinBusy 忙等待时限范围

本组件以延时事件的预期发生时间建立优先级队列,在每次循环时检测队列头部事件是否到期,进行以下处理:

  • 事件到期:从优先级队列中移除转为待处理事件,进入Output,再次检测队列头部事件;
  • 事件到期剩余事件小于忙等待时限:继续循环检测队列头部事件(忙等待);
  • 事件到期剩余事件大于忙等待时限:等待条件变量,通过定时器(定时时长为到当前队列头部事件预期时间前一小段时间(忙等待时限))或Add唤醒,唤醒后检测队列头部事件。

忙等待时限通过一定规则自适应调整,用于平衡CPU占用与反应速度(事件预期/实际时间差):

  • 当到期事件的实际事件与预期时间小于ToleratedDelta时,将忙等待时限减少MinusStep;反之乘MultipleRatio。同时规则设定忙等待时限的初始值为InitBusy,上限为MaxBusy,下限为MinBusy

About

C#实时游戏游戏组件,用于将多种延时事件转为待处理事件队列。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /