2010-08-02 27 views
8

我試圖決定是否主要在我的應用程序(大部分是C++)中使用所有3D相關元素的浮點數或整數。據我所知,大多數基於ARM的設備都沒有硬件浮點支持,所以我認爲任何使用浮動的繁重工作都會明顯變慢。然而,我打算準備大部分數據(即,在適用的地方使用頂點緩衝區,並且使用不會改變的矩陣進行變換),所以我只是將數據填入OpenGL的喉嚨。我可以假設這或多或少直接對GPU,並且因此會相當快? (順便說一下,最低要求是OpenGL ES 2.0,所以大概不包括舊的基於1.x的手機。)Android NDK OpenGL應用的浮點或定點?

另外 - 當我混合匹配整數和浮點數時,懲罰如何?假設我所有的幾何體都是預構建的浮點緩衝區,但是我使用矩陣的整數,因爲這些都需要像矩陣乘法這樣的昂貴操作,那麼我會在這裏產生多少憤怒?

順便說一句,我知道我應該保持低了我的預期(聽起來甚至要求花車CPU上的要求太高),但有任何類似於128位寄存器VMX?

(我暗暗希望法登在讀這個問題,並有一個真棒答案。)像G1和的myTouch

回答

14

較早的Android設備都沒有浮點支持的ARMv6的CPU。大多數較新的設備,如Droid,Nexus One和Incredible,都使用具有FP硬件的ARMv7-A CPU。如果您的遊戲真的是3D密集型遊戲,那麼3D實現可能需要更多的舊設備才能提供,因此您需要確定要支持的硬件級別。

如果您在Java代碼完全,您的應用程序將採取FP硬件的優勢時可用。如果你使用NDK編寫本地代碼,並選擇armv5te體系結構,則根本不會獲得硬件FP。如果您選擇armv7-a體系結構,那麼您的應用將無法在ARMv7-A之前的設備上使用。從Java

的OpenGL現在應該坐在「直接」字節的緩衝區的頂部,這是目前緩慢的從Java訪問,但速度非常快,從本機端。 (雖然我對GL的實現瞭解不多,但我不能提供太多的東西)。

某些設備還支持NEON「高級SIMD」擴展,它提供了超出基本功能的一些奇特功能VFP支持。但是,如果你想使用它,你必須在運行時測試它(看起來現在有這樣的示例代碼 - 請參閱NDK r4b的NDK page)。

較早的回答是否有「硬」 FP使用的NDK一些info about the gcc標誌。

最終,回答「固定或浮動」歸結到你希望你的應用程序上運行什麼類的設備。爲armv7-a編寫代碼肯定更容易,但是你從一塊市場上削減了自己。

+1

我知道法登有這個答案。我希望我可以多投一票:)我已經限制自己使用OpenGL ES 2.0,所以我可以編寫頂點和片段着色器,所以我想我可能會一路走下去並需要ARMv7(這可能會交到手)。我寧願吸引更多的小用戶羣,擁有一個漂亮的應用程序,而不是向羣衆扔垃圾。他們現在也停止爲PlayStation 1製作遊戲。 – EboMike 2010-08-02 23:05:43

+1

然後你應該在ARMv7上進行浮動。它不與OpenGL ES 2.0齊頭並進,但它近在咫尺 – ognian 2010-08-03 06:33:00

+0

看來,大多數新手機都具有OpenGL ES 2.0。但是,我觀察了基準分數,例如AnTuTu基準,並發現許多較低價格的模型沒有FPU。 – 2011-08-25 07:27:16

5

在我看來,你應該堅持儘可能的定點。

不僅舊手機錯過浮點支持,而且新的如HTC野火。另外,如果您選擇要求ARMv7,請注意,例如摩托羅拉Milestone(Droid for Europe)確實具有ARMv7 CPU,但由於Android 2.1已針對此設備構建,因此設備不會使用你的armeabi-v7a庫(並可能將你的應用從市場上隱藏起來)。

我個人通過使用NDK r4b提供的新的cpufeatures library檢測ARMv7支持來使用dlopen()來加載一些armeabi-v7a lib。