zoukankan      html  css  js  c++  java
  • Cocos2d-x编程中的runOnUiThread方法和runOnGLThread方法剖析

     本文对于runOnGLThread方法的分析主要目的是为了帮助我的课程“拇指接龙游戏”学员更好地理解EasyNDK这个开源框架的使用。借助于这个框架,实现Android JAVA端与Cococ2d-x C++端交互,以及iOS Objective-C端与Cococ2d-x C++端交互将变得异常容易----极大地减少了相关的JNI编程与Objecive-C编程的代码量。但是,在EasyNDK的Android版本示例中在Java主Activity端存在如下代码段:

        
    public void ChangeSomethingInCocos()     {         

    this.runOnGLThread(new Runnable()        

     {             

    @Override           

      public void run()           

      {                

     AndroidNDKHelper.SendMessageWithParameters("ChangeLabelSelector", null);           

      }       

      });   

      }

            在android中经常需要用到异步操作,Thread+Handler方式比较繁琐(当然功能也最为强大),而AsyncTask只能执行一次,很多需求不能满足(有关AsyncTask用法,请参考我引用的另外一篇博客)。

          此时,我们可以试试Activity提供的另外一种简单的方法runOnUiThread,runOnUiThread可以帮助你在线程中执行UI更新操作。

            以下为线程中使用runOnUiThread方法的框架代码:

    MyActivity.this. runOnUiThread(new Runnable() {

                            @Override

                                public void run() 

    {                                  

    // refresh ui 的操作代码                             

     }                        

    });

        这里需要注意:runOnUiThread是Activity中的方法,在我们的工作线程中需要告诉系统是哪个Activity调用,所以前面显式地指明Activity。

        下面为runOnUiThread的宏观代码:

    public final void runOnUiThread(Runnable action) {         if (Thread.currentThread() != mUiThread) {             mHandler.post(action);         } else {             action.run();         } }

       

        从代码可以看到,runOnUiThread首先判断是否是UI线程,不是的话就post,如果是的话就正常运行该线程。只要经过主线程中的Handler.post或者postDelayed处理,线程Runnable都可以被加入到UI主线程的消息循环中,并为主线程的Handler所检索并调用。有关的Handler运行原理,请参考我引用的其他几篇博客文章。

        值得注意的是,本节中的runOnUiThread方法适合于从子线程中更新普通Android View内容时调用。但是,当我们在Android下进行OpenGL ES开发时,也就是本文关注的cocos2d-x开发时,需要使用另一个方法,即下文要讨论的runOnGLThread。

    二、Cocos2d-x编程中的runOnGLThread方法

        cocos2d-x开发中,一旦涉及到Android平台移植自然要与Cocos2dxActivity这个东西打交道。Cocos2dxActivity是cocos2d-x开发团队的成果,它是一个抽象类,具体形式如下:

    public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {//...}

        我们知道,cocos2d-x是运行于OpenGL平台的。Android平台下进行OpenGL开发要与一个特殊View--GLSurefaceView打交道。GLSurefaceView要使用它自己的渲染器(Render)进行图形渲染,这个Render是运行于一个独立的区别于主GUI线程的子线程上的。

    接下来,我们跟踪观察一下接口Cocos2dxHelperListener的定义(它隐藏于文件Cocos2dxHelper.java中):

        public static interface Cocos2dxHelperListener

     {        

     public void showDialog(final String pTitle, final String pMessage);   

          public void showEditTextDialog(final String pTitle, final String pMessage, final int pInputMode, final int pInputFlag, final int pReturnType, final int pMaxLength);     

        public void runOnGLThread(final Runnable pRunnable);    

     }

        其中的前两个方法与Cocos2d-x中显然对话框与文本框有关,在此我们省略有关讨论,而只专注于方法runOnGLThread。

  • 相关阅读:
    vim编辑器替换以及全局替换
    Linux下grep显示前后几行信息
    Pymol里常用到的命令,随用随记
    硬盘里有文件错误,导致删除不了文件,可以使用如下方法
    解决Host key verification failed
    tcl语言杂记
    python脚本后台运行的几种方式
    centos设置连续登录3次密码错误自动锁定账户3分钟
    ubuntu安装显卡驱动
    虚拟交换机(OVS)之结构印象
  • 原文地址:https://www.cnblogs.com/wangtingyi/p/4629752.html
Copyright © 2011-2022 走看看