Замедление рендеринга графики в Java - PullRequest
0 голосов
/ 23 мая 2018

Когда я запускаю код ниже начальной позиции x и y и конечной позиции x и y рендеринга.Я хочу, чтобы каждая позиция x и y отображалась при запуске тикового метода и меняла значения x и y по скорости.По сути, я хочу иметь возможность контролировать скорость движения объекта.

public void render(Graphics g) {
           g.drawImage(JamesTexture.james, x, y, width, height, null);
    }

    public void tick() {

        if (run) {
            if (!stop) {

                    int z = Maze.fx.size() - 1;
                    int i = 1;// speed
                    xx = getPathX(z);
                    yy = getPathY(z);

                    while (z > 0) {

                        if (xx > (getPathX(z - 1))) {
                            xx = xx - i;
                            x = xx;
                            if (xx < (getPathX(z - 1))) {
                                xx = (getPathX(z - 1));
                            }
                        } else if (xx < (getPathX(z - 1))) {
                            xx = xx + i;
                            x = xx;
                            if (xx > (getPathX(z - 1))) {
                                xx = (getPathX(z - 1));
                            }
                        } else if (yy > (getPathY(z - 1))) {
                            yy = yy - i;
                            y = yy;
                            if (yy < (getPathY(z - 1))) {
                                yy = (getPathY(z - 1));
                            }
                        } else if (yy < (getPathY(z - 1))) {
                            yy = yy + i;
                            y = yy;
                            if (yy < (getPathY(z - 1))) {
                                yy = (getPathY(z - 1));
                            }
                        } else {

                            z--;
                            stop = true;                        }
                    }
                }
            }
        }
    }

    int getPathX(int z) {
        List<Integer> fx = Maze.fx;
        z = fx.get(z);
        return z * 32;
    }

    int getPathY(int z) {
        List<Integer> fy = Maze.fy;
        z = fy.get(z);
        return z * 32;
    }

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Я знаю, что это, вероятно, слишком много, но класс Thread имеет метод .sleep, который принимает нано секунды в качестве параметров. Поток (и, следовательно, программа, я думаю) остановится на заданный промежуток времени

0 голосов
/ 24 мая 2018

Не существует идеального способа справиться с этим, потому что вы никогда не сможете точно «предсказать», сколько времени будет потрачено, пока изображение, которое вы отображаете, на самом деле не отобразится.Что вы можете сделать, это измерить время, прошедшее между предыдущим и текущим тиками.

delta time = current tick time - last tick time

Это дает вам фактическое время дельты , которое прошло.Итак, как вы получаете время тика?Я считаю, что в Java классы Clock, System и Timer предоставляют различные функции, каждая из которых имеет разную точность и детальность.Как правило, некоторые из этих функций зависят от аппаратных часов, некоторые могут быть прерваны различными программными и аппаратными событиями, некоторые испытывают проблемы, когда переключение контекста происходит с несколькими аппаратными ядрами, некоторые могут даже запускаться задом наперед. Это зоопарк, и вам нужно прочитатьДокументы внимательно, чтобы понять, что вы на самом деле измеряете.Однако, как правило, точность в миллисекундах вполне достаточна для большинства приложений.Например, это дает вам время в секундах (как удвоение с достаточной точностью для миллисекундных диапазонов).

double stime = System.currentTimeMillis();

Скорость обычно выражается в виде расстояния на единицу времени, например

meters per second (m / s)

Затем вы можете рассчитать расстояние, на которое объект должен пройти, умножив прошедшее время на скорость дельты.

delta object movement = delta elapsed time * speed

Если вы хотите замедлить движение ваших объектов, вы уменьшите скорость.

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

0 голосов
/ 23 мая 2018

Просто предложение, поскольку я пока не могу комментировать, но, возможно, ваш цикл while завершает весь лабиринт за один вызов.Я думаю, что нам понадобится больше вашего кода, чтобы быть уверенным, но попробуйте добавить оператор break в конце каждого if в вашем цикле while, например:

if (xx > (getPathX(z - 1))) {
    xx = xx - i;
    x = xx;
    if (xx < (getPathX(z - 1))) {
        xx = (getPathX(z - 1));
    }

    break;
}

Проверьте, исправляет ли это.Конечно, это зависит от скорости, с которой вызывается функция tick () .

...