2010-06-09 45 views
13

Android NDK ile oynamaya başladım. Yeni öğrendiğim şeylerden biri armv7 abi'yi belirtmek için bir application.mk dosyası oluşturmak.Android NDK ile donanım kayan nokta alma

Şu parametrelerle san-angeles örneğini yapıyorum.

APP_MODULES  := sanangeles 
APP_PROJECT_PATH := $(call my-dir)/../ 
APP_OPTIM  := release 
APP_ABI   := armeabi-v7a 

Ancak bu o (kötü yani) önceki gibi aynı hızda çalışacak gibi görünüyor. Ben sadece GL sınırlı ve CPU sınırlı değil ya da burada yanlış bir şey mi?

ben yayılan Aşağıdaki komut satırı seçenekleri almak derleme yaparken ben fark etmiş:

-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb 

"softfp" var Beni endişelendiren şey. V7 abi, VFP fpu şeyler bahseder ve "başparmak" "thumb-2" talimatları (Ben tam olarak ne olduğunu bilmiyorum rağmen) anlamına gelir tahmin ediyorum. Ancak "softfp" beni ilgilendiriyor. "Hardfp" olmasın mı?

Bu sorular hakkında herhangi bir fikri olan var mı? Sanırım HTC Desire'ım için bazı GL ES 2.0 kodlarını uygulamaya başlamak için hazırım ama mümkün olan en iyi hızı elde ettiğimden emin olmak istiyorum :)

Şerefe!

cevap

32

NDK'ya sağladığınız seçenekler yalnızca kodunuzun derlenme şeklini etkiler. Her zaman uygun bir şekilde üretilen GL lib'lerini veya platformun bir parçası olan herhangi bir şeyi değiştirmeyecektir. Eğer GL donanımına sadece geometriyi atıyorsanız, bir fark görmeyeceksiniz.

Seçeneklerin etkili olup olmadığını görmek istiyorsanız, çift duyarlıklı kayan nokta değerleriyle bir sürü işlem gerçekleştiren basit bir karşılaştırmayı karşıdan yükleyin (veya oluşturun) ve önce ve sonra yürütmenin ne kadar sürdüğünü görün .

-mfloat-abi = softp argümanı, kayan nokta değerlerinin işlevler arasında nasıl geçirileceğini belirler. softfp, her zaman tamsayı yazmaçlarında veya yığında geçirildikleri anlamına gelir. Android, softfp belirtmemişse, kütüphanenin ARMv7-A sürümü, donanım kayıtlarında şamandıraların gösterilmesini bekler ve ARMv5TE için oluşturulan herhangi bir kod kırılır.

"softfp" bazı işlevlere biraz yük ekler, ancak fp yazmaçlarındaki ve dışındaki değerlerin taşınmasıyla ilgili yönergeler ARM'de ucuzdur ve sağlanan ABI uyumluluğu buna değerdir.

"-mthumb", Thumb/Thumb2 kodunu oluşturmayı sağlar. Başparmak kodu, biraz daha yavaş olma eğilimindedir ancak eşdeğer ARM'den biraz daha küçüktür; Bazen daha küçük, CPU i-cache'de daha iyi uyum sağlayacağınız ve daha hızlı çalışacağınız anlamına gelir. Boyut her zaman bu cihazlarda bir endişe kaynağıdır, bu nedenle Başparmak varsayılan olarak etkindir.

Şüpheniz olduğunda, "arm-eabi-objdump -d whatever.o" kodunuzun bir kopyasını gösterecektir.

Güncelleme:NDK r9b desteği -mhard-float için. Bu armeabi-v7a hedefleri için sabit float API sözleşmeleri ile NDK kitaplıkları oluşturmanıza olanak sağlar.

+1

Üzgünüm, bu soruyu cevapladığınız gerçeğini kaçırmış olmalıyım. Mükemmel cevap :) – Goz