移动对象流畅,性能不佳

时间:2014-04-01 13:24:42

标签: java android opengl-es game-engine game-physics


我刚刚开始在Android上开发我的迷你游戏,我得到了一些关于性能的问题,并且通常是“如何”:
如果我在creeen上有25个以上的物体(只是一个7-8角的多边形) )它开始滞后并且 CPU使用率非常高 15-20%没有整流检测,高达50%且碰撞检测为三星备注10.1平板电脑) 所以我有~25个多边形(小行星),它们总是“飞行”。所以为了移动它们我做了一个Timer,对吗?在TimerTask上我有这样的东西

public void move() {
    translate[1] += speed[1];
    translate[0] += speed[0];

    updateTranslateMatrix();    // updating translate matrix and then send it into vertex shader
    updateAABBCoords(); // update coordinates of Axis-aligned bounding box
    updateCoordsByTranslate(); // update coordinates of verticles (to be able to define exact collision (with bullets and starship))
}

此方法中是否有不必要的内容
另外我想问一下,每隔17毫秒运行一次这个定时器是否 OK?或者17毫秒太频繁了?我感觉运动平稳只在17毫秒,可能是我做错了?和相同的计时器间隔我得到了星舰/子弹运动和碰撞检测。
请帮帮我。我觉得缺少一些巨大而基本的东西,因为在那个简单的Asteroids游戏中,Note 10.1上50%的CPU是不正常的。

1 个答案:

答案 0 :(得分:1)

我认为,一个关键问题是,您正在为每个对象分配一个Timer,而不是使用通用游戏循环。绝大多数游戏都使用连续运行的游戏循环,通常可以拆分为两个组件:Update和Render。

An article on basic game loop design for Java/Android

An answer to a relevant question on game loop design on gamedev.stackexchange.com

使用游戏循环时,您无法保证能够每17毫秒或其他任意持续时间更新。相反,Update和Render方法接收DeltaTime参数,该参数是自上一帧以来的时间。

然后在例如通过将其与对象的速度相乘来获取新对象位置时使用。这样做可以平滑地插入位置,并确保对象速度不受CPU速度的影响。