1

私はゲームプログラミングの比較的初心者です。BufferedImageを使用してピクセルを描画する方法を知っていますsetPixel()。大きなフォーマットでは恐ろしく遅いので、先に進んで見つけましVolatileImageた(1週間ほどかかりました)。線、文字列、四角形などを描くのはかなり簡単ですが、個々のピクセルを描くことはできません。すでに使用してみdrawLine(x,y,x,y)ましたが、800x600 の画像で 3 ~ 4 FPS が得られます。setPixel()Java にまたはsetRGB()が含まれていなかったという事実はVolatileImage、私をかなり怒らせ、混乱させます。

4 つの質問があります。

  1. VolatileImage に個々のピクセルを描画する方法はありますか? (FPS > 40 の 1440x900 フォーマット)

  2. より高速な方法で BufferedImage にピクセルを描画できますか? (同じ 1440x900、FPS > 40)

  3. 3D ゲームに十分な速度でピクセルを描画する他の方法はありますか?

  4. BufferedImage ハードウェアを高速化できますか (使用しようとしsetAccelerationPriority(1F)ましたが、動作しません)

何かアイデアがあれば教えてください。この情報がなければゲームを作り続けることはできません。3D レンダリング アルゴリズムは既に作成しましたが、高速なピクセルを描画できるようにする必要があります。私はこのゲームについて良い感触を持っています。

あなたが私を助けるのを助けることができるならば、これはコードです:

public static void drawImageRendered (int x, int y, int w, int h) { // This is just a method to test the performance

    int a[] = new int[3]; // The array containing R, G and B value for each pixel
    bImg = Launcher.contObj.getGraphicsConfiguration().createCompatibleImage(800, 600); // Creates a compatible image for the JPanel object i am working with (800x600)
    bImg.setAccelerationPriority(1F); // I am trying to get this image accelerated
    WritableRaster wr = bImg.getRaster(); // The image's writable raster
    for (int i = 0; i < bImg.getWidth(); i++) {
        for (int j = 0; j < bImg.getHeight(); j++) {
            a[0] = i % 256;
            a[2] = j % 256;
            a[1] = (j * i) % 256;
            wr.setPixel(i, j, a); // Sets the pixels (You get a nice pattern)
        }
    }
    g.drawImage(bImg, x, y, w, h, null);
}

私は、 OpenGLやその他の外部ライブラリを使用せず、単純な Java だけを使用したいと考えています。

4

2 に答える 2

1

基本的に、CPU を使用してピクセルを次々と描画しています。これを高速化する方法はありません。したがって、そのようなメソッドは VolatileImage に対してまったく意味がありません。取得した低い FPS は、各ピクセル描画操作が (位置や色などの情報と共に) グラフィックス カードに送信されるため、かなりのオーバーヘッドを引き起こしていることを示唆しています。これは、3 バイトまたは 4 バイトの RAM を変更するよりも時間がかかります。

各ピクセルを個別に描画するのをやめるか、描画アルゴリズムをグラフィックカードで直接実行する方法を見つけることをお勧めします (これには、おそらく Java 以外の言語が必要です)。

于 2013-10-13T16:29:41.970 に答える