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

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

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

Vitorio
> Gradius
> > справа системные кнопки не отъехали и они сожрали часть экрана. А ведь
> > управляющие кнопки игры могли быть больше!
> До Android 4.4 immersive mode не доступен и софтовые кнопки не убрать. Может на
> этом тестовом девайсе версия ниже 4.4? И даже если это так, то странно, что SDL
> не учитывает, что кнопки не скрылись в принципе.

Я точно не знаю, обрабатывались ли у него регионы касания в этом случае правильно или нет.

Переделал алгоритм, теперь получаю метрику с размеров окна, а не рендерара.  Осказалось, пашет нормально и без задержки в 2 с. Правда, таймаут я всё-же ввёл на всякий случай.  Если цикл убрать, то  SDL_GetWindowSize будет не всегда передавать верные метрики.

 SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
 window=SDL_CreateWindow("Cobra",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,720,1520,SDL_WINDOW_SHOWN|SDL_WINDOW_FULLSCREEN_DESKTOP|SDL_WINDOW_BORDERLESS|SDL_WINDOW_ALLOW_HIGHDPI);

 u32 t=2000; //таймаут в 2 с
 while(t)
 {
  SDL_Event event;
  while(SDL_PollEvent(&event))if(event.type==SDL_WINDOWEVENT)if(event.window.event==SDL_WINDOWEVENT_RESIZED)t=1;
  SDL_Delay(1);
  t--;
 }

 SDL_GetWindowSize(window,&DMW,&DMH);

 renderer=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);

Gradius
> В идеале конечно на BASS переходить, как это сделано в версиях игры под ПК. Там
> латентность ещё круче!

Отказался от SDL_mixer в пользу перехода на BASS (libbass.so).  Не пожалел.
Теперь  интервалы между быстроповторяющимися звуками в игре соответствуют  версиям на ПК, что радует.

Подробно о BASS тут:  https://www.un4seen.com/forum/?topic=13225

Там  в первых постах пишут, что не удавалось подцепить либы, если их нативно использовать(через NDK, C/C++, а не Java). Но у меня всё получилось.

Как бонус - музыка в уровне 4.2 теперь скругляется в нужную точку, а не играет сначала, как было раньше.

Правда, BASS использует глобальный доступ к звуку, даже с потеряным фокусом и свёрнутым окном звук играл.  Пришлось обкостылить:

 SDL_Event event;
 while(SDL_PollEvent(&event))
 {
  switch(event.type)
  {

   case SDL_APP_WILLENTERBACKGROUND:
   {
    BASS_Pause();
   }
   break;

   case SDL_APP_DIDENTERFOREGROUND:
   {
    BASS_Start();
   }
   break;

//.........

Теперь, как только приложение начинает уходить на задний план - звук останавливается.
Звук возобновляется, когда приложение стало полностью на переднем плане.

Вроде бы всё. Никаких новых косяков пока замечено не было.  Попросил DEN 3D чтобы залил новый билд, завтра сказал, что будет доступным для скачивания.


Вопрос аудитории - телефоны или мобильные девайсы с ведроидом с архитектурами x86 и x86_64 бывают?
Есть ли смысл собирать и под них? Или кроме как эмуляторов на ПК оно не нужно?
Или только armeabi-v7a и aarch64 ?


#46
16:56, 13 янв. 2021

Gradius
> Вопрос аудитории - телефоны или мобильные девайсы с ведроидом с архитектурами
> x86 и x86_64 бывают?

Бывают. Намного реже чем под ARM, но бывают. Раньше еще была опция компиляции под MIPS в NDK, но её давно уже нет, видимо сам Google увидел что такие телефоны в гугл.плей не заходят.
Поэтому если они предлагают под такое компилить, значит еще видят в этом смысл, значит есть риск кого то обделить не сделав билд с поддержкой.

#47
17:08, 13 янв. 2021

Gradius
> Отказался от SDL_mixer в пользу перехода на BASS (libbass.so). Не пожалел.
Проект некоммерческий? BASS для Андроид немало стоит.

>Вопрос аудитории - телефоны или мобильные девайсы с ведроидом с архитектурами x86 и x86_64 бывают?
Да, Nokia почему-то делает (или делала недавно) телефоны на этой платформе. Но x86 на ведре - редкость. Я эту архитектуру не поддерживаю в своих проектах, только arm.

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

=A=L=X=
> Бывают. Намного реже чем под ARM, но бывают. Раньше еще была опция компиляции
> под MIPS в NDK, но её давно уже нет, видимо сам Google увидел что такие
> телефоны в гугл.плей не заходят.
> Поэтому если они предлагают под такое компилить, значит еще видят в этом смысл,
> значит есть риск кого то обделить не сделав билд с поддержкой.

OK, поддержим! :)
Тем более они ещё акутуальны тут: https://developer.android.com/ndk/guides/abis

P.S. Ради интереса понакачал эмуляторов под ведроид (NES, SNES, SEGA MD), посмотрел в lib какие там ABI:  в основном встречаются три:

- armeabi (устарел, без floating point)
- armeabi-v7a (смахивает на ARM Cortex, c floating point)
- arm64-v8a (самые новые)

Немного устаревшие данные:
aa | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти

под MIPS

Я такие не застал :)

