Android: OpenGL в нескольких потоках - PullRequest
1 голос
/ 01 декабря 2010

У меня OpenGL SurfaceView. Теперь это необходимо обновить с помощью какого-либо внешнего события, приходящего через сетевой сокет, этот сетевой сокет работает во внешнем потоке, поскольку ему необходимо все время прослушивать порт для входящего трафика, когда приходит некоторый трафик, должен быть создан новый объект 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 () вызывается при поступлении сетевого трафика, но, к сожалению, локальная переменная c не обновляется для метода onDrawFrame (). Почему это так, как я могу этого достичь?

Может кто-нибудь, пожалуйста, помогите мне!?

Большое спасибо Привет

Ответы [ 2 ]

0 голосов
/ 01 декабря 2010

хорошо, когда я вас правильно понял, вы предполагаете, что код должен выглядеть следующим образом?:

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 () не вызывается.

Кстати: handleEvent () вызывается в конце GameMain.

0 голосов
/ 01 декабря 2010

Что с этим queueEvent(t);?Когда я читаю ваш код, что-то вызывает handleEvent(), что запускает прослушивание сокета ... когда что-то приходит в этот сокет, вы хотите добавить куб на ваш дисплей.Это верно?

Если так, то именно в вашем потоке прослушивания сокетов вы хотите отправить сообщение потоку рендеринга через queueEvent(), а не отправлять его функции потока для запуска!Когда ваш код стоит, вы запускаете функцию прослушивания сокетов дважды ... один раз в выделенном потоке, один раз в потоке рендеринга (!).

...