我有一个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。为什么会这样,我怎么能实现这个目标呢?
任何人都可以帮助我!?
非常感谢 此致
答案 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()。