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