繁体   English   中英

减慢Java中的渲染图形

[英]Slow down rendering graphics in java

当我在x和y的起始位置以及x和y的最终位置下方运行代码时,将渲染。 我希望当tick方法运行并通过速度更改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;
    }

我还不能发表评论,这只是一个建议,但这可能是您的while循环在一个调用中完成了整个迷宫。 我认为我们需要更多的代码来确定,但是尝试在while循环的每个 if语句的末尾添加一个break语句,如下所示:

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

    break;
}

检查是否可以解决。 当然,这取决于调用tick()函数的速度。

我知道它可能已经被杀死了,但是Thread类有一个.sleep方法,该方法以纳秒为参数。

没有完美的方法来处理此问题,因为您永远无法准确地“预测”要实际显示要渲染的图像之前要花费多少时间。 您可以做的是测量从前一个滴答声到当前滴答声之间经过的时间。

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

如果要减慢对象的运动,可以降低速度。

如果您的系统帧率非常“稳定”(并且大多数情况下是使用标准的双缓冲),则在最后两个刻之间可以有一个增量,但是您当然可以使用不同的预测方案来尝试如果您以不规则的时间间隔进行大量处理,则可以预期速度会变慢。 要获得可预测的帧速率,就是制作优质游戏仍然很困难的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM