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

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

Страницы: 1 2 3 4 5 6 Следующая »
#30
9:18, 10 янв. 2021

Gradius
> Попробовал ещё раз. Корректного закрытия не вышло.

Странно, у меня с exit всё стало работать. Может какой то пост-глюк вылетел у вас из-за старого процесса.
А может в 2.0.9 это даже и починили уже. Хотя вряд ли, т.к. вопрос очень старый и известный.
Но у меня работает с exit как положено работать приложению на Андроиде - его можно и отправить в сон и нажатием на свою кнопку "выход" выйти так и нажатием на системную кнопку "назад" тоже выйти. Это как бы норма для Андроида.


#31
(Правка: 18:32) 18:28, 10 янв. 2021

=A=L=X=
> Но у меня работает с exit как положено работать приложению на Андроиде - его
> можно и отправить в сон и нажатием на свою кнопку "выход" выйти так и нажатием
> на системную кнопку "назад" тоже выйти. Это как бы норма для Андроида.

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

Что понимается под выходом?  Если в панели приложение свёрнуто, то это не выход.  Выход - это когда приложение удаляется из панели задач пальцем влево, да так что повторный запуск приложения начнётся с начала.

Разобрался, почему в SDL, начиная с версии 2.0.10 был недоступен тачпад.  Они зачем-то сделали ДВА тачпада, причём рабочий будет только второй, а не первый!  Что значит, когда у телефона 2 тачпада?  Виртуальные в смысле?

Ещё попутно не очень хороший сюрприз нашёл(через SDL-ные функции), что у старых телефонов физически поддерживаться могут менее 3-х касаний (мультитач):

1) я испытал LG K4 LTE, он может мультитач до 2-х касаний максимум, и то не везде. Например вверху два пальца по одной оcи Y не определит - будет считать одно касание.

2) Тот первый Xiaomi Redmi8 который (на фотах) - поддерживает мультитач до 10 точек одновременно!

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

ТРИ касания - это минимум:  направление + стрельба + прыжок!  Не меньше!

Кроме того, эти гадёнышы зачем-то начиная с SDL 2.0.10 опять поломали immersive mode в фулл-скрине: работает раз через раз: ширина экрана каждый раз считается по-разному:  с учётом длины меню справа и без.  Само меню спрятано и полупрозрачное.

И ещё заметил, что если присмотреться к пикселам, то они как-будто перфорированы по периметру. Что-то типа фильтра. Надо бы проверить хинт SDL_WINDOW_ALLOW_HIGHDPI

Но что хорошего начиная с 2.0.10 - так это переписанная аудио-часть -  они используют новый драйвер с низкой звуковой латентностью! И это меня радует: теперь серии быстроповторяющихся коротких звуков  звучат в игре без запаздываний! :)

#32
(Правка: 22:16) 22:15, 10 янв. 2021

Gradius
> Что понимается под выходом?
Именно полное закрытие приложения из списка запущенных и отложенных задач.
То что и должно происходить при выходе из ф-ии main (например при получении эвента SDL_Quit) как SDL то предполагает.
И почему то без принудительного exit в конце main оно ведёт себя неправильно и это очень старая проблема. Приложение застревает в списке открытых и при попытке запустить снова сыпет ошибками и т.п.
Но с exit всё ок. Подозреваю что у вас просто приложение уже было в состоянии застревания или было запущено через инсталлятор (а это сразу возможные проблемы в глобальном состоянии приложения как я тоже выше описывал) и потому показалось что метод не сработал.

Я когда какие то баги нахожу стараюсь сперва сам выяснить откуда у  них предположительно растут ноги. Например: https://gamedev.ru/code/forum/?id=248709&page=2&m=5090494#m22
И пишу багрепорт им в официальный багтрекер.
Это позволяет во первых самому что-то поправить до выхода новых версий, а во вторых ускоряет их появление.

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

Видео работы порта игры для телефона Redmi 8:

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


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

Из новых найденных багов SDL 2.0.9:

1) У второго ётафона не работают сенсорные кнопки.  Возможно это связано с неактивным первым тачем, когда их больше одного.

2) Неверно определяется бОльшая сторона экрана(она опять меньше на ширину полоски меню), если при запуске приложения держать телефон в альбомной ориентации.  Из-за этого корректность определения  регионов касания тача опять съезжает (так как координаты скорее всего у тача пронормированы по правильному значению размера экрана)

Если приложение запустить, держа телефон в портретной ориентации, то бОльшая сторона экрана определяется верно.

Проверил попутно SDL 2.0.14 : частые короткие  звуки в игре действительно стали играть почти как нужно (без ощутимых на слух задержек)

#34
(Правка: 6:47) 6:44, 11 янв. 2021

По гайдлайнам системы Android и iOS выход из приложений не должен осуществляться самими приложениями. Вы не должны делать у себя какие то кнопки «Выход» и тому подобное. Для того чтобы снять приложение у пользователя достаточно функций операционной системы или вас может прибить ОС при недостатке памяти.
Последнюю версию sdl мы можете выкачать из mercury или с зеркал на github, наверняка ваши проблемы там уже решили. А если нет, в самом sdl кода минимальное количество, в нем не сложно разобраться и что то дописать что вам нужно.

#35
(Правка: 13:29) 13:23, 11 янв. 2021

xDimka
> По гайдлайнам системы Android и iOS выход из приложений не должен
> осуществляться самими приложениями. Вы не должны делать у себя какие то кнопки
> «Выход» и тому подобное. Для того чтобы снять приложение у пользователя
> достаточно функций операционной системы или вас может прибить ОС при недостатке
> памяти.

OK. Утвердили. Более не возвращаемся к этому вопросу :)

xDimka
> Последнюю версию sdl мы можете выкачать из mercury

Выкачал эту: SDL-2.0.15-14703.zip  отсюда:  https://www.libsdl.org/hg.php

Сбилдил. Запуск на телефоне проходит неудачно - приложение просто убивается.

А теперь хорошее. Перешёл окончательно на SDL 2.0.14

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

Грязный метод: после создания окна нужно ввести задержку хотя бы на пару секунд, дать сраной панели уйти с дисплея.  Тогда 100% метрики будут определены верно.  Уже проверил на 2-х телефонах несколько раз под разным разворотом дисплея. Просто визуально видно, что эта панель отъезжает после создания окна - время примерно 0,5-1 с.

Код ниже:

 SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO); //инитим что нужно

 window=SDL_CreateWindow("Cobra",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,1200,640,
SDL_WINDOW_SHOWN|
SDL_WINDOW_FULLSCREEN_DESKTOP|
SDL_WINDOW_BORDERLESS); //окно в immersive mode

 SDL_Delay(2000); // задержка 2 секунды, чтобы дать  панели с кнопками отъехать и исчезнуть

 renderer=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC); //рендерер

 SDL_SetHint(SDL_HINT_RENDER_VSYNC,"1"); // перестраховка для VSYNC 

 SDL_RaiseWindow(window); //не помню для чего, наверно чтобы фокус окна был активен

 int Width,Height;
 SDL_GetRendererOutputSize(renderer,&Width,&Height);  //получаем размеры прямоугольника в котором будем рисовать

Пробовал вместо задержки отлавливать события окна MAXIMIZE, RESIZE - ничего путного не вышло.

Протестировал на втором телефоне - убогий LG K4 LTE.  Размер кадра здесь тоже  верный:

LG | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти
#36
(Правка: 14:56) 14:48, 11 янв. 2021

Gradius
> Грязный метод: после создания окна нужно ввести задержку хотя бы на пару
> секунд, дать сраной панели уйти с дисплея.
Может проще в цикле постоянно запрашивать размеры окна и динамически под него подстраиваться? Операция не дорогая.

Скачал APK и погонял на Samsung Galaxy A7. Кнопки работают нормально, расположены вроде верно. Игруха сложноватая для игры на тачскрине:) Из багов заметил, что при подлюкчении звука через автомобильную магнитолу по Bluetooth - он идет рывками и иногда пропадает.

>По гайдлайнам системы Android и iOS выход из приложений не должен осуществляться самими приложениями.
В Android предусмотрен выход из последнего (и порой единственного) активити, но приложение фактически не закрывается, а освобождает почти все ресурсы и "висит" в диспетчере задач в мертвом режиме не имея при этом запущенных активити.
C++ поток действительно не правильно убивать через exit(0), надо запросить у активити финиша и когда оно плюнет APP ON DESTROY (пишу по памяти) просто завершить цикл в C++ потоке.

#37
15:03, 11 янв. 2021

Vitorio
> и "висит" в диспетчере задач в мертвом режиме не имея при этом запущенных
> активити.

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

#38
(Правка: 18:22) 18:17, 11 янв. 2021

Vitorio
> Может проще в цикле постоянно запрашивать размеры окна и динамически под него
> подстраиваться? Операция не дорогая.

Нужно окно максимального размера насколько это возможно. Заранее эти размеры неизвестны.

Vitorio
> Из багов заметил, что при подлюкчении звука через автомобильную магнитолу по
> Bluetooth - он идет рывками и иногда пропадает.

Это из-за тормозной аудио-части SDL 2.0.9 - высокая латентность.  Сейчас делаю новый  билд на SDL 2.0.14 - там латентность по-ниже, звуки идут почти без запаздываний.  Музыка должна во всех версиях идти всегда непрерывно!

Gradius
> И ещё заметил, что если присмотреться к пикселам, то они как-будто
> перфорированы по периметру. Что-то типа фильтра. Надо бы проверить хинт
> SDL_WINDOW_ALLOW_HIGHDPI

