Java с помощью контроллера JInput, улучшить производительность - PullRequest
0 голосов
/ 10 января 2020

Я пишу видеоигру Java, которая хорошо работает с клавиатурой. Хочу также добавить поддержку джойстика и нашел удобный класс JInput .

Однако (по-видимому) в отличие от ввода с клавиатуры, который автоматически запускает событие, получение ввода с джойстика / геймпада требует постоянной проверки событий нажатия кнопки.

Из-за этого я написал следующую задачу таймера который ищет каждые 50 миллисекунд для ввода:

    Joystick_Input_Thread.schedule(new TimerTask() {
        @Override
        public void run() { 

            // If at least one controller was found we start firing action for the keys.
            try {
                if(!foundControllers.isEmpty()) {

                    clearControllerData(activeAction);
                    getControllerData(activeAction);

                }
            } catch (Exception e) {
                // Hmm.. crash due to initialization error probably
                System.out.println("JOYSTICK THREAD INITIALIZATION ERROR");
                this.cancel();
            }

        }
    }, 0, 50);

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

Реальная проблема заключается в весе метода getControllerData() , Из-за того, как был спроектирован JInput (если я что-то не так понял), вам приходится перебирать каждую кнопку на контроллере и проверять каждую.

Это выглядит примерно так:

// go through all components of the controller.
Component[] components = selectedController.getComponents();


// iterate through all the controls
for(Component c : components) {

    Component.Identifier componentIdentifier = c.getIdentifier();

    // check if the component is a BUTTON
    if(componentIdentifier.getName().matches("^[0-9]*$")) { 
       // check if it is pressed
       // ...
    } 

    // check if the component is a HAT SWITCH
    else if (componentIdentifier == Component.Identifier.Axis.POV) {
       // check if it has moved
       // ...
    }

    // check if the component is an AXES
    else if (component.isAnalog()) {
       // check if it has been activated
       // ...
    }

    // act on that...
}

Это невероятно многословно, потому что для каждого компонента на джойстике / геймпаде я должен A) выяснить, что это такое, B) выяснить, была ли она нажата, и, наконец, C) запустить событие действия.

Итак, мои вопросы: в целом, как я могу улучшить общую производительность ввода jostick?

Есть ли более простой способ выяснить, была ли нажата кнопка (вместо анализа компонента, чтобы выяснить, что это за тип и затем проверяется, нажата ли она)?

Я вижу ключевую слабость в частой итерации. Какова разумная ставка refre sh для проверки ввода? Есть ли способ получить jinput без всех циклов?

Наконец, есть ли другие сторонние классы Java, которые лучше разработаны для обработки этого ввода?

...