如果我有一个有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线程:捕获手指位置和设置(X:10,Y:10) 渲染线程:在10,10绘制 UI线程:捕获手指位置和设置(X:22,Y:31) 渲染器螺纹绘图在22,31等.
上面的内容很好,但是当发生这种情况时会发生什么:
UI线程:捕获手指位置和设置(X:10,Y:10) 渲染线程:在10,10绘制 Renderer Thread:10,10 <<再次在同一位置绘制,即使手指物理上移动到不同的位置,导致屏幕上物体的屏幕位置和手指在屏幕上的物理位置之间的偏移。 UI线程:捕获手指位置和设置(X:22,Y:31) 渲染器螺纹绘图在22,31等.
这似乎会使物体的绘画“波澜壮阔”。
所以,我要问的是,有没有办法强迫呈现线程在绘制之前以某种方式检索当前向下指针/手指的实际物理位置?或者其他解决问题的方法?(简单地说,问题是呈现线程应该始终访问当前位置,而不是前一个位置)。
发布于 2015-02-22 00:18:16
简单的回答是不!
您所遇到的问题并不是由于两个线程并行运行造成的。相反,这是因为
第一个问题的解决方案是分析你的应用程序并减少延迟时间--尝试达到60 app的名义帧率。
然而,第二个问题的解决办法只是一个小把戏。没有调整sprite的位置以使其精确地成为您的触点,而是使其移动到触点。
粗略的实现是这样的:
case MotionEvent.ACTION_MOVE: {
sprite.setNewX(event.getX());
sprite.setNewY(event.setY());
}在您的Sprite类中添加以下内容:
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
}https://stackoverflow.com/questions/28652665
复制相似问题