Лаги в игровом цикле - PullRequest
       31

Лаги в игровом цикле

0 голосов
/ 18 января 2019

Это код моей игровой петли:

public void run() {
    running = true;

    boolean renderCheck = false;
    double firstTime = 0;
    double lastTime = System.nanoTime() / 1000000000.0;
    double passedTime = 0;
    double unprocessedTime = 0;

    double frameTime = 0;
    int frames = 0;
    int fps = 0;

    while (running) {
        firstTime = System.nanoTime() / 1000000000.0;
        passedTime = firstTime - lastTime;
        lastTime = firstTime;

        unprocessedTime += passedTime;
        frameTime += passedTime;

        while (unprocessedTime >= UPDATE_CAP) {
            tick();
            unprocessedTime -= UPDATE_CAP;
            renderCheck = true;
        }

        if (frameTime >= 1.0) {
            frameTime = 0;
            fps = frames;
            frames = 0;
            System.out.println(fps);
        }

        if (renderCheck) {
            render();
            frames++;
            renderCheck = false;
        } else {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Это зона рендеринга:

private void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        this.createBufferStrategy(3);
        return;
    }

    Graphics graphics = bs.getDrawGraphics();

    graphics.setColor(Color.black);
    graphics.fillRect(0, 0, WIDTH, HEIGHT);

    handler.render(graphics);

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

А вот и часть галочки (нет необходимости показывать другой код для обработчика, потому что онБуду так много читать):

private void tick() {
    handler.tick();
}

Так что главная проблема в следующем.Когда я нажимаю кнопку, мой персонаж начинает двигаться.И, на самом деле, это так, но с некоторыми задержками, которые делают этот процесс ужасным.Через секунду все идет отлично.(Я уже проверил загрузку процессора - все идет нормально)

Эта проблема возникает только на Linux-ПК.Я проверил это на Windows 10 в формате exe, и все работало нормально!Это немного странно.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Итак, наконец-то я нашел решение для исправления этой проблемы!

Просто установите системные свойства в java2d в вашем методе static main, написав этот код:

public static void main(String argsp[]) {
    System.setProperty("sun.java2d.opengl", "true");
    new Game();
}
0 голосов
/ 18 января 2019

Эта ленивая инициализация может быть вашей проблемой :

private void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        this.createBufferStrategy(3);
        return;
    }
    ...

Считаете ли вы, что при первом вызове вашей функции render() getBufferStrategy() вернет null, после чего

  • сначала вы его создадите (это нормально)

  • затем вернитесь без каких-либо действий (это подозрительно)

Последующие вызовы рендеринга фактически будут выполнять рендеринг ... позже. Если вы точно знаете, что вам понадобится это bufferStrategy, то имеет смысл создать его сразу же при инициализации вашей системы.

...