gpt4 book ai didi

java - 简单的 Java 游戏循环的 CPU 使用率非常高

转载 作者:行者123 更新时间:2023-11-30 02:48:47 24 4
gpt4 key购买 nike

我一直在学习游戏设计的原理,并在许多教程的帮助下用 Java 制作了这个游戏循环。它现在所做的就是将草 block 渲染到 JFrame 上:

public class Game extends JPanel implements Runnable {

String title;
int height;
int width;

boolean ps;

private int ticks;
private JPanel p;
private BufferStrategy bs;
private Graphics g;
private boolean running = false;
private Thread thread;
private Frame frame;
private KeyHandler keyHandler;

public Game(String title, int width, int height){
this.width = width;
this.height = height;
this.title = title;
keyHandler = new KeyHandler();
}

private void init() {
TileHandler.init();
frame = new Frame(title, height, width);
frame.getFrame().addKeyListener(keyHandler);
}

private void tick() {
// KeyHandler.tick();

// updates game logic
}

private void render() {
render(g);
}

private void render (Graphics g) {
bs = frame.getCanvas().getBufferStrategy();
if(bs == null){
frame.getCanvas().createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
g.clearRect(0, 0, width, height);

g.drawImage(TileHandler.grass, keyHandler.getPlayerX(),
keyHandler.getPlayerY(), null);

bs.show();
g.dispose();
}

@Override
public void run() {

int x = 4;
init();
int fps = 60; // target
double tickTime = 1000000000 / fps; // time per 1 frame
double delta = 0;
long timer = 0;

long startTime = System.nanoTime();
long endTime;

while (x == 4) {
endTime = System.nanoTime();
delta += (endTime - startTime) / tickTime;
timer += endTime - startTime;
startTime = endTime;

if (delta >= 1) {
ticks++;
render();
delta--;
}
if(timer >= 1000000000){
ticks = 0;
timer = 0;
}
}
}

public int getTicks() {
return ticks;
}

public synchronized void startThread() {
// Start the thread
if (!running) { // if not already

running, you can begin
running = true;
thread = new Thread(this); //Run THIS class on a

new thread
thread.start();
}
else { // safety measure
return;
}
}

public void stopThread() {
if (!running) {
return;
}
running = false;
try {
thread.join(); //Method stops the thread
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}

它工作得很好,我可以让它以稳定的 60 FPS 运行,唯一的问题是它占用了太多的 CPU。平均而言,它使用大约 50% 的 CPU 并减慢我计算机的其余部分 - Minecraft 在我的笔记本电脑上使用大约相同的 CPU!我知道问题出在上面代码中的游戏循环中。

所以我只是想了解导致这种情况发生的原因。我确实尝试使用分析器,但仍然无法找出导致问题的原因。

最佳答案

好吧,给出最简单的答案:循环的运行速度与 CPU 能够处理的速度一样快。我假设您有一个带有两个核心的 CPU,因此主循环线程正在使用它可以尽快运行循环的每一点计算能力,从而阻塞两个核心之一 (50%)。

一种解决方案是计算每次迭代需要多长时间,并 hibernate 一段时间,直到下一次迭代开始。这是一个伪代码:

while(running) {
long startTime = getTime();

update();
render();

long endTime = getTime();
long elapsedTime = endTime - startTime;
Thread.sleep(TARGET_FRAME_TIME - elapsedTime); //sleep to yield unneeded CPU usage
}

此外,如果您不使用 LWJGL 或 JOGL 等 OpenGL 库,您将无法获得非常好的性能。我不知道你的游戏是什么,但 60fps 可能是 Swing 的上限。

我建议您学习游戏用JavaFX,因为它使用硬件加速进行渲染,并且可以处理相对复杂的应用程序120fps+。它还提供TimelineAnimationTimer游戏循环设计类。

关于java - 简单的 Java 游戏循环的 CPU 使用率非常高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com