3.8 运行时看debug信息 有个present(ms)是什么意思

show fps 一系列信息有draw call 逻辑耗时 物理耗时 渲染耗时 present(ms)是什么意思

什么意思?

渲染完一帧画面之后,与当前显示的缓冲区进行交换的时间。。。吧?

看383的源码,应该就是这么回事了



这个在原生(android)平台耗时很高(ios没有打包测试),达到30+ms,这个有什么优化方案么?

不好意思,这个没研究过,参与过的项目这个值都挺低的,没弄过。不过从源码这边分析的话,大概率是跟渲染数据有关,可能是同一帧里提交的渲染数据太多了?可以试试分帧渲染之类的方案。


以下是来自AI的分帧渲染参考方案:

在 Cocos Creator 中实现分帧渲染可以通过使用 cc.director.getScheduler().schedule 方法来分配渲染任务到不同的帧中。以下是一个简单的实现步骤:

  1. 定义任务队列 :创建一个任务队列来存储需要分帧执行的任务。
  2. 调度任务 :使用调度器将任务分配到不同的帧中执行。
  3. 执行任务 :在每一帧中执行一部分任务,直到所有任务完成。
const { ccclass, property } = cc._decorator;

@ccclass
export default class FrameRendering extends cc.Component {
    private taskQueue: Function[] = [];
    private tasksPerFrame: number = 5;

    onLoad() {
        // 初始化任务队列
        this.initTaskQueue();

        // 开始分帧渲染
        cc.director.getScheduler().schedule(this.executeTasks, this, 0, cc.macro.REPEAT_FOREVER, 0, false);
    }

    initTaskQueue() {
        // 添加一些示例任务到任务队列
        for (let i = 0; i < 100; i++) {
            this.taskQueue.push(() => {
                // 这里是每个任务的具体实现
                console.log(`执行任务 ${i}`);
            });
        }
    }

    executeTasks() {
        // 每帧执行一定数量的任务
        for (let i = 0; i < this.tasksPerFrame; i++) {
            if (this.taskQueue.length > 0) {
                const task = this.taskQueue.shift();
                if (task) {
                    task();
                }
            } else {
                // 如果所有任务都完成了,停止调度
                cc.director.getScheduler().unschedule(this.executeTasks, this);
                break;
            }
        }
    }
}
1赞

我碰到的时候问的. 确实跟渲染有关. 当时跟label有关. win平台. 你可以参考下.
如果没办法 就还是屏蔽功能一点一点来吧.

30ms应该是,比如你设置的30帧运行,那1帧是33ms,其实3ms就运行完了,等待了30ms