2013-02-11 22 views
2

我一直在Java 2D遊戲一小會兒。它是一個具有像素陣列(整數)的光柵圖形系統。像素陣列太強的CPU

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

我然後分別創建一個整數數組,與屏幕的對象操縱它(從外部圖像文件,例如.png渲染),則該數組複製到我的主要一種,是指投影在屏幕上。我發現在迭代中使用數組複製方法沒有性能差異(實際上並不期望)。無論如何,圖形渲染效果很好,遊戲也會順利進行。

然而,我發現這是非常CPU密集型。我的活動監視器說應用程序使用了超過100%的CPU。這顯然是因爲我每遍更新一次像素數組(76k整數)(每秒60次)。

我選擇了這個技術用於教育目的。這是一個個人項目,我只是想深入瞭解Java圖形。我決不會嫁給這種渲染技術。

我的問題有三個相關部分...

  1. 顯然有更好的方法來做到這一點。什麼庫/框架會做得更好?
  2. 這些庫基本上會以更高效的方式執行相同的操作(循環遍歷像素)嗎?
  3. 有沒有一種方法可以在不使用外部工具的情況下優化這種技術,還是它不值得嗎?
+2

您是否想過使用OpenGL?如果你想像素做點什麼,你可以渲染成一個紋理,但這隻會做一次,並且你可以在其他每一幀中重複使用這個紋理。 – fiz 2013-02-11 23:33:09

+0

我對OpenGL沒有任何經驗,主要是因爲我的印象是它與我的系統(二維和外部圖像文件呈現)配合不佳。我將研究OpenGL紋理。 – MattDavBen 2013-02-11 23:35:33

+2

這真的取決於你如何處理你的圖像加載,但是一旦你把它變成一個類似RGB的數組,你可以在紋理上使用它。你也可以使用建立在OpenGL之上的許多庫中的一個,它們可以自己加載圖像。 – fiz 2013-02-11 23:39:52

回答

6
的OpenGL

是最經常與3D圖形應用程序相關聯的,但它也可用於二維應用。使用正交投影和紋理四邊形代替精靈和背景圖像,您可以構建絕對沒有3D元素的遊戲的圖形和界面,儘管事實上正在完成繪圖,從某種意義上說, 3D。

我在Java中使用OpenGL的沒有經驗。但是,我知道可以使用LWJGL庫和其他可能的庫。如果你想大幅度提高你的圖形性能,你應該檢查一下。

要回答你的第二個問題,OpenGL的這個應用程序實際上從你的方法效果非常不同,使用它會用它來繪製3D紋理的多邊形,而不是簡單的塊傳輸圖像到幀緩存相同的技術,雖然像素數據被訪問和操縱。

下面是使用OpenGL與C,從一個遊戲項目,我從來沒有完成2D圖形的一個例子,但仍然可以作爲什麼我談論的一個很好的視覺例子。在這種情況下,我沒有使用正交投影,而是使用透視矩陣通過在3D空間中的不同深度繪製各種圖層來獲得視差效果。

an example of 2D graphics using OpenGL