【问题标题】:Slow down rendering graphics in java在java中减慢渲染图形
【发布时间】:2018-11-02 19:52:06
【问题描述】:

当我在 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;
    }

【问题讨论】:

  • 您需要使用定时器,这样每次定时器触发时,您都会根据新位置重新绘制场景。
  • 这个 GUI 是否使用 Swing、AWT、..crayons 来制作 GUI?

标签: java graphics render


【解决方案1】:

没有完美的方法来处理这个问题,因为您永远无法准确“预测”在您正在渲染的图像实际显示之前将花费多少时间。您可以做的是测量上一个刻度和当前刻度之间经过的时间。

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 个刻度之间的增量,但当然您可以使用不同的预测方案如果您以不规则的时间间隔进行大量处理,请尝试预测减速。获得可预测的帧速率是制作优秀游戏仍然难以做到的原因。

【讨论】:

    【解决方案2】:

    我知道它可能已经结束了,但是 Thread 类有一个 .sleep 方法,它需要纳秒作为参数 线程(以及我认为的程序)将停止给定的时间

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 调用 get 函数通过传递一个表示适当索引的 int 来遍历数组。如果我在 while 循环中打印 x 和 y 值,则 x 和 y 值确实会受到影响。但是,如果我在渲染方法中打印 x 和 y 值,我只会得到开始的 x 和 y 值以及最终的 x 和 y 值,即迷宫的结束。
      • 您可以将该输出添加到您的问题中吗?最好让哪个 x 和 y 来自 render 方法以及哪个来自 tick 方法是可见的。
      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2014-04-20
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多