我一直在研究內存泄漏,我很困惑,爲什麼SpriteBatch.dispose()
應該被調用。我想,當你運行spriteBatch.begin()
和spriteBatch.end()
這將是足以防止內存泄漏和這樣。LibGDX:保留1個SpriteBatch的所有內容而不處置它有什麼危害?
回答
不,begin()
和end()
與dispose
方法有很大不同。
你說得對有關dispose
方法的行爲。
發佈此對象的所有資源。
begin()
和end()
用於設置渲染相關的Batch
,請注意,你可以有多個批次繪製。所有的批次調用必須在begin
和end
方法之間完成。他們與釋放記憶無關,所以如果你想這樣做,你需要做dispose()
。
SpriteBatch.end()
飾面關閉渲染。啓用深度寫入,禁用混合和紋理。
SpriteBatch.dispose()
實際釋放該對象的所有資源,並防止內存泄漏。
因此,使用SpriteBatch.end()
後,該項目可能會因你的代碼的其他方面保存在內存中,特別是如果你想稍後再重新使用它。所以在完成SpriteBatch的時候應該總是調用dispose,否則不能保證內存將被釋放。
因此,如果我不調用'dispose()',以前繪製的信息是否會增加? –
如果你重複使用相同的SpriteBatch,那麼它不會建立起來。但是如果你每次創建一個新的,那麼它可以建立起來。 – sorifiend
你肯定是不要想要處理它的每一幀或每end
後。它不會建立起來。一旦你完成了批次的使用,你想要處置它(這很可能是關閉應用程序或更改Screen
時)
一次性資源需要處置,但是在哪裏?
如果您建立
SpriteBatch
在create()
的ApplicationListener
方法,並使用它在不同的屏幕上的遊戲,處理他們ApplicationListener的dispose()
方法。不然,如果你在屏幕的
show()
方法生成並接着在屏幕的dispose()
方法處理,但處理方法不ApplicationListener或框架調用,所以你需要調用自己處理方法,以便調用從屏幕的hide()
方法處置方法。
begin()
和end()
方法是使用來實現的SpriteBatch
的目的:
要批量多精靈成一個單一的繪製調用,以便最小化每個繪製調用的相關聯的性能損失。
- 1. 使用varchar(x)有什麼危害?
- 2. 「無效實體」有什麼危害嗎?
- 3. 有一個很長的maxDelayTime有什麼危害?
- 4. 不應分配參數'foo' - 有什麼危害?
- 5. 有很多枚舉值會有什麼危害嗎? (many> = 1000)
- 6. CALayer爲什麼不保留其內容?
- 7. 字節碼操作的危害是什麼(如果有的話)?
- 8. 忽略警告的危害是什麼?
- 9. 如何將所有靜態內容保留在內容之下?
- 10. 爲什麼libgdx SpriteBatch/BitmapFont會破壞Texture.bind?
- 11. 保留所有內容到多行佈局的一個部分
- 12. 讓git分支「變老」有什麼危害嗎?
- 13. 編譯boost時,定義BOOST_DISABLE_ABI_HEADERS會有什麼危害?
- 14. Objective-C中屬性覆蓋有什麼危害?
- 15. 不能讓一個變量保留它的內容 - 織補它
- 16. 當在javascript中實例化一個新類時,不將它分配給一個變量有什麼危害?
- 17. 發佈前沒有保留危險嗎?
- 18. 沒有虛擬方法的虛擬析構函數有什麼危害嗎?
- 19. Libgdx |將黑色設置爲圓圈外的所有內容
- 20. Symfony2 - 保護所有內容
- 21. 在R中使用`-1L`而不是`-1`有沒有危險?
- 22. 在MySQL中爲varchar選擇一個大值會有什麼危害嗎?
- 23. 一個index.php處理所有內容
- 24. 管道的危害
- 25. 揮發物是否會保護我免受所有幕後多線程危害?
- 26. 如何釋放viewController保留的所有內容?
- 27. 刪除所有隻保留HTML的網頁文字內容?
- 28. 刪除mysql#1前的所有內容
- 29. Libgdx在紋理中保存SpriteBatch
- 30. 循環沒有處理所有內容
我想我會問你同樣的問題,我問sorifiend:如果我不打電話給dispose(),以前的抽獎信息是否會增加? –
在這裏所有的好答案,認爲你的問題得到解答。但是,如果你仍然有點不太常用,只需查看SpriteBatch的dispose()方法的代碼即可。儘管begin()和end()被一遍又一遍地用於渲染,但是dispose()會擺脫內部SpriteBatch用於渲染的內容(需要釋放的內部 - 網格和可能的Shader),一旦你不再需要用於渲染的SpriteBatch:@Override public void dispose(){mesh.dispose(); if(ownsShader && shader!= null)shader.dispose(); } –