Gradius
> Попробовал ещё раз. Корректного закрытия не вышло.
Странно, у меня с exit всё стало работать. Может какой то пост-глюк вылетел у вас из-за старого процесса.
А может в 2.0.9 это даже и починили уже. Хотя вряд ли, т.к. вопрос очень старый и известный.
Но у меня работает с exit как положено работать приложению на Андроиде - его можно и отправить в сон и нажатием на свою кнопку "выход" выйти так и нажатием на системную кнопку "назад" тоже выйти. Это как бы норма для Андроида.
=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 - так это переписанная аудио-часть - они используют новый драйвер с низкой звуковой латентностью! И это меня радует: теперь серии быстроповторяющихся коротких звуков звучат в игре без запаздываний! :)
Gradius
> Что понимается под выходом?
Именно полное закрытие приложения из списка запущенных и отложенных задач.
То что и должно происходить при выходе из ф-ии main (например при получении эвента SDL_Quit) как SDL то предполагает.
И почему то без принудительного exit в конце main оно ведёт себя неправильно и это очень старая проблема. Приложение застревает в списке открытых и при попытке запустить снова сыпет ошибками и т.п.
Но с exit всё ок. Подозреваю что у вас просто приложение уже было в состоянии застревания или было запущено через инсталлятор (а это сразу возможные проблемы в глобальном состоянии приложения как я тоже выше описывал) и потому показалось что метод не сработал.
Я когда какие то баги нахожу стараюсь сперва сам выяснить откуда у них предположительно растут ноги. Например: https://gamedev.ru/code/forum/?id=248709&page=2&m=5090494#m22
И пишу багрепорт им в официальный багтрекер.
Это позволяет во первых самому что-то поправить до выхода новых версий, а во вторых ускоряет их появление.
Видео работы порта игры для телефона Redmi 8:
Скачать APK на тестирование можно здесь: https://misterpix.itch.io/space-pirate-cobra
Из новых найденных багов SDL 2.0.9:
1) У второго ётафона не работают сенсорные кнопки. Возможно это связано с неактивным первым тачем, когда их больше одного.
2) Неверно определяется бОльшая сторона экрана(она опять меньше на ширину полоски меню), если при запуске приложения держать телефон в альбомной ориентации. Из-за этого корректность определения регионов касания тача опять съезжает (так как координаты скорее всего у тача пронормированы по правильному значению размера экрана)
Если приложение запустить, держа телефон в портретной ориентации, то бОльшая сторона экрана определяется верно.
Проверил попутно SDL 2.0.14 : частые короткие звуки в игре действительно стали играть почти как нужно (без ощутимых на слух задержек)
По гайдлайнам системы Android и iOS выход из приложений не должен осуществляться самими приложениями. Вы не должны делать у себя какие то кнопки «Выход» и тому подобное. Для того чтобы снять приложение у пользователя достаточно функций операционной системы или вас может прибить ОС при недостатке памяти.
Последнюю версию sdl мы можете выкачать из mercury или с зеркал на github, наверняка ваши проблемы там уже решили. А если нет, в самом sdl кода минимальное количество, в нем не сложно разобраться и что то дописать что вам нужно.
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. Размер кадра здесь тоже верный:
Gradius
> Грязный метод: после создания окна нужно ввести задержку хотя бы на пару
> секунд, дать сраной панели уйти с дисплея.
Может проще в цикле постоянно запрашивать размеры окна и динамически под него подстраиваться? Операция не дорогая.
Скачал APK и погонял на Samsung Galaxy A7. Кнопки работают нормально, расположены вроде верно. Игруха сложноватая для игры на тачскрине:) Из багов заметил, что при подлюкчении звука через автомобильную магнитолу по Bluetooth - он идет рывками и иногда пропадает.
>По гайдлайнам системы Android и iOS выход из приложений не должен осуществляться самими приложениями.
В Android предусмотрен выход из последнего (и порой единственного) активити, но приложение фактически не закрывается, а освобождает почти все ресурсы и "висит" в диспетчере задач в мертвом режиме не имея при этом запущенных активити.
C++ поток действительно не правильно убивать через exit(0), надо запросить у активити финиша и когда оно плюнет APP ON DESTROY (пишу по памяти) просто завершить цикл в C++ потоке.
Vitorio
> и "висит" в диспетчере задач в мертвом режиме не имея при этом запущенных
> активити.
Действительно, причём переход в него запускает уже новый экземпляр Activity и всё работает ожидаемо.
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);
Иллюстрация эффекта ниже на картинке: верхние фрагменты с дизерингом (видна некоторая мозаичность и зашумлённость на площадях с одинаковым цветом). Нижние фрагменты - с отключенным дизерингом.
Особенно хорошо видно на бутылках и на правой ноге девушки.
Более крупная картинка:
Дополнительно переделал опрос тачскрина. Теперь ищутся все тачскрины и опрашивается их жизнеспособность.
Из насущных проблем остались:
1) Сделать культурный wait, когда меню с кнопками уйдёт с дисплея.
2) Вычисления, связанные с оптимальными размерами и положением кадра игры и кнопок.
Gradius
попробуйте добавить обработку эвента SDL_WINDOWEVENT_RESIZED
Рекомендую вам поизучать SDLActivity.java . Там находится весь код интеграции SDL с Андроид ОС. Файл сравнительно небольшой и достаточно понятный. Java придумали люди которые решили исправить ошибки C++. Кое что исправили, но наделали новых. Поэтому если вы понимаете C++ то вы уже по умолчанию понимаете Java.
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 переходить, как это сделано в версиях игры под ПК. Там латентность ещё круче!
А на железных консолях она вообще улётная =) Андроидам до такого далеко :)
Снова попаболь!!
Не на всех телефонах immersive screen работает, даже на SDL 2.0.14. Смотрю, всё очень плохо в этом плане.
Результат ещё одного тестера (телефон неизвестен) - справа системные кнопки не отъехали и они сожрали часть экрана. А ведь управляющие кнопки игры могли быть больше!:
Это стилизация под машинный перевод как в очень старых играх?
TelVolt
> Это стилизация под машинный перевод как в очень старых играх?
Без понятия, спросите об этом у разработчика игры DEN 3D
Однако, я начал смотреть java-кишки по завету xDimka, SDL 2.0.14, в 2.0.15 тоже самое.
И вот что я вижу:
Тоесть они наивно полагают, что пол-секунды им хватит, чтобы метрики дисплея актуализировались. Но на самом деле, несколько раз наблюдал, когда панель справа отъезжает на бОльшее время, и освободившаяся часть снова не учитывается рендерером :)
Попробую увеличить время.
Gradius
> справа системные кнопки не отъехали и они сожрали часть экрана. А ведь
> управляющие кнопки игры могли быть больше!
До Android 4.4 immersive mode не доступен и софтовые кнопки не убрать. Может на этом тестовом девайсе версия ниже 4.4? И даже если это так, то странно, что SDL не учитывает, что кнопки не скрылись в принципе.
> Пересобрал новый билд, в нём используется последняя стабильная версия SDL на сегодня с минимальными задержками звука. По идее теперь должно быть лучше:
>> Скачать APK на тестирование можно здесь:
>https://misterpix.itch.io/space-pirate-cobra
Протестирую, отпишусь.