
그림 1.x좌표가 비슷하도록 멀티 터치를 했을 때 x 좌표가 하나로 고정되는 현상
그림 2. 멀티 터치를 했을 때 실제 터치의 위치와 핸드폰에서 인식하는 위치가 엇갈리는 경우.
이 문제에 대해서 사용자끼리는 의견이 양분된걸로 알고있습니다.
이 문제에 대해서 HTC와 TGS는 소프트웨어 문제일 것이라고 추측한다고 알고 있습니다.
저는 이 문제에 대해 호기심이 발동해서 저 나름대로 테스트를 해봤습니다.
처음에는 소프트웨어 문제인 줄 알았습니다.
아.. 내가 좋아하는 구글이.. 이런 바보같은 프로그램을 만들다니..
...?
이런 생각에서, 구글이 프로그램을 이런식으로 만들었을리가 없잖아? 라는 생각으로 바뀌었습니다.
궁금하니까 테스트를 해보았어요.
제 주변에 있는 안드로이드 기기를 구해서 테스트 해보았습니다.
기기는 다음과 같습니다.
---기기명(안드로이드 버전)---
1. 넥서스원(2.2.1)
2. 갤럭시 플레이어(2.2.1)
3. 안드로원(2.2)
4. 이자르(2.? 이건 후배꺼 써봤는데 버전을 모르겠네요)
이렇게 총 4개의 기기를 만져봤습니다.
멀티 터치 테스트에 사용한 어플은 "Multitouch Visualizer Test" 입니다.
넥원에서는 이렇게 되죠?
http://www.youtube.com/watch?v=6O_8M71KPFE (누군가가 올려놓은 동영상..)
넥원에서는 아시다시피 터치하고 있는 가로 세로가 동일한 선상에 놓이게 되면 인식이 바보가 됩니다.
첨부한 그림을 보면, 가로둘이 2개, 세로줄이 한 개 입니다.
다시 말하면 두 개의 x좌표가 근접할 시에 아예 동일하게 인식해버리는 문제가 발생합니다.
두 개의 터치의 가로나 세로의 선이 근접할 때, 아예 붙어버려서 인식하는건 넥서스원 사용자라면 대부분 아실거예요.
또는 동영상의 6초에 보이는 것 처럼 (첨부 사진2), 실제로 누른 것과, 화면에 인식한게 x좌표든 y좌표든 반대가 되는 현상이 나타납니다.
뭔가 값이 꼬인것 처럼 보입니다.
다른 안드로이드 기기도 이런 문제가 있을까요? 궁금합니다.
그래서 이자르로 테스트 해보았습니다.
이자르에서도 두 개의 점까지 인식이 됩니다.
하지만 두 개의 점이 동일한 선 상에 놓이게 됐을 때 서로 간섭한다던가 하는 증상이 없습니다.
두 개의 점이 완전히 독립해서 부드럽게 인식합니다.
이자르에서는 2개의 터치를 인식하는데 문제가 없습니다.
오호라?
안드로원(2.2)으로 테스트해보았습니다.
두 개의 점까지 인식이 됩니다. 이 녀석은 두 개의 터치가 가까워지면, 움직이는 녀석이 고정되있는 점을 밀어냅니다.
마치 당구공처럼요.. -_-;
넥서스원처럼 인식이 꼬이는 상황을 방지하기위해 하드웨어에서든 소프트웨어에서든 처리를 하는 것 같습니다.
갤플로 테스트를 해봤습니다
갤플은 터치가 5개까지 지원됩니다.
두 개의 터치까지 지원되는 안드로이드의 터치 프로그램을 5개까지 인식되도록 하기 위해서는 당연히 손을 댔을겁니다.
5개의 터치가 서로 간섭없이 잘 동작합니다.
(..이건 상관없지만) 아이폰으로도 테스트 해봤습니다.
터치가 5개까지 지원되고, 서로 간섭없이 잘 동작합니다.
이렇게 서로 다른 안드로이드 기기 4개로 터치 테스트를 해봤습니다.
추측컨데 그 중 3개의 기기는 같은 소프트웨어를 사용했을테구요. 갤플은 특별히 손을 댔을 것입니다.
그럼에도 다 다른 반응을 보이는 것은 왜 일까요?
저는 갤플을 제외한 3개의 기기에서 사용하는 멀티터치관련 소프트웨어가 같고 하드웨어(터치패널)가 다르다 라고 가정해볼게요.
사용자가 스크린을 터치합니다. 핸드폰에서는 사용자의 정전기를 감지해서 그 위치 값을 소프트웨어에 전해줍니다.
멀티터치 테스트 프로그램은 핸드폰으로부터 전달받은 좌표 값을 프로그램에서 보여줍니다.
(이번에는 하드웨어, 소프트웨어 관점에서)
하드웨어로 감지한 값은 소프트웨어로 전달되고, 그 값을 이용해서 정해진 데이터 처리 과정을 수행합니다.
이상합니다.
소프트웨어가 같은데 결과가 다르게 나오는 듯한 느낌입니다.
왜그럴까요?
애초에 값을 전달하는 매개체인 하드웨어가 값을 제대로 전달하지 못하기 때문입니다.
하드웨어에서 소프트웨어로 값을 전달해주기 전에 사용자가 터치한 값을 제대로 인식하지 못했다라고 하는게 더 정확한 표현이 될 것 같아요.
넥서스원에서는 2개의 터치가 서로 근접할 때 x좌표 또는 y좌표를 헷갈려해서 그림 2와 같은 결과가 나오는 것 같습니다
왜 하필 넥서스원에서만..??
손가락으로 핸드폰을 터치했을 때 그 위치는 점으로 인식되는게 아니라 동그란 영역으로, 손가락이 직접 터치 패널에 닿는 만큼 인식이 됩니다.
넥서스원에서는 그 인식되는 부분이 X축이나 Y축에서 겹쳤을 때 위치정보가 엉망 생성되고 그 엉망인 정보가 소프트웨어로 보내진다고 생각합니다.
이 이론은 확인할 수 있는 방법이 있어요.
멀티 터치 테스트 프로그램에서 두 개의 터치가 서로 X축, Y축이 간섭되지 않는 위치에서 빙빙 돌려보면 손가락이 움직이는 대로 반응하는걸 확인할 수 있습니다.
이로부터 넥서스원에서 사용하는 소프트웨어는 2개의 터치 값이 제대로 전달되었을 때, 오류없이 동작하는 잘 만들어진 프로그램이라는 걸 알 수 있습니다.
"핀치 투 줌이니까 멀티터치는 원래 안된다" 라고 말씀하시면 별로 할 말은 없지만..
두 개의 터치가 서로 간섭이 없을 때에는 핀치 투 줌 주제에 멀티터치가 잘 되긴 합니다.
왜 이렇게 됐을까요.. 음..
제품을 만들기 전 테스트 기기에서 테스트를 제대로 안했을까요?
아마 샘플 기기를 만들 때와 양산과정에서 만든 기기의 터치 패널이 다르지 않았을까 라는 추측을 해봅니다.
아마도 샘플 기기에서는 문제 없이 동작했을거예요. 무리없이 통과가 됐을겁니다.
그럼 이제 제품을 팔기 위해서 양산을 할 때입니다. 이 때는 CP (Cost Performance, 가격대 성능비)를 무시할 수 없습니다.
아마도 CP 때문에 좀 더 싸구려 패널 쓰면서 사용자가 불편을 겪지 않는건가라는 추측을 해봅니다.
대충 사용해보니 잘 동작했겠지요.
넥서스원, 싱글터치는 그럭저럭 동작합니다.
(그래도 여전히 터치오류는 존재합니다.)
뭐.. 제 개인적인 추측일 뿐이예요 -_-; 진실은 저 너머에.. HTC만이 알겠지요.
마찬가지로 안드로원 말이예요.
2개의 터치가 서로 간섭될 때, 넥서스원같은 오류를 범하지 않기 위해 먼저 인식된 터치를 밀어버리는;;
그러한 처리를 터치 패널자체에서 수행하는게 아닌가..하고 생각합니다.
이자르는 위의 두 핸드폰보다는 조금 좋은 패널을 썼기 때문에 사용자가 터치 한 값을 제대로 소프트웨어로 전달하는게 아닐까 생각합니다.
그래서 전 넥서스원에서 멀티 터치가 제대로 안되는게 하드웨어 문제라고 생각합니다.
터치가 3개 4개 많이 되는건 바라지도 않아요,
두 개면 충분합니다.
그런데 이런 상태로는 뭐..
아이폰에서 흥하고 있는 TAP SONIC 같은 류의 게임..
멀티터치가 필요한 게임은 넥서스원으로 할 수 없다는 슬픈 결론이 도출되네요.
말이 기네요...;;
읽어주셔서 고맙습니다.
..htc로 메일보내볼까요?
접근은 잘 되신 것 같은데
좀더 정리를 해 드리면 넥서스원에서는 Synaptics사의 Clearpad 2000이라는 터치 컨트롤러를 사용합니다. 터치패널에서 직접 소프트웨어로 데이터가 전달이 되는 것은 아니고 터치 컨트롤러를 통하고 안드로이드는 이 컨트롤러의 드라이버를 작성하여 인식하게됩니다.
현재 넥서스원의 멀티터치 오류에 대한 정리된 의견은 이 터치 컨트롤러의 한계라는 것이 일반적입니다.
즉 터치의 상태를 전달하는 터치 컨트롤러에서 OS쪽으로 잘못된 데이터를 전송한다는 것이죠.
즉 컨트롤 IC를 변경하지 않는한 멀티터치에 대한 근본적 치유는 어려울 것으로 생각되네요..(이미 문제의 IC 제조사는 멀티터치가 되는 IC를 출시한 상태입니다.)
소프트웨어를 활용하여 개선할 여지는 있겠지만 HTC나 구글에서는 신경을 쓰지 않는 듯 합니다.
말 그대로 하드웨어가 안되는 것을 소프트웨어로 개선한다는 것은 쉬운일이 아니죠.
해당 IC에 대하여 좀더 알아보고자 구글링을 했으나 데이터시트를 찾지는 못했습니다.
만일 문제의 IC의 데이터시트를 찾는다면 좀더 명확한 답변이 나올수 있을 것이라 판단되네요.
비전문가가 많은 커뮤니티에 올리는 글에 컨트롤러라니 드라이버라니 라는 말을 쓰면 읽는 분들께서 글을 읽기가 쉽지 않을거라고 생각했어요.
그래서 터치패널 + 터치 컨트롤러는 그냥 하드웨어라고 뭉뚱그려 이야기했고
하드웨어와 I/O통신하기위해 작성되는 드라이버를 작성하고, 이 드라이버를 통해서 값을 얻는 프로그램은 그냥 소프트웨어라고 뭉뚱그렸구요
4가지 단계를 2개로 줄이면 읽기도 편하고 잘 모르는 비전문가라도 그럭저럭 읽히지 않나 싶어서 ^^;
지적 고맙습니다 :D
그리고 하나 더요.
하드웨어가 지원하지 않는 기능을 소프트웨어적으로 구현하는건 가능해요.
쉬운 예제로 락플레이어가 avi 포맷의 동영상을 재생시켜주죠
넥서스원에서 mp4 형태의 동영상은 CPU에서 처리하지 않고 하드웨어 디코딩으로 처리해서 굉장히 빠른 속도로 처리할 수 있어요
반면에 avi 포맷은 디코딩할 하드웨어가 없기 때문에 CPU로 처리하는게 락플레이어죠.
이런건 가능해요.
그런데 하드웨어가 엉터리로 동작하는걸 소프트웨어적으로 처리한다?
이건 쉬운게 아니라 불가능해요.
그냥 기능에 장애가 있는채로 쓸 수 밖에 없는 문제예요.
터치패널에서 연속적으로 발생하는 데이터가 컨트롤러를 통해서 드라이버로 전달되고 드라이버는 그 값을 읽어서 메모리에 쓰고 소프트웨어는 메모리의 값을 읽고 쓰며 처리하는데
처음부터 잘못된 값이 컨트롤러에서 발생하잖아요?
이걸 드라이버수준에서 "완벽히" 처리할 수 있는 방법이 없죠.
컨트롤러라 "A" 라고 데이터를 줄 때 드라이버는 그 "A"를 메모리에 잘 넣어두면 되요. (읽어올 때도 마찬가지..)
근데 컨트롤러가 "A"라고 줬을 때 드라이버가 만약 "이게 정말 A인가? 확실한가? A가 아닐 가능성은? A가 될 수 있는 근거는?" 등등을 따지며 만들면 드라이버로서의 의미가 퇴색되죠.
이전의 값을 기억해서 현재의 값을 검증하는건 한계가 있어요.
드라이버의 처리 속도가 느려지는건 논외로 하더라도 말이죠 -_-;
에고 ;;
저는 현 상태에 대해서만 글을 작성했고 별다른 구글링이나 칩같은건 찾아보지 않았어요
찾아보는 저도 괴롭고, 그런 것 까지 반영한 글을 쓰면 그건 자유게시판에 올릴만한 글이 아니라 딱딱한 보고서가 되겠죠
널리 읽힐 수 없는, 소수만이 읽을만한 그런 보고서요 @_@;;
HTC가 문제를 알면서도 방관하고 있다고 생각하니 괴씸하네요 ! =_=




와 정말 잘 정리해주셨네요 일리가 있는듯!!