Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android上,即在hello-gl2中处理输入时出现问题_Android_Multithreading_Input_Freeze_Opengl Es 2.0 - Fatal编程技术网

在android上,即在hello-gl2中处理输入时出现问题

在android上,即在hello-gl2中处理输入时出现问题,android,multithreading,input,freeze,opengl-es-2.0,Android,Multithreading,Input,Freeze,Opengl Es 2.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

如何使输入处理在单独的线程中运行?我对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时,渲染冻结。但是,它不应该位于一个单独的线程中,而不会影响渲染线程吗?

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

通常情况下,睡眠是为了让平台的旧版本不限制事件(它们以应用程序使用的速度交付事件)。要真正做到这一点,您需要在事件实际交付的主线程中进行延迟

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

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

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

通常情况下,睡眠是为了让平台的旧版本不限制事件(它们以应用程序使用的速度交付事件)。要真正做到这一点,您需要在事件实际交付的主线程中进行延迟

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


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

谢谢您的回答!我明白问题所在。我真正的问题是:。这只是一个小实验,试图解决这个问题。我猜你不知道输入滞后问题的“灵丹妙药”?谢谢你的回答!我明白问题所在。我真正的问题是:。这只是一个小实验,试图解决这个问题。我猜你不知道输入滞后问题的“灵丹妙药”?