建议:逻辑与渲染分离

目前creator的FPS帧率控制是统一的一个计时器,比如说:fps=10,就是指渲染、逻辑执行 都是10次/秒。
这样造成的结果就是:一旦渲染卡住了,逻辑也会跟着卡住。

这里举一个例子,
发射子弹:如果场景做的很华丽,导致渲染比较卡顿,飞行的子弹有可能跳过目标,而没有发生碰撞

建议把 渲染、逻辑 两者的帧率控制分开,分别提供设置接口,即便渲染卡住了,只要逻辑不复杂,还能保证逻辑顺畅执行。

3赞

我觉得这个应该是碰撞检测的问题多点吧

逻辑渲染分离主要是在多核CPU的性能会好一些,跟你这个其实没啥关系。。
还有就是分离的话会很复杂。。大改特改,大概是这样~

这个分离并非指分出多个线程,只是分别控制帧率而已,主要目的是【不让逻辑处理受限于渲染帧率】。没仔细研究过Creator的代码,可能改起来要动大手术,只是建议而已。据说U3D、Egret等引擎好像都是这么设计的,希望Creator越来越棒

这点我赞同,U3D 有一个 FixedUpdate 用于驱动物理表现,这是否就是你所说的分别控制帧率?

1赞

逻辑和渲染分离不影响帧率只能用多线程了,但是多线程调用opengl很麻烦的,opengl的context在渲染线程,游戏逻辑线程没有context就不能调用opengl的接口函数,貌似在游戏逻辑线程多弄一个context就可以,估计很麻烦,而且渲染是gpu的事,cpu只是给gpu传数据,普通场景应该不会很慢,除非游戏逻辑太复杂不合理

是的,就是这个意思

U3D 的FixedUpdate是固定时间更新,如果主线程卡顿,它一帧会执行多次
ps:unity3d4.x其实也是单线程的,5.0就不清楚了

既然这样,FixedUpdate 你完全可以自己实现啊?又不是很难,自己在 update 里判断一下 deltaTime 就好了。

这个还真没办法在update里面实现,因为update现在是跟渲染一个帧率的,FixedUpdate不可能比它更快。
我想牺牲点渲染帧率,而保证逻辑更顺畅,此法是做不到。

参考下U3D的设计,大概就是这么个意思:

你自己定义一个 fixedUpdate,然后在 update 里判断需要调用多少次 fixedUpdate 不就好了吗?

明白了,你的思路跟我的有点不同,也能达到相同的效果,而且还不用对底层大改。

大概整理一下,
第一个思路:
逻辑跟渲染捆绑,渲染FPS == 逻辑FPS,update 里多次调用 fixedUpdate。
update(dt) 根据参数dt多少,算出fixedUpdate的执行次数,固定时间间隔执行。

第二个思路:
逻辑跟渲染分离,分别设置帧率,渲染FPS <= 逻辑FPS。

分别设置不了,第二种除非是多线程,否者就是第一种。。

同意楼上。。。。。。

单线程的话,应该可以用以下方式模拟吧:

render_fps: 10, // 渲染FPS
last_render_tick: 0, // 上次渲染时刻
update: function (dt) {
    // 逻辑每帧执行
    this.LogicUpdate(dt);

    // 渲染单独控制
    var current_tick = (new Date()).getTime();
    var render_elapsed = current_tick - this.last_render_tick;
    var render_dt = 1000 / render_fps;
    if (render_elapsed >= render_dt) {
        this.Render();
        this.last_render_tick = current_tick;
    }
},

上面的做法可以做到:
逻辑相对流畅(每帧都执行,一般是满帧60FPS)
渲染单独控制(这里是10FPS)

单线程的情况下,渲染的卡顿会堵塞逻辑(反之同理),这时候适当降低渲染帧数,可以尽量保证逻辑的流畅性。

嗯,确实可以 。不过我个人会倾向于渲染、特效、动画 60fps,游戏、交互、物理 30fps,AI 10fps…

2赞

分的挺详细的啊:+1:值得借鉴

请问 这个 this.Render(); 是啥意思?是哪里滴函数? this 是谁?

void MyTest::update(float dt)
{
//It is recommended that a fixed time step is used with Box2D for stability
//of the simulation, however, we are using a variable time step here.
//You need to make an informed choice, the following URL is useful
//http://gafferongames.com/game-physics/fix-your-timestep/

int velocityIterations = 8;
int positionIterations = 1;

static float num_dt = 0.0f;
static float box2d_dt = (1.0f/60.0f);
num_dt += dt;

int k = num_dt / box2d_dt;

if (k >= 1)
{// 保证box2d总是有60帧/秒的速率
    for (int i = 0; i < k; i++)
    {
        _world->Step(box2d_dt, velocityIterations, positionIterations);
    }// for i
    num_dt = num_dt - k * box2d_dt;
}// if

}

仅供参考,简单有效!

2赞

能换算成js代码吗?。。