处理'javaw'占用CPU使用率的95%以上

时间:2014-04-14 02:19:27

标签: java multithreading performance cpu-usage

我有一个java游戏,在启动时可以达到最低94%的CPU。考虑到程序只有124kb,这确实是一个疯狂的数量。可能的问题可能是它实现了三种线程。

  • 一个接收并发送数据包作为服务器;
  • 一个作为客户;
  • 和主要游戏主题。

为什么会出现这种情况可能存在许多不同的可能性,但我的猜测是坚持线程的想法。欢迎任何提出这个数字的想法和建议,非常赞赏。

CPU:Intel Core 2 Duo,2.66Ghz RAM,2GB。

<小时/> 注意:这种情况发生在许多计算机上,但游戏运行顺畅。

<小时/> 编辑:在回答所做的回答时,我没有使用任何库,我也以类似的方式创建了我的帖子。客户端和服务器线程遵循以下:

public class Client implements Runnable {
  public boolean running;
  public DatagramSocket socket;

  public Client() {
    running = true;
    socket = new DatagramSocket(/*whatever params*/);
    new Thread(this).start();
  }
  public void run() {
    byte[] data = new byte[1024];
    while(running) {
      socket.receive(data);
      parsePacket(data);
    }
  }
  public void parsePacket(byte[] data) {
    // Does all the packet parsing things.
    // The client modifies the level.
    // The server just spreads things to every client. (could be the server if multiple connections are live?)
  }
}

但是,当您检查线程是否被中断时,是否会检查线程是否暂停? - 那就是被打断的线程意味着什么,对吗?

在主游戏循环结束时Thread.sleep(50)会有什么好处吗?仍然可以进行合理的修复。

1 个答案:

答案 0 :(得分:1)

这是一个性能调优问题,需要整个代码库知道您正在做什么,这会加剧处理器。现在我们知道你已经写了一个计算机程序,它可以旋转三个线程。所以我打赌它是这三个主题中的一个,因为这是我们真正知道的。我们甚至不知道它所基于的游戏库。没有任何真正的代码,就无法提供任何真正的帮助。

无论如何,这就是你要做的事情,开始弄清楚哪个线程正在被遗忘。通常你会写一个这样的主线程:

public class MainGameLoop implements Runnable {

    public void startupGame() {
       long start = System.currentTimeMillis();
       doStartUpGame();
       long end = System.currentTimeMillis();
       System.out.printf("Start up took %,d%n", end - start );
    }

    public void run() {
        startUpGame();
        while( !Thread.currentThread().isInterrupted() ) {
            long start = System.currentTimeMillis();
            doGameLogic();
            long duration = System.currentTimeMillis() - start;
            System.out.printf("Processing took %,d ms %n", duration );
            if( duration < frameRate ) {
               Thread.sleep( frameRate - duration );
            } else {
               System.out.printf("Game loop took longer than it should by %,d ms%n", duration - frameRate );
            }
        }
    }
}

在所有线程上执行此操作,只看到三者中的哪一个占用了这么多CPU。之后,您可以开始将其缩小到您的CPU耗尽的部分。对doGameLogic等的每个子进程重复此过程