2

私は Java を学んでいて、最初のレッスン/プロジェクトを始めています。このプロジェクトでは、先生のピクセルが画面と安定したクリップを横切って移動し、ほんの数秒で画面全体を移動します。私の場合は数分かかり、5 秒ごとに 1 ピクセルしか移動しません。私は、MacBook Pro の方が Java グラフィックスをよりうまく処理できると思っていたでしょう。それが私のコードなのかユニットなのかを確認するために、Windows で起動した状態でプロジェクトをゼロから再構築したところ、パフォーマンスが著しく改善されました。そこでは、カーソルは 1 秒に 1 ~ 2 ピクセル移動します。まだインストラクターほどではありませんが、OSX が処理するよりは優れています。これは正常なのか、予想どおりなのか疑問に思っています。OSX は、Java グラフィックスを処理するのに時間がかかりますか? この質問に答えるのに役立つ場合は、コードをリンクしました。OSXでの動きの遅いピクセルとひどいフレームレートのビデオ。Frapsは、Windowsで平均650 fpsを取得していることを示しています.OSX側のコード出力は、他のビデオプロセスが進行しているかどうかに応じて、40〜60程度であることを示しています. ビデオでは 45 前後ですが、これはスクリーン キャプチャによって平均 60 fps から遅くなるためです。

OSX でのフレームレートの例: https://www.youtube.com/watch?v=PQ0-L4slgP4

Screen クラスのコード: http://pastebin.com/3ETKsY8r

Game クラスのコード: http://pastebin.com/NDreVB60

Apple 側では 10.7.5 未満の Eclipse Juno を使用し、Bootcamp 側では Windows 7 を使用しています。MacBook には 4GB のメモリと 2.53 GHz Intel Core 2 Duo が搭載されています。

4

1 に答える 1

1

あなたのコード サンプルを MacBookPro で実行したところ、投稿したビデオよりもはるかに優れた結果が得られました。

現在、私はJava 2Dグラフィックスの専門家ではありませんが、ピクセルが移動するようにキャンバス全体を何度も何度も再描画する必要があるため、レンダリングプロセスに含まれるロジックは高速である必要があるという観察結果があります。また、ピクセルが斜めに移動しているため、右側の大きな領域は例には役に立たないため、JFrame を正方形にすることをお勧めします。これにより、再描画する領域が少なくなります。

最後に、Screen クラスのコードにいくつかの変更を加えて、処理を高速化しました。

package com.oblivion.rain.graphics;

public class Screen {
    // Height was removed since there is no use for it
    private int width;
    public int[] pixels;

    int time = 0;
    int counter = 0;

    // We need this in order to avoid the iteration in the clear method.
    int previousPixel = 0;

    public Screen(int width, int height) {
        this.width = width;
        pixels = new int[width * height]; // 50,400
    }

    public void clear() {
        // In case the frame is a rectangle, the previousPixel
        // could hold a value that is greater than the array size
        // resulting in ArrayOutOfBoundsException
        if (previousPixel < pixels.length) {
            pixels[previousPixel] = 0;
        }
    }

    public void render() {
        counter++;

        if (counter % 100 == 0) {
            time++;
        }

        // Calculate the previousPixel index for use in the clear method
        previousPixel = time + (time * width);


        // Make sure we didn't exceed the array length, then set the 
        // array data at the calculated index
        if (previousPixel < pixels.length) {
            pixels[previousPixel] = 0xff00ff;
        }
    }
}
于 2012-12-17T14:16:29.853 に答える