Наконец-то я понял что это.  Это - дизеринг. Лечится GLES-костылём:

#include <gl.h>

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);

 SDL_Delay(2000);

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

 glDisable(GL_DITHER); //отключаем дизеринг

Решение было найдено здесь: https://discourse.libsdl.org/t/color-dithering-in-android/21782
Хорошо, что не только меня беспокоят такого рода проблемы :)

Рендерер игры использует 16-битное цветовое пространство RGB 5:6:5 - и поэтому формат текстуры 16-битный SDL_PIXELFORMAT_RGB565:

texture=SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGB565,SDL_TEXTUREACCESS_TARGET,SCREEN_WIDTH,SCREEN_HEIGHT);

Иллюстрация эффекта ниже на картинке: верхние фрагменты с дизерингом (видна некоторая мозаичность и зашумлённость на площадях с одинаковым цветом).  Нижние фрагменты - с отключенным дизерингом.

Особенно хорошо видно на бутылках и на правой ноге девушки.

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

Более крупная картинка:

+ С_ДИЗЕРИНГОМ_И_БЕЗ_НЕГО

Дополнительно переделал опрос тачскрина. Теперь  ищутся все тачскрины и опрашивается  их жизнеспособность.

Из насущных проблем остались:

1) Сделать культурный wait, когда меню с кнопками уйдёт с  дисплея.

2) Вычисления, связанные с оптимальными размерами и положением кадра игры и кнопок.

#39
(Правка: 8:09) 7:54, 12 янв. 2021

Gradius
попробуйте добавить обработку эвента SDL_WINDOWEVENT_RESIZED

Рекомендую вам поизучать SDLActivity.java . Там находится весь код интеграции SDL с Андроид ОС. Файл сравнительно небольшой и достаточно понятный. Java придумали люди которые решили исправить ошибки C++. Кое что исправили, но наделали новых. Поэтому если вы понимаете C++ то вы уже по умолчанию понимаете Java.

#40
12:20, 12 янв. 2021

xDimka
> попробуйте добавить обработку эвента SDL_WINDOWEVENT_RESIZED

Пробовал. В 1 случае из 5 - не помогает.  Панель с кнопками может  отъезжать с разной скоростью - иногда мгновенно, а иногда нет.

Проследил и отловил все события при создании окна.  Проверил на двух телефонах - последовательность оказалась одинаковой. Вот она:

1. SDL_WINDOWEVENT_ENTER
2. SDL_WINDOWEVENT_FOCUS_GAINED
3. SDL_WINDOWEVENT_SIZE_CHANGED
4. SDL_WINDOWEVENT_RESIZED

Пока оставил задержку на 2 секунды после создания окна.

xDimka
> Рекомендую вам поизучать SDLActivity.java . Там находится весь код интеграции
> SDL с Андроид ОС. Файл сравнительно небольшой и достаточно понятный.

Возьму на заметку.

xDimka
> Поэтому если вы понимаете C++ то вы уже по умолчанию понимаете Java.

:) Я понимаю только "C" :)
C++ я понимаю ровно только до классов.

Vitorio
> Из багов заметил, что при подлючении звука через автомобильную магнитолу по
> Bluetooth - он идет рывками и иногда пропадает.

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

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

В идеале конечно на BASS переходить, как это сделано в версиях игры под ПК. Там латентность ещё круче!
А на железных консолях она вообще улётная =) Андроидам до такого далеко :)

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

Снова попаболь!!

Не на всех телефонах immersive screen работает, даже на SDL 2.0.14.  Смотрю, всё очень плохо в этом плане.

Результат ещё одного тестера (телефон неизвестен) - справа системные кнопки не отъехали и они сожрали часть экрана. А ведь управляющие кнопки игры могли быть больше!:

x | SDL2 и Android : нормально работает со 2-го  раза и висит в памяти
#42
3:28, 13 янв. 2021
Do not forget to kick ass the pirates of the Guild, who will try to stop you

Это стилизация под машинный перевод как в очень старых играх?

#43
5:05, 13 янв. 2021

TelVolt
> Это стилизация под машинный перевод как в очень старых играх?

Без понятия, спросите об этом у разработчика игры DEN 3D

Однако, я начал смотреть  java-кишки по завету xDimka, SDL 2.0.14, в 2.0.15 тоже самое.

И вот что я вижу:

+ ОБКОСТЫЛЕННЫЙ_КОД
Ensure we don't return until the resize has actually happened, or 500ms have passed.

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

Попробую увеличить время.

#44
6:29, 13 янв. 2021

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


> Пересобрал новый билд, в нём используется последняя стабильная версия SDL на сегодня с минимальными задержками звука. По идее теперь должно быть лучше:
>> Скачать APK на тестирование можно здесь:
>https://misterpix.itch.io/space-pirate-cobra
Протестирую, отпишусь.

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