我刚刚开始在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是不正常的。
答案 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速度的影响。