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

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

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

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

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


person Squall    schedule 14.07.2011    source источник
comment
Подавляющая часть игр для Android, представленных на рынке, написана на Java. Это должно ответить на ваш вопрос.   -  person Perception    schedule 14.07.2011
comment
Кто сказал, что Java работает медленно и использует слишком много памяти?   -  person Mudassir    schedule 14.07.2011
comment
Также подумал, что я хотел бы добавить, что наличие быстрых алгоритмов экспоненциально важнее, чем язык, на котором вы пишете. Наличие хорошего алгоритма на медленном языке будет намного лучше, чем наличие плохого алгоритма на более быстром языке.   -  person Zarjio    schedule 15.07.2011
comment
@ZachJullion хороший алгоритм на быстром языке лучше, чем хороший алгоритм на медленном языке. И Java может раздражать в некоторых моментах, когда вы не можете оптимизировать, как хотите, потому что конструкции, которые должны облегчить вашу жизнь, не позволяют вам это сделать.   -  person User    schedule 30.08.2012


Ответы (3)


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

  • На 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 ничего не знает о ваших собственных выделениях, если вы явно не вызываете методы JNI для создания новых объектов.
person NuSkooler    schedule 14.07.2011
comment
Вы уверены в повышении производительности отрисовки NDK на экране? - person Henry Aloni; 09.04.2014
comment
Я имею в виду рисование напрямую, а не рендеринг и прохождение через JNI. - person NuSkooler; 21.04.2014

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

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

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

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

person eternalmatt    schedule 14.07.2011
comment
Конечно, его понимание непонятно, поэтому он задает вопрос. И этот ответ бесполезен, кроме последнего предложения я не вижу ничего действительно информативного. - person User; 30.08.2012

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

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

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

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

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

person Ben Baron    schedule 14.07.2011
comment
или хотите использовать 2.0, но отлично ориентируетесь на Gingerbread и выше, на самом деле это froyo или выше, но требует взлома NDK, как показано в этом google io talk: google.com/events/io/2011/sessions/ . Кроме того, я считаю, что последняя версия NDK (r5) также может скомпилироваться в x86. - person Leif Andersen; 14.07.2011
comment
Вы абсолютно правы, мне как-то в голову пришло, что это Gingerbread, а на самом деле это Froyo. А что касается NDK и x86, я не имел в виду, что его нельзя скомпилировать для других архитектур, я просто имел в виду, что если вы скомпилируете и загрузите его для ARM, то при использовании других архитектур в будущем его нужно будет перекомпилировать для них, а не просто работать из коробки. Или вы говорите, что это делает универсальный двоичный файл ARM/x86? - person Ben Baron; 15.07.2011
comment
Ну, он не универсален в том смысле, что это какой-то волшебный байт-код, который могут понять все три платформы, я не уверен, как это будет работать. Но он хранит версию библиотеки для всех трех платформ, и если это не происходит по умолчанию, строка: APP_ABI := armeabi armeabi-v7a x86 в файле Application.mk должна вызывать его, согласно документации: developer.android.com/sdk/ndk/index.html , хотя, по общему признанию, библиотека, которую я сейчас работаю над рвотой, когда я это делаю. - person Leif Andersen; 15.07.2011
comment
Что касается моего предыдущего комментария, это, кажется, общая проблема: группы .google.com/forum/#!topic/android-ndk/Y1ozOWg1Cyw Крысы. - person Leif Andersen; 15.07.2011
comment
Таким образом, похоже, что поддержка нескольких архитектур - это что-то вроде PITA с NDK, это почти все, что я имел в виду. С чистым Java SDK вам не нужно беспокоиться об архитектуре. /// И когда я сказал универсальный двоичный файл, я имел в виду, как это делает OS X, упаковывая двоичные файлы нескольких архитектур в один файл, а не магический байт-код, хотя это было бы довольно здорово :P - person Ben Baron; 15.07.2011
comment
Мех, теперь это исправлено в AOSP, и я ожидаю, что они скоро выпустят отдельную версию для людей, которые не загружают aosp. После того, как вы приложили усилия, чтобы использовать NDK в приложении (что, я признаю, немного похоже на PITA), это должно быть просто одной строкой. Тем не менее, я полагаю, что он все еще не является по-настоящему универсальным в том смысле, что если Android когда-либо будет создан для другой архитектуры, вам придется перекомпилировать и обновить свое приложение (при условии, что ndk не облажался). - person Leif Andersen; 15.07.2011