micro-artwork / xi2ds

Utility to control PlayStation Remote Play with XBOX controller instead of DualShock 4 controller.
MIT License
27 stars 3 forks source link

fix: polling rate doesn't work 120Hz #2

Closed sphawk closed 2 years ago

sphawk commented 2 years ago

polling 이 60Hz 로 밖에 동작하지 않아서, 이래저래 테스트 하다 보니 문제를 두가지 발견했습니다.

  1. Sleep 이 15.4ms 단위로 동작 -> timeBeginPeroid 를 호출해서 해결
  2. 특정 case 에 polling rate가 심각하게 저하되는 것을 확인 -> Input Test 창을 열고 있을 때 발생 -> UI 갱신이 너무 느려서 발생하는 것으로 확인 -> UI 갱신 부분을 별도 타이머로 돌리고, polling 하는 부분에서 분리

특별한 코드 가이드라인 없이 수정한 거라서 코드가 맘에 드실 지는 모르겠네요. 맘에 안 드시면 적당히 close하셔도 무방합니다.

micro-artwork commented 2 years ago

미쳐 신경쓰지 않는 부분을 먼저 관심 갖아주시고 PR 요청해주셔서 감사합니다. 간단히 검토 하였을 때는 반영해도 크게 문제는 없을 것 같은데요. 혹시 모르니 제가 주중으로 확인 및 테스트를 해보도록 하겠습니다.

micro-artwork commented 2 years ago

Timer accuracy 관련 이슈를 검토 해보았습니다.

다양한 방법으로 스레드 호출 또는 주기적인 이벤트 테스트를 진행했습니다. Thread Timer, Sleep, Delay 모두 millisecond 단위에서 정확도가 매우 떨어지고 호출만으로도 min 14 ~ 15ms를 소모함을 확인하였습니다. 혹시나 싶어서 Rx를 활용한 interval 테스트도 하였으나 어떤 방법을 쓰던지 100 Hz를 넘어가는 반복 작업에는 적합하지 않음을 확인했습니다.

다른 방법도 검토하였으나 CPU 자원소모가 커지는 것 같아서 실질적 사용은 어려운 것으로 판단하였고

PR 해주신 Multimedia Timer API를 사용하는 것이 최소/최대 타이머 해상도 조절로 상대적으로 정확한 Sleep이 가능하고 (그래도 여전히 10% 오차는 확인이 됩니다) periodic 이벤트 지정도 가능한 것을 확인했습니다.

테스트를 위해서 이런저런 테스트와 확인을 하다보니 이슈 개선 이전에 프로젝트 전체적으로 리팩토링을 해야할 것으로 판단했습니다. 그렇다 보니 PR 반영을 하더라도 결국 모두 뒤집어야 할 것 같아서 반영 대신 제안/제기 해주신 문제를 issue로 등록하고 개선하는 방향 진행할까 합니다.

아마 개인 사정상 단기간 내에는 완료는 어렵지만 가급적 달을 넘기지 않으려고 합니다. 별도의 시간을 써주셨는데 PR 반영을 드리지 못함에 양해를 부탁드리며, 다시한번 관심 감사드립니다. 👍