2013-08-03 62 views
0

我正在創建一個簡單的寵物模擬器,它是我爲一個任務創建的第一個項目。大部分功能運行正常,我已經多次重寫了它,因爲我已經更好地完成了項目設置,但是在添加定時器的過程中,我遇到了很大的問題。隨着時間的推移,幀率/性能下降

運行該項目後,我的遊戲似乎工作正常,圖像正在渲染(也許不是最有效的),我的計時器/ FPS計數器運行良好。然而,自從我添加了這個時序/ FPS代碼後,它在FPS中慢慢變慢,然後凍結並崩潰。

我跟着Ninja Cave的LWJGL計時教程。 http://ninjacave.com/lwjglbasics4

這裏是我的源代碼,並不是所有的類都包含在內,因爲有很多,但如果需要的話可以。我試圖只包括渲染集中的。

主類 http://pastebin.com/BpkHHnnj

渲染類 http://pastebin.com/QtJeYw1a

紋理裝載器類 http://pastebin.com/RX5iDXQm

主要遊戲狀態類 http://pastebin.com/pvgDLkeM

的寵物類 http://pastebin.com/VF6cq9S4

感謝

+0

您需要分析您的應用程序以確定瓶頸位置。 [這裏是概要分析概述](http://stackoverflow.com/a/2425217/1827903) –

回答

1

我目前正在對固定您的問題,但你的renderer.readyTexture()只是旋轉瘋狂失控,並且基本上是泄漏內存,並快速,這也解釋了在速度的下降。

編輯:我得到了穩定的內存使用。

添加public Map<String, Texture> loadedTextures = new HashMap<String, Texture>();renderer類render.java和改變你的renderer.readyTexture()方法是:

public void readyTexture(String textureDir){ 
     if (!loadedTextures.containsKey(textureDir) || loadedTextures.get(textureDir) == null) { 
      texture = lt.loadTexture(textureDir); 
      loadedTextures.put(textureDir, texture); 
     } else { 
      texture = loadedTextures.get(textureDir); 
     } 

     textureDirString = textureDir; 
     texture.bind(); 
     texLoaded = true; 
     System.out.println("Loaded: " + textureDirString); 
    } 

現在,你的代碼中,Map/HashMap存儲已經加載的紋理。在renderer.readyTexture()方法中,我檢查Map是否不包含密鑰textureDir,如果有,我檢查它是否爲空。如果條目不在Map或包含的Texturenull,我們加載紋理並將其存儲在地圖中。如果紋理被存儲,我們將它從Map中取出並綁定它。

之前,你每次都在加載圖像,而垃圾收集器是而不是刪除它,這可能是一個問題,但如果緩存一切正常,它工作得很好。

我希望這會有所幫助。

+0

+1,用於更好的資源管理。因此,在重複創建大量短暫對象時也會發生這種情況。 – MadProgrammer

+0

這背後的原因不是Slicks故障 - Slick每次都會將新紋理加載到內存中。這正是你所要求的。 您需要一個能夠智能加載的資源管理器,並且可以巧妙地卸載。 –

+0

Robbie,你解決了它:)。幾天前,我試着重複地修復紋理的加載,但當它不起作用時就忘了它。感謝有關Maps和HashMaps的這些知識,更多閱讀材料:)他們看起來非常有用。 – Anim8

相關問題