简单了解Unity 生成 Android Project里面线程相关逻辑

133 阅读1分钟

unity默认生成的android projcet, 目录

    UnityDemo
    |
    |--launcher
        |
        |--MainActivity
    |
    |--unityLibrary
        |
        |--UnityPlayerActivity


主要是看 UnityPlayerActivity.class 和里面的 UnityPlayer.class,

UnityPlayer

UnityPlayer.class 是在 unityLibrary/libs/unity-class.jar/com.unity3d.player

UnityPlayer extends FrameLayout implements IUnityPlayerLifecycleEvents 

里面的变量也很多

m_MainThread

有个线程是 g m_MainThread , g 就是继承的 Thread, 设置了线程名称为 “UnityMain”, m_MainThread 的内部有个 new handler,应该是线程间通信用的,下方是源码

private class g extends Thread{

    public final void run() {
        this.setName("UnityMain");
        Looper.prepare();
          this.a = new Handler(new Handler.Callback() {
                //.......
          }
         Looper.loop();
      

    }

我模仿这个 m_MainThread 自己写了个 thread ,在 Looper.prepare 前后和 Handler.Callback 里面打印啦下 Thread name, 全都是 “Thread -6”,说明这个 m_MainThread 是子线程, 不是安卓上的 main线程,

SurfaceView mGlView;

调用 private SurfaceView CreateGlView() 得到 SurfaceView 实例, surface 的回调里,主要是调用了

UnityPlayer.this.updateGLDisplay(0, var1.getSurface());

UnityPlayer.this.m_PersistentUnitySurface.a(UnityPlayer.this);
updateGLDisplay()
private void updateGLDisplay(int var1, Surface var2) {
    if (!this.mMainDisplayOverride) {
        this.updateDisplayInternal(var1, var2);
    }
}
updateDisplayInternal()

里面主要是调用了下面的 native 方法

private final native void nativeRecreateGfxState(int var1, Surface var2);

还用到了Semaphore,以前没用过,简单了解了一下,是一个多线程并发的一个java自带类,用这个 Semaphore ,实现过多线程访问同个变量时,阻塞其他线程,Semaphore 可以设置 访问的线程数量,每次 semaphore.acquire()时数量-1, 数量时0时,其他线程在 acquire 就会阻塞, 使用后需要semaphore.release();

m_PersistentUnitySurface;

这个 m_PersistentUnitySurface 类型是 com.unity3d.player.h, 这个 h 实现了 Application.ActivityLifecycleCallbacks, 内部有个 a 继承 View 实现了 PixelCopy.OnPixelCopyFinishedListener 这个 a 里面有个 bitmap

m_PersistentUnitySurface.a(UnityPlayer.this.mGlView);

就是吧 mGlView copy 给上面那个 a 里的 bitmap