Или фиксированная точка с плавающей точкой для Android NDK приложения OpenGL?

Я пытаюсь выбрать, использовать ли, прежде всего, плавания или ints для всех 3D связанных элементов в моем приложении (который является C++ по большей части). Я понимаю, что большинство основанных на ARM устройств не имеет никакой аппаратной поддержки плавающей точки, таким образом, я полагаю, что любой тяжелый подъем с плаваниями был бы заметно медленнее.

Однако я планирую подготовить все данные по большей части (т.е. иметь буферы вершины, где применимый и преобразовывают матрицы использования, которые не изменяются много), таким образом, я просто наполняю данные вниз горло OpenGL. Я могу предположить, что это переходит более или менее прямо к GPU, и будет как таковой быть довольно быстрым? (Btw, минимальное требование является OpenGL ES 2.0, так, чтобы, по-видимому, исключил более старые находящиеся в 1.x телефоны.)

Также - как штраф когда я смешивание и подгонка ints и плавания? Предположение, что вся моя геометрия просто предварительно создается буферы плавающие, но я использую ints для матриц, так как они действительно требуют дорогих операций как умножения матриц, какому количеству гнева я подвергнусь здесь?

Между прочим, я знаю, что должен поддержать свои ожидания на низком уровне (кажется, что даже просьба о плаваниях на ЦП просит слишком много), но есть ли что-нибудь удаленно как 128-разрядные регистры VMX?

(И я тайно надеюсь, что fadden читает этот вопрос и имеет потрясающий ответ.)

8
задан EboMike 8 February 2011 в 23:54
поделиться

2 ответа

Старые устройства Android, такие как G1 и MyTouch, имеют процессоры ARMv6 без поддержки операций с плавающей запятой. Большинство новых устройств, таких как Droid, Nexus One и Incredible, используют процессоры ARMv7-A с аппаратным обеспечением FP. Если ваша игра действительно интенсивно использует 3D, она может потребовать от реализации 3D большего, чем в любом случае могут предоставить старые устройства, поэтому вам нужно решить, какой уровень оборудования вы хотите поддерживать.

Если вы кодируете исключительно на Java, ваше приложение будет использовать аппаратные средства FP, когда они доступны. Если вы напишете собственный код с помощью NDK и выберете архитектуру armv5te, вы вообще не получите аппаратный FP.Если вы выберете архитектуру armv7-a, вы это сделаете, но ваше приложение не будет доступно на устройствах до ARMv7-A.

OpenGL из Java теперь должен располагаться поверх «прямых» байтовых буферов, которые в настоящее время имеют медленный доступ из Java, но очень быстрые со стороны нативной стороны. (Я мало что знаю о реализации GL, поэтому не могу предложить ничего большего, чем это.)

Некоторые устройства дополнительно поддерживают расширение NEON «Advanced SIMD», которое предоставляет некоторые необычные функции, помимо того, что базовый VFP поддержка есть. Однако вы должны проверить это во время выполнения, если хотите его использовать (похоже, сейчас есть образец кода для этого - см. страницу NDK для NDK r4b).

В более раннем ответе содержится некоторая информация о флагах gcc , используемых NDK для "жесткого" fp.

В конечном итоге ответ на вопрос «фиксированный или плавающий» сводится к тому, на каком классе устройств вы хотите, чтобы ваше приложение работало. Конечно, для armv7-a кодировать проще, но вы отрезаете себя от части рынка.

14
ответ дан 5 December 2019 в 08:50
поделиться

На мой взгляд, вам следует как можно больше придерживаться фиксированной точки.

Поддержка операций с плавающей запятой отсутствует не только в старых телефонах, но и в новых, таких как HTC Wildfire.

Также, если вы решите требовать ARMv7, обратите внимание, что, например, Motorola Milestone (Droid для Европы) действительно оснащен процессором ARMv7, но из-за того, что Android 2.1 был создан для этого устройства, устройство не будет использовать ваши библиотеки armeabi-v7a (и могут скрыть ваше приложение от Маркета).

Я лично работал над этим, обнаружив поддержку ARMv7 с помощью новой библиотеки cpufeatures , поставляемой с NDK r4b, для загрузки некоторой библиотеки armeabi-v7a по запросу с помощью dlopen ().

5
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: