You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:55:09