Войти
ПрограммированиеФорумОбщее

SDL2 и Android : нормально работает со 2-го раза и висит в памяти

Страницы: 1 2 3 4 5 6 Следующая »
#0
(Правка: 11:45) 11:42, 3 янв. 2021

Пытаюсь сделать APK-приложение для реального телефона, портировав программу на C++, использующую SDL2.

В качестве отправной точки использую:

1) Проект отсюда: https://github.com/pvallet/hello-sdl2-android

2) ОС Linux (Ubuntu), работа с командной строкой. Так как большинство примеров написаны под Linux.

3) Сборка через gradle.  Всякие говно-студии избегаю, так как слабый комп 3 ГГц 2 ядра + 4 гига памяти всего.

Добился, чтобы проект успешно строился под целевую архитектуру, но есть проблемы:

1)
На реальном телефоне работает только приложение, построенное в debug,  release отказывается даже устанавливаться.  Почему?  Как пролечить?  ОС - клон ведроида "Миу-Миу"

2)
Приложение в первый раз работает неправильно: появляется окно, но текстура отсутствует.  Если принудительно убить приложение, то приложение со второго раза работает как надо - текстура отображается.

2.5)
Первый запуск с инсталлятора - работает неправильно. См. проблему в пункте 2).

3)
Приложение висит в памяти, после закрытия окна.  Необходимо принудительно килять его.


Пробовал собирать с последней версией SDL2: 2.0.14 и SDL2_image 2.0.5 - результат стал хуже: текстура не грузится даже и на 5-й раз.

Код  на всякий случай:

+ OPEN_ME_IF_YOU_WANT_TO_LIVE

Я ничего в нём не менял - просто тупо собрал и всё.  В интернете нашёл упоминание, что перед return 0 надо делать exit(), но для ведроида это грязный метод.

Подскажите, в каком направлении копать?

Нужен надёжный ведроид-мост для портирования C/C++ - программ на SDL2.


#1
14:04, 3 янв. 2021

Gradius
> Подскажите, в каком направлении копать?

Логировать всё и вся.

#2
14:11, 3 янв. 2021

gamedevfor
> Логировать всё и вся.

По п. 3)  Проверили другие приложения - они ведут себя точно также. А именно - висят после зарытия.  И standby и quit оба висят в памяти.

Такова суть "Миу-Миу" наверное.

#3
14:16, 3 янв. 2021

Gradius
> Такова суть "Миу-Миу" наверное.

Наверное там требуется какой то индивидуальный подход (читай нужен костыль) к разработке.

#4
15:19, 3 янв. 2021

В SDL_CreateWindow я бы ещё добавил флаг SDL_WINDOW_SHOWN. Ну и текстура у тебя залазит за границу дисплея, хотя это не должно быть критично, но вдруг глюки именно твоей оси.

#5
16:48, 3 янв. 2021

Gradius
Вариант, перенести свою прогу на Java, чтобы воспользоваться удобством LibGDX не рассматриваешь? Имхо, гораздо удобнее, чем вечные проблемы со сборкой C++ кода для запуска под Android.

Рациональный подход в программировании - это использовать подходящий язык и фреймвормк под соответствующую задачу.

> Всякие говно-студии избегаю, так как слабый комп 3 ГГц 2 ядра + 4 гига памяти
> всего.
почему "говно-студии"? Это комп устаревший просто. Докупить оперативки до 16 гигов и все - можно более менее нормально в Android Studio работать.

#6
17:08, 3 янв. 2021

Gradius
> На реальном телефоне работает только приложение, построенное в debug, release
> отказывается даже устанавливаться. Почему?
Возможно, с подписыванием что-то не то.

> Приложение в первый раз работает неправильно: появляется окно, но текстура
> отсутствует. Если принудительно убить приложение, то приложение со второго
> раза работает как надо - текстура отображается.
Там базовой петли как таковой и нет. Возможно, в полноценном приложение это вообще несущественно.

> Приложение висит в памяти, после закрытия окна. Необходимо принудительно
> килять его.
Это норма. И не факт, что оно висит именно в памяти, это может быть просто список ресент.
Короче, тебя это вообще волновать не должно, твое дело обеспечить функционал жизненного цикла приложения, все вот эти OnCreate, OnResume и т.п. Просто почитай мануал, там втыкать 15 минут. И сырцы java обертки у готовых рабочих прикладух посмотри, сэмплы - это сэмплы.

#7
(Правка: 17:13) 17:11, 3 янв. 2021

