CPU使用率随时间增加

时间:2014-04-04 13:02:53

标签: java android cpu cpu-usage

我正在制作游戏(小行星,船只用子弹摧毁小行星)我有一个问题:

如果我在开始时产生 50个小行星,则cpu使用率约为 2-3%。没关系。
但是如果我产生 5个小行星然后我玩游戏并且到达 50个小行星的时刻(每个级别增加,当你去掉所有之前)时,CPU使用率约为 20%
此外,如果我销毁49/50小行星并且只留下一个活着,那么CPU使用率将仍为20%,但无需计算(我的意思是移动,碰撞检测等)

我有主GameLoop TimerTask

public void startGameLoop() {
    timer.schedule(gameLoopTask, 0, 17);
    timer.schedule(updateScoreAndLifesTask, 2000, 300); // just update score views
}
class GameLoop extends TimerTask {
    public void run() {
        game.updateState();
        openGLView.requestRender();
    }
}
public void updateState() {
    ship.move();

    for(int i=0; i<asteroids.size();i++) // asteroids and ship.bullets are ArrayLists
        asteroids.get(i).move();

    for(int i=0; i<ship.bullets.size();i++)
        ship.bullets.get(i).move();

    detectCollision();
}
public void detectCollision() {
    detectCollisionAsteroidsWithBullets();
    if(ship.isAlive && !ship.isImmortal)
        detectCollisionAsteroidsWithShip();     
}

detectCollision方法循环ship.bulletsasteroids ArrayLists的副本:

public void detectCollisionAsteroidsWithBullets() {
    mainloop: for(int b=0; b < ship.bullets.size(); b++) {  
        for(int a=0; a<asteroids.size(); a++) { 

public void detectCollisionAsteroidsWithShip() {        
    mainloop: for(int a=0; a<asteroids.size(); a++) {
        if(isAABBoxIntersectWithAABBox(asteroids.get(a).AABBCoords, ship.AABBCoords)) {

因此,如果只有1个小行星,就不应该使用CPU。销毁子弹和小行星= asteroids.remove(asteroid);(我只是从ArrayList中删除它
所以,请帮助我,我不知道为什么它继续使用如此多的CPU,如果只有循环可以很好地运行50个小行星,并且肯定不应该只用1个小行星来做20%的CPU使用

1 个答案:

答案 0 :(得分:0)

您是否应该制作已存在对象的克隆? 在你摧毁它们之后,你所摧毁的小行星仍将存在于游戏中。

您应该删除它们或再次开始使用它们。