SORU
13 EKİM 2008, PAZARTESİ


Java2D Performans Sorunları

Java2D ile performans tuhaflıklar yaşıyorum. Güneşin biliyorum.java2d.opengl VM bazı garip sorunları var 2D, ancak bu bile kullanmak için 3D hızlandırma etkinleştirmek için parametre.

İşte koştum test sonuçları:

Bir 25x18 çizim bir JComponent üzerinde 32 x 32 piksel fayans ile göster
Resim 1 = .bmp formatında, 2 = Bir Resim .png biçimi

-Dsun.java2d.=gerçek opengl

120 FPS kullanarak .BMP resim 1
13 kullanarak FPS .PNG resim 2

-Dsun.java2d.=gerçek opengl

12 FPS kullanarak .BMP resim 1
700 FPS kullanarak .PNG resim 2

İvme olmadan, dönüşüm falan her drawımage ile gerçekleşiyor varsayıyorum() yazılım yapıyorum ve FPS durumda önemli olan aşağı çekiyor .PNG. Neden olsa da, ivme, sonuçları değiştirirdi (PNG ve gerçekten inanılmaz hızlı yapar)?! Delilik!

.BMP Resim 1 TYPE_İNT_RGB görüntü türüne çevrilir. .PNG Resim 2 TYPE_CUSTOM görüntü türüne çevrilir. Opengl olmadan ve tutarlı hız almak için, TYPE_İNT_ARGB ve 1 Resim çizmek ya da bu yeni görüntü 2 görüntü tipi ile yeni bir Bufferedİmage oluşturmak zorunda.

Burada çalışan: sonuçları

-Dsun.java2d.=gerçek opengl

120 FPS kullanarak .BMP resim 1
120 FPS kullanarak .PNG resim 2

-Dsun.java2d.=gerçek opengl

700 FPS kullanarak .BMP resim 1
700 FPS kullanarak .PNG resim 2

Asıl sorum şu, TYPE_İNT_ARGB tüm sistemler ve platformlar için yerel görüntü türü olacağını farz edebilir miyim? Bu değer farklı olabilir sanıyorum. Bana her zaman maksimum performans için yeni Bufferedİmages yaratabilirim, böylece yerel değeri elde etmek için bir yol var mı?

Şimdiden teşekkürler...

CEVAP
13 EKİM 2008, PAZARTESİ


Araştırma ve çok fazla Google aramaları birlikte parçaları koyarak bir çözüm buldum.

Burada, yorum ve tüm:

private BufferedImage toCompatibleImage(BufferedImage image)
{
	// obtain the current system graphical settings
	GraphicsConfiguration gfx_config = GraphicsEnvironment.
		getLocalGraphicsEnvironment().getDefaultScreenDevice().
		getDefaultConfiguration();

	/*
	 * if image is already compatible and optimized for current system 
	 * settings, simply return it
	 */
	if (image.getColorModel().equals(gfx_config.getColorModel()))
		return image;

	// image is not optimized, so create a new image that is
	BufferedImage new_image = gfx_config.createCompatibleImage(
			image.getWidth(), image.getHeight(), image.getTransparency());

	// get the graphics context of the new image to draw the old image on
	Graphics2D g2d = (Graphics2D) new_image.getGraphics();

	// actually draw the image and dispose of context no longer needed
	g2d.drawImage(image, 0, 0, null);
	g2d.dispose();

	// return the new optimized image
	return new_image; 
}

Benim önceki sonrası, GraphicsConfiguration gerekli bilgileri tutan şeyin bir sistem optimize görüntüler oluşturmak için. Oldukça iyi iş gibi görünüyor, ama Java sizin için otomatik olarak bunu beklerdim. Açıkçası Java ile çok rahat edersin. :) Kendi soruma cevap buldum sanırım. Oh iyi, umarım gördüm bazılarınız 2D oyunlar için bir Java kullanmak için çalışırken yardımcı olur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • graham025

    graham025

    25 NİSAN 2006
  • TheFlashCentre

    TheFlashCent

    22 Mayıs 2008
  • thenewboston

    thenewboston

    4 ŞUBAT 2008