簡體   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