Olaf85
> В SDL_CreateWindow я бы ещё добавил флаг SDL_WINDOW_SHOWN. Ну и текстура у тебя
> залазит за границу дисплея, хотя это не должно быть критично, но вдруг глюки
> именно твоей оси

OK, попробую. Результат напишу.

SergeyGaS
> Вариант, перенести свою прогу на Java, чтобы воспользоваться удобством LibGDX
> не рассматриваешь?

Боже упаси...  Несколько сотен тысяч строк кода (C/C++) уже написано!

В Java я полный нуль вообще. Мне даже её философия и структура проектов непонятны. Дикий оверхед, по сравнению с тем же проектом на C/C++ и makefile.

SergeyGaS
> почему "говно-студии"? Это комп устаревший просто. Докупить оперативки до 16
> гигов и все - можно более менее нормально в Android Studio работать.

Любая компиляция проектов сводится к вызову программ через CLI-интерфейс (comand line interface). Зачем лишний раз изнашивать железо, ради сомнительного удобства свистоперделок?

Пишу проекты в блокноте, а собираю make-файлом и bash-скриптами. :)

Gradius
> 1)
> На реальном телефоне работает только приложение, построенное в debug, release
> отказывается даже устанавливаться. Почему? Как пролечить? ОС - клон ведроида
> "Миу-Миу"

С этим разобрался. Сгенерировал левый сертификат и подписал им релизный билд.
Сейчас приложение устанавливается, НО ведроидный инсталлятор всёравно выдаёт много запросов на подтверждение при установке приложения. 

А повторно из проводника блокируется установка приложения.  Только если скачать его с Телеграмма или Скайпа, тогда ставится.  Что за у ведроида анальные ограждения???  У меня уже кирпичи сыпятся от негодования! На ПК и в голом железе  всё просто, почему в ведре всё так фигово?

beejah
> Это норма. И не факт, что оно висит именно в памяти, это может быть просто
> список ресент.
> Короче, тебя это вообще волновать не должно, твое дело обеспечить функционал
> жизненного цикла приложения, все вот эти OnCreate, OnResume и т.п.

Это я уже понял :) Мне в принципе пофиг, просто хотелось как можно красивше сделать.

#8
(Правка: 18:30) 18:25, 3 янв. 2021

Olaf85
> В SDL_CreateWindow я бы ещё добавил флаг SDL_WINDOW_SHOWN

Нашёл другой пример, где этот флаг установлен. Код в спойлере:

+ РАБОЧЕЕ

Взят был отсюда: https://tinyurl.com/ybq7nvq8

Теперь работает с первого раза.  Но также остаётся висеть в памяти после "закрытия" - без доработки java-куска.
Завтра попробую доработать java-кусок чтоб закрывалось (finishActivity), как в вышеупомянутой статье.

Ну и на последок - картинка:

m | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

#9
(Правка: 12:10) 12:07, 5 янв. 2021

Gradius
> НО ведроидный инсталлятор всёравно выдаёт много запросов на подтверждение при
> установке приложения.
>
> А повторно из проводника блокируется установка приложения.
Это обычно в файле манифеста прописана куча запросов, но заглянув внутрь манифеста, вроде ни чего не вижу... Может gradle туда сверху что-то пишет?

SergeyGaS
> почему "говно-студии"? Это комп устаревший просто.
потому что именно "говно-студии". Ни чего хорошего она не даст, кроме увеличения размера файла, всё то же самое можно сделать без неё и часто быстрее и легче на других языках кроме явы.

#10
18:26, 5 янв. 2021

Gradius
> Завтра попробую доработать java-кусок чтоб закрывалось (finishActivity),
Ты, инфа 73%, что-то не то делаешь. Тебе вообще не надо ничего дорабатывать, просто найди на гитхабах (или что там у вас сейчас) сырцы (предпочтительно собранного и выложеного) приложения.
В этой херне можно копаться до бесконечности. Там, помимо "висит в памяти", херова туча нюансов.

#11
12:08, 6 янв. 2021

Gradius
> На реальном телефоне работает только приложение, построенное в debug,  release
> отказывается даже устанавливаться.
Возможно нет разрешения на установку не лицензионного ПО, галочки в панели разраба чекни
Gradius
> Приложение в первый раз работает неправильно
У app свои жизненные циклы и нужно уметь под них подстраиваться, раз сам все пишешь. При повороте экрана допустим умирает активити и заново создается. Может легко потеряться ссылка на ресурс или что-то типа того.
Gradius
> Приложение висит в памяти, после закрытия окна
Есть способы полностью закрыть app, но разрабы не рекомендуют, андроид сам знает когда и что закрывать, это нормальная работа. Твоя задача позаботиться о восстановлении ресурсов после того, как андроид их закроет.

