私はJavaで2Dゲームを作成し、1920x1080ピクセルの解像度で60fpsにしようとしています。私のゲームロジックは1ミリ秒未満で正常に動作しています。しかし、描画には10ミリ秒以上かかる。これは私のかなり強いデスクトップ(intel i5-4670K @ 3.40 Ghz)で十分かもしれませんが、私のラップトップ(intel i5-6300HQ @ 2.30 Ghz)ではゲームはすでにかなり減速しています。図面は、2つの主要な段階に分かれています。Java 2Dゲームの描画パフォーマンス
は、ゲームのすべてのコンポーネントを描くのBufferedImage
に対応するコードはこれです、私の拡張のJPanelクラスで
をBufferedImageを描きます:
@Override
public void run() {
init();
long startTime;
long elapsedTime;
long waitTime;
while(running) {
startTime = System.nanoTime();
update();
long updateTime = (System.nanoTime() - startTime)/1000000;
draw();
long drawTime = (System.nanoTime() - startTime)/1000000;
drawToScreen();
long drawscreenTime = (System.nanoTime() - startTime)/1000000;
elapsedTime = System.nanoTime() - startTime;
waitTime = targetTime - elapsedTime/1000000;
if(waitTime < 0) {
waitTime = 0;
}
try {
Thread.sleep(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void init() {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
GraphicsConfiguration config = device.getDefaultConfiguration();
image = config.createCompatibleImage(1920, 1080, Transparency.TRANSLUCENT);
g2d = (Graphics2D) image.getGraphics();
running = true;
gsm = new GameStateManager(this);
}
public void update() {
gsm.update();
Keys.update();
}
public void draw() {
gsm.draw(g2d);
}
public void drawToScreen() {
Graphics g = getGraphics();
g.drawImage(image, 0, startDrawY, scaledWidth, scaledHeight, null);
g.dispose();
}
drawとscreenToScreenメソッドの両方が使用されます。 ~5ミリ秒。 描画方法の中で最も遅い部分は、背景画像(1920x1080画像)を描画しており、数ミリ秒かかるレベル(複数の135x135画像からなる)を描画しています。
今私は2つの質問があります:このような大きな画像の場合、この描画速度は普通ですか?ここで間違っているのではないか、または描画パフォーマンスを改善するにはどうすればよいですか?
Graphics2D extemds Graphics。 Graphics2Dをinit()に保存しています。なぜdrawToScreen()に別のGraphicsを作成するのではなく、g2dを使うのですか? – Dakoda
効率的にレンダリングする2Dゲームを作成するには、libGDX(またはJava OpenGL実装(LWJGL)を拡張するもの)などのライブラリを調べる必要があります。 OpenGLは効率的なグラフィックスパイプラインを使用して2Dと3Dでレンダリングします –