2 개의 스레드가있는 openGL 앱이있는 경우 (내가 생성하지 않은 경우 표준 '제공된'스레드입니다). 그 존재 :
그리고 내 렌더링 스레드에서 다음과 같이 스프라이트를 그립니다. (표시된 방법은 내 방법입니다)
sprite.draw(); //This will draw the sprite at it's own internal X and Y coordinates
이제 UI 스레드에서 현재 손가락 위치를 캡처합니다. (onTouchEvent (MotionEvent 이벤트) 내에서 다음이 발생합니다.) ...
case MotionEvent.ACTION_MOVE: {
sprite.setX(event.getX());
sprite.setY(event.setY());
}
그래서, 내 스프라이트는 손가락으로 화면 주위로 드래그 할 수있는 곳에 그려집니다.
그러나 분명히 두 스레드가 다음과 같이 '교대로'실행된다는 보장은 없습니다.
UI Thread : 손가락 위치 캡처 및 설정 (X : 10, Y : 10)
렌더러 스레드 : 10, 10에서 그리기
UI Thread : 손가락 위치 캡처 및 설정 (X : 22, Y : 31)
22, 31 등에서 렌더러 스레드 그리기 ...
위는 훌륭하지만 이것이 발생하면 어떻게됩니까?
UI Thread : 손가락 위치 캡처 및 설정 (X : 10, Y : 10)
렌더러 스레드 : 10, 10에서 그리기
Renderer Thread : Draw at 10, 10 << 손가락이 물리적으로 다른 위치로 이동하여 개체의 화면 위치와 화면의 손가락의 물리적 위치 사이에 오프셋이 발생하더라도 동일한 위치에 다시 그립니다.
UI Thread : 손가락 위치 캡처 및 설정 (X : 22, Y : 31)
22, 31 등에서 렌더러 스레드 그리기 ...
이것은 물체의 그림에서 '잘라 내기'를 유발하는 것처럼 보일 수 있습니다.
그래서, 내가 무엇을 요구하고있어,이되는 어떤 힘에 대한 방법은 어떻게 든 검색 할 렌더링 스레드 실제 현재의 물리적 위치 그것을 그립니다 전에 현재 다운 포인터 / 손가락을? 아니면 문제에 대한 다른 해결책이 있습니까? (문제는 렌더링 스레드가 항상 이전 위치가 아닌 현재 위치에 액세스해야한다는 것입니다.)
짧은 대답은 아니오입니다!
발생한 문제는 병렬로 실행되는 두 개의 스레드로 인한 것이 아닙니다. 대신,
첫 번째 문제에 대한 해결책은 앱을 프로파일 링하고 지연 시간을 줄이는 것입니다. 60fps의 공칭 프레임 속도에 도달 해보세요.
그러나 두 번째 문제에 대한 해결책은 작은 트릭 일뿐입니다. 정확히 터치 포인트가되도록 스프라이트의 위치를 조정하는 대신 터치 포인트 쪽으로 이동하도록합니다 .
대략적인 구현은 다음과 같습니다.
case MotionEvent.ACTION_MOVE: {
sprite.setNewX(event.getX());
sprite.setNewY(event.setY());
}
스프라이트 클래스에 다음을 추가하십시오.
private int mNewX, mNewY;
public void setNewX(int x){
mNewX = x;
}
public void setNewY(int y){
mNewY = y;
}
Sprite 클래스의 그리기 메서드에 다음 두 줄을 추가합니다.
public void draw(){
this.x = this.x + (int)(0.5 * (this.newX-this.x));
this.y = this.y + (int)(0.5 * (this.newY-this.y));
// of course, you can get rid of the "this" keywords above. I just put them there for the sake of clarity.
// drawing stuff
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다