show fps 一系列信息有draw call 逻辑耗时 物理耗时 渲染耗时 present(ms)是什么意思
什么意思?
渲染完一帧画面之后,与当前显示的缓冲区进行交换的时间。。。吧?
这个在原生(android)平台耗时很高(ios没有打包测试),达到30+ms,这个有什么优化方案么?
不好意思,这个没研究过,参与过的项目这个值都挺低的,没弄过。不过从源码这边分析的话,大概率是跟渲染数据有关,可能是同一帧里提交的渲染数据太多了?可以试试分帧渲染之类的方案。
以下是来自AI的分帧渲染参考方案:
在 Cocos Creator 中实现分帧渲染可以通过使用 cc.director.getScheduler().schedule 方法来分配渲染任务到不同的帧中。以下是一个简单的实现步骤:
- 定义任务队列 :创建一个任务队列来存储需要分帧执行的任务。
- 调度任务 :使用调度器将任务分配到不同的帧中执行。
- 执行任务 :在每一帧中执行一部分任务,直到所有任务完成。
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



