Проблемы с задержкой сенсорного ввода в Android для игры, требующей времени. Есть ли задержка перед вызовом onTouchEvent? - PullRequest
2 голосов
/ 17 ноября 2011

Итак, мы работаем над android-версией игры для iPhone Snake Race (это крутая игра). Тем не менее, мы, кажется, получаем задержку на сенсорных входах, достаточно большую, чтобы изменить ситуацию. (Змея может повернуть на шаг позже, чем вы предполагали) После того, как вы почти привыкли к версии для Android, версия для iPhone выглядит как благословение.

Вопрос в том, есть ли задержка со стороны андроида в вызове метода onTouchEvent ()? (Я использую Samsung Galaxy S2) Если так, есть ли какие-нибудь хитрые уловки, чтобы обойти проблему? (Даже если это означает использование NDK)

Это текущая реализация сенсорной обработки:

public boolean onTouchEvent(final MotionEvent event) {      
    int action = event.getAction();
    if(action == MotionEvent.ACTION_DOWN || 
            (action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN){     
        Run run = GameVars.run;

        if(run != null){
            if(run.paused){
                run.paused = false;
            }else{
                if(event.getX(action >> MotionEvent.ACTION_POINTER_ID_SHIFT) < GameVars.width/2){
                    run.addTap(-1);

                }else{
                    run.addTap(1);

                }
            }
        }
        return true;
    }
    return false;
}

Это метод addTap:

public void addTap(int newDir) {
    if(newDir == -tapDir){
        taps++;
        tapDir *= -1;
    }
}

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

Все работает нормально и надежно, но есть постоянная задержка (возможно, 2-3 кадра, что достаточно, чтобы сделать iPhone змею серьезно более маневренным).

Любая обратная связь приветствуется!

Ответы [ 4 ]

2 голосов
/ 30 августа 2012

Я пришел к выводу, что это действительно задержка со стороны устройства.Это не большой, но он есть, и он сильно варьируется между различными телефонами Android.Моя Galaxy S2 имеет большую задержку, чем большинство новых моделей HTC, которые я тестировал.Я также создал новый проект, в котором сенсорный переключатель переключает фон / воспроизводит звук (я знаю, что это имеет дополнительную задержку) и т. Д. И я не могу найти ничего, что могло бы обойти проблему.

1 голос
/ 18 ноября 2011

Это не решение, а прямой ответ на ваш вопрос: нет, на стороне андроида нет задержки для сенсорного события.

Где-то в вашем коде источник проблемы.Это могут быть разные вещи.

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

Другая возможность заключается в том, что ваши элементы управления не касаются.Сенсорные области маленькие?У iPhone отличный и отзывчивый сенсорный экран, но не все устройства Android созданы с одинаковым качеством.

Хотелось бы, чтобы я знал конкретную причину, но я могу позволить вам безопасно исключить возможность "его просто чертовски андроид",Операционная система не вызывает задержку.

1 голос
/ 08 августа 2012

Я думаю, что это проблема Android или устройства.У меня такие же проблемы с устройствами Galaxy Tab 10.1, Galaxy Note и Galaxy S II при разработке приложений на основе NDK и GLES, то есть, в отличие от устройств iOS, задержка между фактическим касанием и получением события на всех «галактиках» зависит от текущего использования GPU / CPU, даже если основной поток (обработка событий) ничего не делает, за исключением обработки этих событий, а все рендеринг и другие действия выполняются в отдельном потоке ...

0 голосов
/ 17 ноября 2011

Убедитесь, что сборщик мусора не запускается при обработке события click. Если это так, отключите сборку мусора, когда ваша игра запущена. В противном случае вы делаете что-то дорогое в своем цикле пользовательского интерфейса, которое вызывает заикание. Профилирование вашего приложения должно выявить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...