P.S. Сегодня мой стаж как пользователя андроид стал 10 дней. До этого вообще им не пользовался (использую старый телефон Nokia :)

#49
(Правка: 17:24) 17:16, 13 янв. 2021

Vitorio
> Проект некоммерческий? BASS для Андроид немало стоит.

Некоммерческий. Чисто для фана.

На BASS очень хорошо делаются  ТРИ вещи, нужные для игры:

1) Идеальное зацикливание при воспроизведении OGG-файлов (в SDL_mixer под винду была небольшая пауза)

2) Скругление звука на произвольную точку

3) Очень малая латентность (серия быстроповторяющихся коротких звуков идёт без ощутимых на слух задержек) , к примеру:

- в начале уровня 4-2 при запуске двигателей, "пшики" идут как надо
- в уровне 1-2 звуки взрывов моста идут как надо
- звук вылета патронов у Кобры идёт равными интервалами

На своих консолях, я писал свой MIXER + использовал декодер музыки CELT,  там латентность вышла ещё меньше.


Vitorio
> x86 на ведре - редкость. Я эту архитектуру не поддерживаю в своих проектах,
> только arm.

Использовал x86 для отладки в эмуляторе на ПК.  Потом когда пересел на реальный телефон, надобность в эмуляторе отпала. Хотя иногда отлаживаю в нём моменты, связанные с различными размерами дисплея.

#50
(Правка: 9:50) 9:48, 14 янв. 2021

Vitorio
> Gradius
> > справа системные кнопки не отъехали и они сожрали часть экрана. А ведь
> > управляющие кнопки игры могли быть больше!
> До Android 4.4 immersive mode не доступен и софтовые кнопки не убрать. Может на
> этом тестовом девайсе версия ниже 4.4? И даже если это так, то странно, что SDL
> не учитывает, что кнопки не скрылись в принципе.

Узнали, это был Samsung galaxy S10.

Обновили и перезалили - версия 2.1.2:

> Скачать APK на тестирование можно здесь:
https://misterpix.itch.io/space-pirate-cobra

Немного заснял прохождение:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

#51
12:55, 14 янв. 2021

Ётафон второй модели с прошивкой 4.3 kitkat - заработал как надо, тач тоже заработал:

ётафон2 | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти
#52
(Правка: 15:28) 15:26, 14 янв. 2021

Кстати, физический геймпад поддерживается?
В SDL тоже легче лёгкого.
Могу потестить, у меня вот такой блютусный:
Изображение

#53
(Правка: 16:01) 15:40, 14 янв. 2021

=A=L=X=
> Кстати, физический геймпад поддерживается?
> В SDL тоже легче лёгкого.
> Могу потестить, у меня вот такой блютусный:

Геймпад хороший - направления крестовины в виде отдельных кнопок!
Но проблема всех таких типов джойстиков (лично для меня) - отсутствие трёх кнопок в ряд!

