Проблема с обработкой ввода на андроиде, а именно в hello-gl2 - PullRequest
0 голосов
/ 13 марта 2011

Как сделать так, чтобы обработка ввода выполнялась в отдельном потоке?Я изменил пример 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;
    }

}

Этот i, чтобы попытаться уменьшить задержку системы при непрерывном касании экрана, я видел, как это решение используется в других приложениях openGL наAndroid, хотя и не с openGl ES 2.0.Проблема в том, что мой рендеринг зависает при вызове thread.sleep.Но разве не предполагается, что он находится в отдельном потоке, который не влияет на поток рендеринга?

1 Ответ

3 голосов
/ 13 марта 2011

Помещение Thread.sleep (33) во исполнение во втором потоке не принесет вам ничего.На самом деле это, вероятно, принесет много вреда, если он работает в том же потоке, что и ваш движок GL, потому что вы заставляете свой двигатель останавливаться, делая что-то на 33 мс (дольше, чем 1 кадр) каждый раз, когда происходит событие.

Обычно спящий режим делается таким образом, чтобы более старые версии платформы не регулировали события (они доставляют события так быстро, как их будет использовать приложение).Чтобы это действительно произошло, вам нужно отложить основной поток, куда на самом деле доставляется событие.

Я не могу помочь вам намного больше, потому что эта вещь GL2JNIView не является частью платформы,и когда я искал его код, у первого результата, который я обнаружил, не было метода queueEvent (), поэтому я действительно не знаю, что он делает.

Что подводит нас к последней точке ... этоабсолютно АБСОЛЮТНО НЕПРАВИЛЬНО для людей помещать вещи в пространство имен com.android (и android), если они на самом деле не пишут код внутри платформы.Это пространство имен НЕ для разработчиков приложений.Это НЕ для людей, пишущих вспомогательные функции для разработчиков приложений.Это для внутренней реализации платформы.Программы, которые используют эти пространства имен для своего собственного кода CAN и будут работать в разных версиях платформы или на разных устройствах, поскольку могут конфликтовать с символами, используемыми платформой.

...