Я хочу создать игру для Android, и мне нужно выбирать между SDK и NDK. Мобильные телефоны имеют ограниченное оборудование, и я хочу избежать замедления, но Java медленный и использует слишком много памяти.
Являются ли приложения NDK более быстрыми и эффективными, чем приложения для SDK?
Java использует сборщик мусора, все объекты выделены в куче, я не могу выделить объект внутри другого объекта (без указателя), а простой класс, который используется как struct, наследует класс Object.
Будет ли моя программа NDK преобразована в байт-код Java? Будет ли компилятор игнорировать мои вызовы удаления, добавить сборщик мусора, добавить класс Object и передать все мои объекты в кучу?
Я попытаюсь прояснить некоторые вещи:
Похоже, ваше понимание NDK против SDK немного неясно.
Когда вы разрабатываете приложения с SDK, вы пишете на Java. Когда вы разрабатываете приложения для NDK, вы пишете на C/C++. Я думаю, что многие люди утверждают, что C/C++ быстрее для игр (между прочим), но я считаю, что если вы хотите, чтобы ваш процесс разработки был проще, вы можете использовать SDK; по крайней мере, если у вас простая 2D-игра, и вам не нужно реализовывать графический движок с шейдерами.
В вашем третьем абзаце много плохих предположений и неправильных коннотаций. Как будто сборщик мусора плох, все реализации кучи плохие, основная объектно-ориентированная структура проектирования наследования класса Object плоха. И да, у вас могут быть объекты внутри объектов.
И нет, он не будет преобразован в байт-код. Нет, компилятор не будет игнорировать delete
, добавить класс Object
(как/почему/что?) Или что-то еще.
По моему мнению, 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 его нужно будет специально скомпилировать для запуска на этих разных чипах.