Очень удобно сделано как в паде от SEGA:  A - стрелять, B- прыгать, C - супер-удар.
Можно делать комбинации : стрелять-прыгать.

На своих железных консолях (BlackPrism, COBURA) я использую в игре такую раскладку:

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


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

P.S. В версиях игры для ПК джойстик поддерживается.  Только перед запуском игры его надо воткнуть в USB и включить. Будет активно управление с джойстика, клавиатуры не будет (кроме кнопки выхода ESC).

#54
15:57, 14 янв. 2021

Gradius
> Нет, пока не поддерживается. Потому что нету геймпадов для телефонов никаких.
> Но как только появится, сделаю.

Достаточно сделать на ПК и всё заработает и на Андроиде.
Это должно быть подсистема не Joystick, а именно Gamepad - эти две подсистемы частично пересекаются, но не каждый джойстик является геймпадом.
Геймпад это конкретное и всегда одинаковое количество и состав кнопок, а так же их расположение (и названия):
Изображение
Запрограммировав раз просто втыкаешь и играешь.
И надо обязательно обрабатывать эвенты:

    case SDL_CONTROLLERDEVICEADDED:
    case SDL_CONTROLLERDEVICEREMOVED:
      acquireControllers();
      break;
чтобы можно было подключить геймпад прямо во время игры и он сразу же бы заработал.
Для андроида критически важно, т.к. блютуфные штуки любят то уснуть то проснуться.
Т.к. игрок один, то все существующие геймпады надо опрашивать и воспринимать как главный:
static void acquireControllers()
{
  releaseControllers();

  for ( int i = 0; i < SDL_NumJoysticks(); i++ )
  {
      if ( SDL_IsGameController( i ) )
      {
          SDL_GameController *controller = SDL_GameControllerOpen( i );
          if ( controller )
          {
            SDL_JoystickID id = SDL_JoystickGetDeviceInstanceID( i );
            controllers.emplace_back( controller, id );
          }
      }
  }
}
На ПК контроллеры чтобы так же работали должны поддерживать протокол X-Input! Именно X-Input и делает обычный джойстик настоящим геймпадом!

#55
16:04, 14 янв. 2021

=A=L=X=
> Достаточно сделать на ПК и всё заработает и на Андроиде.
> Это должно быть подсистема не Joystick, а именно Gamepad - эти две подсистемы
> частично пересекаются, но не каждый джойстик является геймпадом.
> Геймпад это конкретное и всегда одинаковое количество и состав кнопок, а так же
> их расположение (и названия):

Так оно через USB или WIFI ?  Или пофиг через что?

В ПК-версиях джойстик сделан, надо будет у DEN 3D поинтересоваться как он сделал в игре. Возможно, всё решится дублированием кода.  А если  USB-шный геймпад возможно присоединить к телефону - тогда ещё лучше

#56
16:05, 14 янв. 2021

=A=L=X=
> Геймпад это конкретное и всегда одинаковое количество и состав кнопок, а так же
> их расположение (и названия):

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

#57
16:07, 14 янв. 2021

И еще обозначу, что общепринятая всеми игроками мира раскладка действий на геймпаде такова:
A - прыжок
X - базовый огонь
Y - дополнительный огонь (суперудар)
B - действия или что-то типа бомб

По другому делать ни в коем случае не надо - это закреплено во всех современных играх.

#58
16:07, 14 янв. 2021

=A=L=X=
> На ПК контроллеры чтобы так же работали должны поддерживать протокол X-Input!
> Именно X-Input и делает обычный джойстик настоящим геймпадом!

Вот этого я не понял.  В чем различие?  Я всегда считал, что это одно и тоже.

#59
16:08, 14 янв. 2021

Gradius
> Как-то не сильно хочется городить конфигуратор...

Никаких конфигураторов - геймпады жёстко зафиксированы как по составу кнопок так и по их ожидаемому функционалу. Иногда бывает только можно менять "раскладку А" и "раскладку Б", как в сеге тоже бывало. Но никаких конфигураторов тут не надо.

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