私はゲームデザインの原則を学び、多くのチュートリアルの助けを借りてこのゲームループをJavaで作っています。 、それは十分に動作し、私はそれが着実60 FPSで動作して取得することができシンプルなJava Game LoopでCPU使用率が非常に高い
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();
}
}
}
唯一の問題は、それが食べるである:それは今ないすべてはJFrameのへの草のタイルをレンダリングしています非常に多くのCPU。平均して約50%のCPUを使用し、残りのコンピュータは減速します.Minecraftはノートパソコンでほぼ同じように使用します。私は、上記のコードで問題がゲームループにあるという事実を知っています。
だから私はこれが起こる原因を理解しようとしています。私はプロファイラを使用しようとしましたが、私はまだ問題を引き起こしていたものを解決できませんでした。
ループは常にrender()を呼び出す必要があるかどうかを調べるために実行されます。これはポーリングと呼ばれ、通常は悪い考えです。タイマーを使用してrender()を呼び出してみてください。 – James
また、JavaFXはハードウェアアクセラレーションを使用しているため、ゲーム開発に適しているため、JavaFXを調べることをお勧めします。また、[AnimationTimer](https://docs.oracle.com/javase/8/javafx/api/javafx/animation/AnimationTimer.html)や[タイムライン](https://docs.oracle.com)のようなクラスもあります。 /javase/8/javafx/api/javafx/animation/Timeline.html)、これはgameloopの管理を非常に簡単にします。 – Jhonny007