Android输入/渲染:平滑移动

时间:2013-10-20 20:32:32

标签: android opengl-es input-filtering

在我的Android OpenGL E.S. 2.0应用程序,我正在实现一个平滑的屏幕拖动功能。 问题是,平滑的运动并不像我想象的那样平滑。

以下是一些代码:

public class SoftMoveInfo {
    private volatile float mAccumulatedDX = 0.0f;
    private volatile float mAccumulatedDY = 0.0f;
    private final float mSlowDownMult = 0.1f;

    // called by main / input thread
    public void addDragDelta(float dx, float dy) {
        mAccumulatedDX += dx;
        mAccumulatedDY += dy;
    }

    // called by rendering thread
    public void integrate() {
        // adjust movement
        final float moveSubX = mAccumulatedDX*mSlowDownMult;
        final float moveSubY = mAccumulatedDY*mSlowDownMult;
        mAccumulatedDX -= moveSubX;
        mAccumulatedDY -= moveSubY;

        mViewX += moveSubX;
        mViewY += moveSubY;
    }
}

mViewXmViewY将是目标屏幕“偏移”值,在该值处将渲染场景。 方法integrate()由渲染线程调用,并基本上推进一个移动步骤。 方法addDragDelta()将由呈现线程调用,它提供如下所示的值:

private float mLastTouchX;
private float mLastTouchY;
private mSoftDragInfo = new SoftMoveInfo();

public boolean onTouchEvent(MotionEvent e) {
    final int actionMasked = e.getAction() & MotionEvent.ACTION_MASK;
    switch (actionMasked) {
        ...
        case MotionEvent.ACTION_MOVE:
            float x = e.getX();
            float y = e.getY();

            mSoftDragInfo.addDragDelta(x-mLastTouchX, y-mLastTouchY);

            mLastTouchX = x;
            mLastTouchY = y;
            break;
        ...
    }
}

现在输出真的是“紧张”。这是我在方法mAccumulatedDX中记录integrate()时制作的excel图表:

mAccumulatedDX Output

如您所见,图表中存在小幅峰值。我想避开它们。 我已经尝试将所有读取和写入事件放入synchronized()块中,但这似乎没有帮助。 我怀疑尖峰是由于这样的事实,即输入线程不提供与渲染线程读取数据的频率相同的信息。

什么是适当的技术来获得平稳运动?我想过一个低通滤波器,但我愿意接受更好的想法。

0 个答案:

没有答案