Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.12.2018, 08:21
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Зависания при нажатии на экран
Почему то при обработке функции которая отвечает за касания на экране происходят подвисания. У меня есть игра, которая каждый кадр вызывает функцию mobileController, она проверяет если нажатие на экране. Вот код:
/
var button1 = undefined,
  button2 = undefined;

function mobileController() {
  var el = document.getElementsByTagName('body')[0];


  el.addEventListener("touchstart", handleStart, false);
  el.addEventListener("touchend", handleEnd, false);
  el.addEventListener("touchmove", handleMove, false);

  function handleStart(evt) {
    var touches = evt.changedTouches;
    if (window.innerWidth / 2 < touches[0].pageX)
      button1 = true;
    button2 = false;
    if (window.innerWidth / 2 > touches[0].pageX) {
      button2 = true;
      button1 = false
    }
  }
  
    function handleEnd(evt) {
      var touches = evt.changedTouches;
      if (window.innerWidth / 2 < touches[0].pageX)
        button1 = false;
      button2 = false;
      if (window.innerWidth / 2 > touches[0].pageX) {
        button2 = false;
        button1 = false
      }
    }

    function handleMove(evt) {
      var touches = evt.changedTouches;
      if (window.innerWidth / 2 < touches[0].pageX)
        button1 = true;
      button2 = false;
      if (window.innerWidth / 2 > touches[0].pageX) {
        button2 = true;
        button1 = false
      }

    }
    
};


button1 и button2 отвечают за передвижение персонажа вправо и влево.Причём в начале игры всё работает нормально, но постепенно начинает падать fps.

Подскажите как можно оптимизировать данный код?
Ответить с цитированием
  #2 (permalink)  
Старый 11.12.2018, 08:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

Сообщение от Retro_1477
button1 и button2 отвечают за передвижение персонажа вправо и влево
возможно проблема в функции анимации движения, а не в том что вы показали.
Ответить с цитированием
  #3 (permalink)  
Старый 11.12.2018, 10:18
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Сообщение от Retro_1477
У меня есть игра, которая каждый кадр вызывает функцию mobileController
Или рони не увидел косяка, или я не прав, однако...
Ваша функция "mobileController" каждый раз, как вы её вызывает вешает на "body" по 3 обработчика.
Если эта функция вызывается 60 раз в секунду, то за эту секунду на body будет висеть уже 60*3=180 обработчиков событий.
Если после секунды ожиданий нажать куда-нибудь на страницу, то будут вызваны по очереди все 60 обработчиков для каждого из прослушиваемых событий.

Да и вместо трех обработчиков можно использовать 1, который также можно "упростить" в 2 раза.
function handler(e) {
    button2 = !(button1 = (window.innerWidth / 2) < e.changedTouches[0].pageX);
}

Последний раз редактировалось Nexus, 11.12.2018 в 10:24.
Ответить с цитированием
  #4 (permalink)  
Старый 11.12.2018, 11:17
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Nexus прав, слишком часто вызывается обработчик, сейчас попробую что-нибудь сделать
Ответить с цитированием
  #5 (permalink)  
Старый 11.12.2018, 11:23
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

нужно убрать обработчики из функции, но при этом они перестанут работать хммммм....
Ответить с цитированием
  #6 (permalink)  
Старый 11.12.2018, 11:40
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Сообщение от Retro_1477
нужно убрать обработчики из функции, но при этом они перестанут работать
Так вы 1 раз их повешайте.
Ответить с цитированием
  #7 (permalink)  
Старый 11.12.2018, 11:47
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Спасибо вам за помощь!
Код теперь выглядит так
var button1, button2;

var el = document.getElementsByTagName('body')[0];

  el.addEventListener("touchstart", handler, false);
  el.addEventListener("touchend", handleEnd, false);
  el.addEventListener("touchmove", handler, false);

function handler(e) {
    button2 = !(button1 = (window.innerWidth / 2) < e.changedTouches[0].pageX);
};
function handleEnd(e) {
  var touches = e.changedTouches;
  if (window.innerWidth / 2 < touches[0].pageX)
    button1 = false;
  button2 = false;
  if (window.innerWidth / 2 > touches[0].pageX) {
    button2 = false;
    button1 = false
  }
};
Ответить с цитированием
  #8 (permalink)  
Старый 11.12.2018, 11:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069


Сообщение от рони
возможно проблема в функции анимации движения, а не в том что вы показали.
не нужно никаких body.addEventListener, достаточно
Сообщение от Nexus
function handler(e) { button2 = !(button1 = (window.innerWidth / 2) < e.changedTouches[0].pageX);}
и даже два button лишнее
Ответить с цитированием
  #9 (permalink)  
Старый 11.12.2018, 11:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

Retro_1477,
handleEnd зачем условие , если всегда
Сообщение от Retro_1477
button1 = false; button2 = false;
Ответить с цитированием
  #10 (permalink)  
Старый 11.12.2018, 12:11
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Рони, мне нужно отслеживать момент когда палец отходит от экрана.
Если я убираю handleEnd то персонаж будет бегать постоянно при касание на левую или правую часть экрана
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При нажатии enter срабатывал :active Иван8718284019284759670 Элементы интерфейса 1 25.08.2017 03:08
Замена цвета в body при нажатии div id 3uk Элементы интерфейса 2 20.08.2017 11:27
Смена картинок при нажатии Antonjrjr Элементы интерфейса 0 29.05.2017 11:57
при нажатии на play развернуть на весь экран видео tager3 Events/DOM/Window 1 28.05.2016 02:01
SyntaxHighlighter подсветка при нажатии faraday Общие вопросы Javascript 3 31.03.2012 23:43