Unity跨平台实现函数按真实时间稳定定时执行的问题
解决方案:基于系统真实时间的稳定定时存档实现
核心思路
放弃依赖Unity帧驱动的定时API(InvokeRepeating、递归协程),直接通过系统真实时间戳计算时间差,确保定时逻辑完全脱离帧率波动影响。
实现代码
private float _lastSaveTimestamp; public float saveInterval = 5f; // 存档间隔(秒) public float postSaveDelay = 1f; // 存档后隐藏文本的延迟(秒) private bool _pendingDeactive; private float _deactiveTimestamp; void Start() { // 初始化存档计时起点为当前真实时间 _lastSaveTimestamp = Time.realtimeSinceStartup; } void Update() { // 检查是否到达存档时间点 if (Time.realtimeSinceStartup - _lastSaveTimestamp >= saveInterval) { saving(); _lastSaveTimestamp = Time.realtimeSinceStartup; // 标记后续执行deactive的时间点 _deactiveTimestamp = Time.realtimeSinceStartup + postSaveDelay; _pendingDeactive = true; } // 检查是否到达执行deactive的时间点 if (_pendingDeactive && Time.realtimeSinceStartup >= _deactiveTimestamp) { deactive(); _pendingDeactive = false; } }
方案优势
- 纯真实时间驱动:使用
Time.realtimeSinceStartup(游戏启动至今的真实秒数,不受帧率、时间缩放影响),定时精度完全依赖系统时钟。 - 逻辑稳定可控:在
Update中轮询时间差,避免InvokeRepeating或协程递归在移动端的帧同步延迟问题。 - 性能开销极低:仅简单数值计算,对移动端性能无明显影响。
补充优化点
- 若游戏存在后台切换场景,可改用
DateTime.UtcNow.Ticks获取系统绝对时间戳,确保后台暂停后仍能准确计时。 - 若存档是耗时IO操作,建议将
saving()逻辑放到异步线程执行,避免阻塞主线程影响游戏流畅度。
内容的提问来源于stack exchange,提问作者mrsjohnson
相关产品推荐
相关产品推荐