#12
(Правка: 15:58) 15:29, 6 янв. 2021

Mirrel
> Это обычно в файле манифеста прописана куча запросов, но заглянув внутрь
> манифеста, вроде ни чего не вижу... Может gradle туда сверху что-то пишет?

Пока не ковырял это.

Подписывание самодельным ключом  приводит к установке приложения на реальный телефон со 2-го раза. На эмуляторе отказывается запускать, выдавая ошибку: INSTALL_FAILED_UPDATE_IN_COMPATIBLE

Ниже даны скрины диалогов при установке приложения (релиз, подписанный  самодельным ключом).

1) Скачиваем APK переданный с Телеграмма.

2)
1 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

3)
2 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

4)
3 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

5) Потом такой ОБЛОМ:
4 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

6)
5 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

7) Повторяем установку снова - а теперь вот так! Сравните с окном в 5 !!!
6 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

8) Открываем установленной приложение:
7 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

9) Ура !!!
8 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

Тот самый момент, когда офигеваешь от количества собственных усилий, затраченных на положительный результат:

Изображение

#13
(Правка: 15:50) 15:45, 6 янв. 2021

beejah
> Ты, инфа 73%, что-то не то делаешь. Тебе вообще не надо ничего дорабатывать,
> просто найди на гитхабах (или что там у вас сейчас) сырцы (предпочтительно
> собранного и выложеного) приложения.
> В этой херне можно копаться до бесконечности. Там, помимо "висит в памяти",
> херова туча нюансов.

На гитхабах не всё собирается у меня. Да, в этой херне можно копаться очень долго, согласен! Поэтому я и уцепился за тот пример, который у меня работает и собирается.

Однако же я писал ранее, что на ведре Миу-Миу ни одно приложение не закрывается его кнопками. Только вручную выкидывать менеджером.

Gmassta
> Возможно нет разрешения на установку не лицензионного ПО, галочки в панели
> разраба чекни

Как залицензировать?  Нужно чтобы было как из google play-маркета скачивалось - без лишних вопросов.
Как ?

Gmassta
> У app свои жизненные циклы и нужно уметь под них подстраиваться, раз сам все
> пишешь. При повороте экрана допустим умирает активити и заново создается. Может
> легко потеряться ссылка на ресурс или что-то типа того.

Из минусов, которые я  заметил:

1) Очень медленная работа на чтение файлов из assets.
Загрузка данных перед началом очередного уровня игры - занимает несколько секунд.
Возможно, это из-за шифрования данных и их сжатия.  На ПК работает моментально.

Есть способ ускорить?

Сами уровни работают сносно на 60 FPS гладко и без рывков , но загрузка данных перед началом уровней медленная.

2) Синяя полоска слева мешает и не даёт захватить 100% площади экрана.
А также она вносит паузу в работу приложения, если её случайно коснуться (если управляющие клавиши близко).

Есть способ убрать полоску?  Как ?

3) Сенсорное управление в платформерах-экшенах, где требуется быстрая реакция - не лучшее.

Играть можно, выигрывать - только после того как пальцы заучат раскладку.

4) Не совсем понятно где рулить ключами оптимизации С/C++ - все файлы пересмотрел, не нашёл.

Где и как ?

Разработку веду в Линуксе, там же штатный эмулятор + Android NDK, SDK + Java SDK, RE + ...
Пришлось изрядно покурить моменты, связанные  с правами доступа, генерацией ключей и многое другогое.

+ МЕГА_СПОЙЛЕРИЩЕ

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

:)
Только жёсткий хардкор, никаких говностудий, только командная строка!Gmassta

Gmassta
> Есть способы полностью закрыть app, но разрабы не рекомендуют, андроид сам
> знает когда и что закрывать, это нормальная работа. Твоя задача позаботиться о
> восстановлении ресурсов после того, как андроид их закроет.

Я на этот сложный момент забил.  Потому что:

Gradius
> Завтра попробую доработать java-кусок чтоб закрывалось (finishActivity), как в
> вышеупомянутой статье.

... ничего не дало.

P.S.
Ну и всё-же очень приятно,  что ядро программы выполняется напрямую в инструкциях той архитектуры процессора, который стоИт в телефоне, без всяких  там виртуальных Java  и прочих нагромождений :)

#14
20:05, 6 янв. 2021

Gradius
> Есть способ убрать полоску?  Как ?
В манифесте no title bar прописать. Для скрытия софотовых кнопок операционки (back, home и т.д) курить immersive mode.

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее