Android NDK наследует проблемы с Java?

1

Я хочу создать игру для Android, и мне нужно выбирать между SDK и NDK. Мобильные телефоны имеют ограниченное оборудование, и я хочу избежать замедления, но Java медленный и использует слишком много памяти.

Являются ли приложения NDK более быстрыми и эффективными, чем приложения для SDK?

Java использует сборщик мусора, все объекты выделены в куче, я не могу выделить объект внутри другого объекта (без указателя), а простой класс, который используется как struct, наследует класс Object.

Будет ли моя программа NDK преобразована в байт-код Java? Будет ли компилятор игнорировать мои вызовы удаления, добавить сборщик мусора, добавить класс Object и передать все мои объекты в кучу?

  • 0
    Огромная доля Android-игр на рынке написана на Java. Это должно ответить на ваш вопрос.
  • 0
    Кто сказал, что Java работает медленно и использует слишком много памяти?
Показать ещё 2 комментария
Теги:
performance
android-ndk

3 ответа

11
Лучший ответ

Я попытаюсь прояснить некоторые вещи:

  • На Android вы всегда разрабатываете SDK. Вы можете думать о NDK как о дополнении к SDK. Что делает NDK, это позволяет вам разработать собственный (например, C/C++) код в сопутствующем коде Java (что вы делаете с каждой стороны зависит от вас)
  • Являются ли приложения NDK быстрее? Опять же, это зависит от того, что вы делаете. Java может делать много вещей на устройствах с JIT особенно. Хорошо написанный код C/C++, как правило, быстрее, да. Тем не менее, вам также придется заплатить штраф за посещение и от Java/native (через JNI)
  • Если вы посмотрите, есть игровые движки для Android, написанные в NDK. Начиная с версии NDK r5 (и, конечно же, с новыми версиями Android), вы можете рисовать на экране с NDK, не пройдя сначала через Java/JNI, что может дать огромный прирост производительности.
  • Нет, ваш собственный код абсолютно не будет преобразован в байт-код. Он будет скомпилирован как собственный ARM/MIPS/x86/любой машинный код.
  • Если вы не реализуете собственный GC в собственном коде, новый, удалить и т.д. Ведут себя как обычно. Java VM ничего не знает о ваших собственных распределениях, если вы явно не вызываете методы JNI для создания новых объектов.
  • 0
    Вы уверены, что NDK повышает производительность экрана?
  • 0
    Я имею в виду рисование непосредственно против рендеринга и прохождения через JNI.
4

Похоже, ваше понимание NDK против SDK немного неясно.

Когда вы разрабатываете приложения с SDK, вы пишете на Java. Когда вы разрабатываете приложения для NDK, вы пишете на C/C++. Я думаю, что многие люди утверждают, что C/C++ быстрее для игр (между прочим), но я считаю, что если вы хотите, чтобы ваш процесс разработки был проще, вы можете использовать SDK; по крайней мере, если у вас простая 2D-игра, и вам не нужно реализовывать графический движок с шейдерами.

В вашем третьем абзаце много плохих предположений и неправильных коннотаций. Как будто сборщик мусора плох, все реализации кучи плохие, основная объектно-ориентированная структура проектирования наследования класса Object плоха. И да, у вас могут быть объекты внутри объектов.

И нет, он не будет преобразован в байт-код. Нет, компилятор не будет игнорировать delete, добавить класс Object (как/почему/что?) Или что-то еще.

  • 2
    Конечно, его понимание неясно, поэтому он задает вопрос. И этот ответ бесполезен, кроме последнего предложения, я не вижу ничего действительно информативного.
1

По моему мнению, NDK просто позволяет вам программировать игры (и приложения, если хотите) в C/C++ для Android. Код компилируется в код компьютера Android, а не каким-то образом преобразовывается в Java. Однако сомнительно, действительно ли существует огромная разница в производительности на современных телефонах.

Большое преимущество NDK, которое здесь не упоминалось, заключается в том, что он позволяет использовать OpenGL ES 2.0 на старых версиях Android, а не зависеть от 1.1, если вы используете Java. OpenGL ES 2.0 был включен в Java SDK в Имбирный пряник EDIT: На самом деле это Froyo не Gingerbread, как отметил Лейф Андерсен в комментариях, но по крайней мере на данный момент, Пряник не широко доступен Froyo - это всего лишь около 60% телефонов Android (хотя это будет продолжаться и в ближайшие несколько месяцев).

Другим огромным преимуществом для NDK является возможность порта iOS-игр (и игр с некоторых других платформ), которые написаны на C/C++.

Если у вас все в порядке с использованием OpenGL ES 1.1 или вы хотите использовать 2.0, но с точным таргетингом Имбирный пряник Froyo и выше, и вы не делаете никаких iOS или других платформ, тогда Java будет почти наверняка лучшим решением для вас. То есть, если вы не опытный программист C/C++, тогда вы можете быть более удобным программированием с помощью NDK.

Кроме того, еще одно преимущество программирования на Java заключается в том, что если в конечном итоге устройства x86 или другие чипы работают под управлением Android, ваша игра все равно будет играть нормально. С NDK его нужно будет специально скомпилировать для запуска на этих разных чипах.

  • 1
    «или хотите использовать 2.0, но с хорошим таргетингом на Gingerbread и выше», на самом деле, это froyo или выше, но требует взлома NDK, как показано в этом докладе Google io: google.com/events/io/2011/sessions/… , Кроме того, я считаю, что последняя версия NDK (r5) может быть скомпилирована и для x86.
  • 0
    Вы абсолютно правы, почему-то я понял, что это был имбирный пряник, но на самом деле это Froyo. Что касается NDK и x86, я не имел в виду, что он не может быть скомпилирован для других архитектур, я просто имел в виду, что если вы скомпилируете и загрузите его для ARM, то, если в будущем будут использоваться другие архитектуры, его нужно будет перекомпилировать для них, а не просто работать из коробки. Или вы говорите, что это своего рода универсальный двоичный файл ARM / x86?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню