Почему этот геймпул отстает? - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в Java и пытался написать собственный маленький геймплей

package com.luap555.main;

import java.awt.Graphics;
import java.awt.image.BufferStrategy;

import javax.swing.Timer;

public class Game implements Runnable{

private Window window;
public int width, height;
public String title;

private boolean running = false;
private Thread thread;

private BufferStrategy bs;
private Graphics g;

private int fps = 60;
private long lastTime;
private long now;
private long delta;
private long timer;
private long ticks;
private boolean initialized = false;

public Game(String title, int width, int height) {
    this.title = title;
    this.width = width;
    this.height = height;

}

private void init() {
    window = new Window(title, width, height);
    Assets.init();
    System.out.println("Initializing finished");
    initialized = true;
}

private int x = 0;

private void tick() {
        x += 1;

}

private void render() {
    bs = window.getCanvas().getBufferStrategy();
    if(bs == null) {
        window.getCanvas().createBufferStrategy(3);
        return;
    }
    g = bs.getDrawGraphics();

    g.clearRect(0, 0, width, height);

    g.drawImage(Assets.unten, 0 + x, 0, 700, 350, null);

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

private void runtick() {
        lastTime = System.currentTimeMillis();

        tick();

        now = System.currentTimeMillis();
        delta += now - lastTime;

        try {
            Thread.sleep((delta + 1000) / fps);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        delta -= now - lastTime;
}

private void runrender() {
    render();
}

@Override
public void run() {
    init();

    if(initialized) {
        while(running) {
            runtick();
            runrender();
        }
    }

    stop();

}

public synchronized void start() {
    if(running)
        return;
    running = true;
    thread = new Thread(this);
    thread.start();

}

public synchronized void stop() {
    if(!running)
        return;
    running = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

В моем основном методе я вызываю метод game.start (). Но всякий раз, когда я запускаю этот код, движение изображения довольно запаздывает. Я двигаюсь довольно плавно, но после каждой секунды или около того появляются некоторые лаги. Я думаю, что проблемы в методе "runtick ()". Кто-нибудь знает, почему это происходит? Я надеюсь, что некоторые из вас могут мне помочь; D

1 Ответ

0 голосов
/ 05 ноября 2018

Вы увеличиваете время ожидания игры в зависимости от того, сколько времени занимает игровая логика. То, что вы хотите сделать, это уменьшить сон в зависимости от того, сколько времени занимает игровая логика.

Вы также захотите включить время рендеринга в свои расчеты (во многих играх оно может быстро стать больше, чем время логики игры). Попробуйте что-то вроде этого:

long delta, end, start = System.currentTimeMillis();
while (running) {
    runtick();
    runrender();

    end = System.currentTimeMillis();
    delta = (end - start);
    Thread.sleep((1000 / fps) - delta);
    start = end;
}

Если вы когда-нибудь обнаружите, что delta становится больше, чем интервал между тиками (1000 / fps), вам следует записать в журнал некоторые предупреждения, и для смягчения вы можете запустить несколько тиков игровой логики на один тик рендеринга, чтобы позволить игровой логике догнать анимация.

...