0

如何使输入处理在单独的线程中运行?我已经像这样修改了 hello-gl2 示例:

package com.android.gl2jni;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;

import java.io.File;


public class GL2JNIActivity extends Activity {

    GL2JNIView mView;

    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        mView = new GL2JNIView(getApplication());
        setContentView(mView);
        setRequestedOrientation(0);
    }

    @Override protected void onPause() {
        super.onPause();
        mView.onPause();
    }

    @Override protected void onResume() {
        super.onResume();
        mView.onResume();
    }

    //the modified part
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        //return super.onTouchEvent(event);
        mView.queueEvent(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(33);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        return true;
    }

}

当我连续触摸屏幕时,我试图减少系统延迟,我已经看到这个解决方案被用于 android 上的其他 openGL 应用程序,尽管没有使用 openGl ES 2.0。问题是调用thread.sleep时我的渲染冻结了。但是它不是假设在一个不影响渲染线程的单独线程中吗?

4

1 回答 1

3

将 Thread.sleep(33) 放在第二个线程的执行中不会给您带来任何好处。事实上,如果它与您的 GL 引擎在同一个线程中运行,它可能会造成很多伤害,因为每次发生事件时,您都会让引擎停止执行任何操作 33 毫秒(长于 1 帧)。

通常会完成睡眠,以便不限制事件的旧版本平台(它们传递事件的速度与应用程序消耗它们的速度一样快)。为此,您需要在实际传递事件的主线程中延迟。

我不能帮助你更多,因为这个 GL2JNIView 东西不是平台的一部分,当我寻找它的代码时,我发现的第一个结果没有 queueEvent() 方法,所以我真的没有知道那是做什么的。

这将我们带到最后一点......如果人们实际上没有在平台内编写代码,那么将东西放在 com.android(和 android)命名空间中是绝对完全错误的。此命名空间不适用于应用程序开发人员。它不适用于为应用程序开发人员编写辅助函数的人。它用于平台的内部实现。将这些命名空间用于自己的代码的程序可以跨越不同的平台版本或设备,因为它们可能与平台使用的符号冲突。

于 2011-03-13T00:58:21.947 回答