2010-08-09 58 views
3

這是一個普遍的Java問題,但在這種特殊情況下,我在Android中使用Vertex Arrays for OpenGL。要使用這個基本的GL系統,您必須以本地分配模式使用Java的緩衝區系統。這在Java上很慢。我整個應用程序的大約40-50%的時間都花在buffer.put()中。如何解決Buffer.put()和Android OpenGL的性能問題

有沒有什麼辦法可以在Java中保持速度(即不使用本地sdk)?

+0

你多久寫一次值?應該是你在啓動時忘記的事情。 – CaseyB 2010-08-16 19:20:11

+0

爲了解決Java持續破壞對象的GC踢的問題,我使用一個vertexbuffer來處理我的很多網格。由於我的程序中有很多網格,每個網格有一個對象會導致GC發瘋。 GC收集在較老的Android手機上非常緩慢。無論我在哪裏,當然,我都可以重複使用這些值。 – Moncader 2010-08-17 01:21:51

回答

0

避免一般分配。使用一個緩衝池並根據需要將它們混合在一起。您可以擁有一些標準尺寸並在最後浪費幾個字節來換取性能。另外,使用OpenGL時,通常不需要每幀都重寫緩衝區(除非進行大量的蒙皮或動畫?)。通常情況下,你有你預先烘焙的數組,使用矩陣變換對象,就是這樣。

+0

分配不是問題。我只在程序啓動時分配一次。這是分配緩衝區的更改(使用put()方法)很慢。 至於重寫緩衝區,我發現在Android上的Java有幾個緩衝區改變值比分配數百個單獨的緩衝區(由於內存消耗)要好。我正在使用一對緩衝區並根據需要更改它們中的值(可悲的是每一幀)。 – Moncader 2010-08-19 01:12:51

+0

這不是一個完整的答案,但它提供了嘗試避免此問題的最佳建議。所以我給了你賞金和回答(因爲它是有用的信息) – Moncader 2010-08-19 08:42:55

+0

謝謝!我唯一的另一個建議,是真正的「杜赫」風格,是要儘量避免每一幀改變數值?什麼在改變?你的網格變形了嗎?你可以在更改緩衝區和靜態緩衝區之間分開,並將所有更改的數據保存在這些緩衝區的同一區域內? (例如,所有的開始,例如) – EboMike 2010-08-19 14:19:02

0

你唯一能做的就是批量工作,並希望在手機中的實現體面,因爲懲罰來自鎖定和解鎖。如果您批量撥打電話,司機應鎖定並解鎖一次。如果你「自發地」這樣做,你會一直鎖定和解鎖,這會給你帶來巨大的性能。 如果驅動程序不夠聰明,只能將緩衝區映射到RAM而不是每次調用,那麼最好的辦法就是簡化放置數量。

+0

驅動程序與Java中的本機緩衝區有什麼關係?緩慢的部分不會將緩衝區上載到OpenGL內存中,而是實際的Java緩衝區本身。 – Moncader 2010-08-18 13:42:16

1

我遇到集成Java和JOGL當類似的問題 - 我的解決辦法是在C管理緩衝區資源,並使用JNI使用方法

jobject NewDirectByteBuffer(JNIEnv * env, void * address, jlong capacity); 

指針傳遞給緩衝區的Java在jni.h中找到。當您需要更新緩衝區中的偏移量時,請使用反射來手動修改java.nio.Buffer中的「地址」字段。如果添加更多元素會導致您超出C中緩衝區的容量,請使用C中的數組列表,並將直接緩衝區指向列表支持的數組。

+0

非常有趣的解決方案。不過,我想遠離任何本地編碼。但我會在後面記住這一點。 – Moncader 2010-08-19 08:40:52

相關問題