Android:几个线程中的OpenGL

时间:2010-12-01 10:09:18

标签: android multithreading opengl-es

我有一个OpenGL SurfaceView。这需要通过来自networkocket的一些外部事件进行更新,这个networksocket在外部线程中运行,因为它需要一直监听端口上的传入流量,当一些流量到达时,应该创建一个新的OpenGL对象并显示在屏幕上。 据我了解所有OpenGL的东西,你不能从外部线程更改对象,但是使用queueevent()你有机会。 我的代码看起来如下,但不幸的是它不起作用:

public class GameMain extends Activity {
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    glView=new GameView(this);
    setContentView(glView);
    }
 }


public class MyGLSurfaceView extends GLSurfaceView{
    public MyGLSurfaceView(Context context) {
    super(context);
            renderer = new OpenGLRenderer();
            this.setRenderer(renderer);
     }
     public void do(ServerSocket ss){
        try{
    while(true){
            try {
                ss.setSoTimeout(500);
            Socket s = ss.accept();
                            renderer.set();
                       }catch(SocketTimeoutException e){}
                     }
             }catch(Exception e){
                    handleException();
     }
     public void handleEvent(){
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                ServerSocket ss = new ServerSocket(7070);
                while(true){
                    get(ss);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    });
    queueEvent(t);
    t.start();
}
 }
public class OpenGLRenderer implements  Rend{
 Cube c = null;
    public OpenGLRenderer(){
         //inits
     }
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
           //.....
     }
    public void onDrawFrame(GL10 gl) {
      if(c!=null)
         doSth();
             //....
    }
   public void set(){
       c = new Cube();
   }
  }

因此在网络流量到达时调用set()方法,但不幸的是,onDrawFrame()方法没有更新局部变量c。为什么会这样,我怎么能实现这个目标呢?

任何人都可以帮助我!?

非常感谢 此致

2 个答案:

答案 0 :(得分:0)

queueEvent(t);有什么用?当我读取你的代码时,有些东西正在调用handleEvent(),它会启动套接字侦听...当某个东西到达该套接字时,你想在显示器上添加一个多维数据集。是吗?

如果是这样,那么在你的套接字监听线程中,你想通过queueEvent()向渲染线程发送一条消息,并且不发送线程函数来运行!正如您的代码所示,您正在运行套接字侦听功能两次...一次在专用线程上,一次在渲染线程(!)上。

答案 1 :(得分:0)

好吧,当我找到你的时候,你认为代码应该是这样的吗?:

public class MyGLSurfaceView extends GLSurfaceView{
public MyGLSurfaceView(Context context) {
super(context);
        renderer = new OpenGLRenderer();
        this.setRenderer(renderer);
 }
 public void do(ServerSocket ss){
    try{
while(true){
        try {
            ss.setSoTimeout(500);
            Socket s = ss.accept();
            queueEvent(new Runnable() {
       @Override
       public void run() {
                    renderer.set();
        }
    });
         }catch(SocketTimeoutException e){}
   }
         }catch(Exception e){
                handleException();
 }
 public void handleEvent(){
Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        try{
            ServerSocket ss = new ServerSocket(7070);
            while(true){
                get(ss);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
});
t.start();} }

不幸的是,这也不起作用;在这种情况下,甚至set()方法也不会被调用。

btw:在GameMain结束时调用 handleEvent()