unity和flutter都是能够经过opengl和vulkan制作界面,那有没有一种办法能够使得二者界面相互融合,行将flutter的界面烘托到unity的物体中,或许将unity的界面线程烘托到flutter的widget上。由于这两种烘托办法大体相同,下面咱们就着重讲下怎样将flutter界Flutter面烘托到unity中。
首要咱们想到的是将线程安全flutter界面截屏成bitmap,然java面试题后经过交互将bitmap传递给unity,并在unity中运用该bitmap,而且咱们也能够立马发现flflutter是什么意思utter自带截屏函数。可是咱们会马上发现此计划的坏处,此计划首要需求将flutter界面从gpu中下载到内存,然后再经过unity与java通讯将bitmappleap传递到unity中,java难学吗究竟再在unity中将bitmap上传至gpu中作为纹路运用。如此一番折腾,需求在内存中倒腾很多遍,更何况bitmap一般很大,来appointment回传递严重影响功率。那有没有一APP种更好的计划来处理这java怎样读个问题呢,当然有,那便是–
纹路同享
咱们知道applicationopengl上下文一般是android下载安装和线程绑定的,不同上下文之间环境比较独立,无法同享内容,可是为了更好的在多线程环境下android下载作业,opengl供应了纹路同享的办法来补偿java面试题上诉问题,提高多线程下作业功率。运用办法也比较简单,即在新建opengl环境的时分传入一个已有opengl上下文和configsandroid体系,这样就能够在两个opengl环境下同享java模拟器运用同一份纹路(详细能够查找opengl纹路同享)。
至于怎样在安卓上结束与unijava作业培训班ty的纹路同享,咱们能够参看该文章blog.csdnappointment.net/jnlflutteredws/artic…
该文章阐明的比较详细,而且代码比较完善,咱们能够细心阅线程是什么意思读并自己结束一遍即可,这边我大约阐明下相机纹路同享的结束流程(由于flutter同享进程与之类似)。
- 在unity线程中经过与安卓的通讯办法回调java的办法线程池的七个参数
- 在java办法中获取该unity线程的opengflutter值得学吗l上下文和参数装备,一起新建一个java 的线程用来作java的烘托线程,并在java线程中新approve建一个openglflutter言语上下文环境,传入unity的opengl上下文,以此来结束纹路同flutter值得学吗享
- 将安卓相机数据flutter值得学吗输出到surfacetexture,一起将该surfacetexture绑定到opengl中新Android建的一个t线程池创建的四种extureid上,经过fbo离屏烘托将相机数据flutter是什么意思烘托到新的tjava言语extureid(由java初学于安卓中surfacetexture输出的纹路是安卓特有的纹路格式GL_TEXTURE_EXTERNAL_OES,无法直接在unity中运用,因而需求经过离屏烘托将其转化成unity能够运用的纹路格式),回来新的textureid给unity
- unity收到textureid后将其烘托到gameobje线程安全ct上
要害代码如下
纹路同享是openandroid手机gl的办法,关于vulkan和metal这样天生就支撑多线程的烘保管fluttering线,不需求这种办法,不过现在关于vulkan不是很熟悉,Android所以这儿就先不进行阐明。
flutter界面烘托到纹路中
上面咱们现已剖析了怎样将相机数据经过纹路同享到unity中,咱们知道能够经过surfaappstorecetexture和fbo离屏烘托将纹路同享给unitandroid体系y,因而咱们只需求找到怎样将flutter界面烘托到surfacetexture中,即可结束flutter和unity界面的融合。接下来咱们来剖析flutter源码,接下来的源码都是根据flutter1.16来剖析的。
首要flutter在新的版别中,为了便当进行混合接入,抽离出java初学了flutter engine,而且咱们不需求将flutteapp下载r界面直接烘托出来,所以咱们只需求创建一个没有view的flutter fragment放入unity activity中就能够了。咱们将flutter fragment源码拷贝出来并进行改造,与之对应的还需求将FlutterActivityAndFragmentDelegate,接下来线程池的七个参数咱们顺着代码剖析flutter界面是怎样烘托到安卓上的,首要flutter是经过FlutterView加appear载到安卓界面的
而FlutterView分为两种方法,咱们只需求剖析surface方法,咱们发现有个FlutterSurfaceViewandroid电子市场用来结束和flutter相关,咱们发现在surfacandroid体系eview surface创建的时分经过FlutterRender将surface传入flutter中。
这下flutter是什么意思剖析下来就比较明了了,咱们只需求创建一个surface,经过FlutterRender将其传给flutter,一起经过将其数据输出appearance到surfacetexture,并经过fbo离屏烘托将其输出到unity能够运用的纹路id中即可。代码如下
public void attachToFlutterEngine(FlutterEngine flutterEngine) {
this.flutterEngine = flutterEngine;
FlutterRendererjava初学 flutterRenderer = flutterEngine.getRenderer();
flutterRenderer.startRenderingToSurface(GLTexture.instance.surface);
fluttandroid手机erRend线程和进程的差异是什么erer.surfaceChanged(GLTexture.instance.gapplicationetStreamTextureWidth(), GLTexture.instanceandroid/yunos.geandroid体系tStreamTextu线程池创建的四种reHeight());
FlutterRendere线程池r.ViewportMetrics viewportMetrics = new FlutterRenderer.ViewportMetrics();
viewporAPPtMetrics.width = GLTexture.instaandroid/yunosnce.getStreamTextureflutter开发的app有哪些Width();
viewportMetrics.height = GLTexture.instance.getStrejava初学amTextureHeight();
viewpandroid下载安装ortMetrics.devicePixelRatio = GLTexture.injava怎样读stance.context.getResources().getDisplayMetrics().density;
flutterRenderer.setViewpoappreciatertMetrics(viewportMetrics);
flutterRenderer.addIsDisplayingFlutterUiLijava言语stener(new FlutterUiDisplayListener() {
@Override
public v线程的几种状态oid onFlutterUiDisplayed() {
GLTexture.instance.setNeedUpdate(true);
GLTexture.instance.updateTexture();
}
@Overrid线程池面试题e
public void onFlutterUiNappearanceoLongerDisplayed() {
}
});
GLTjava言语exture.instance.attachFluapplicationtterSurface(this);
}
这儿需求留心的是需求给flutter传递宽和高,不然flutter界面application或许显现不android下载安装出来
接下来咱们只需求和相机相同,在unity中接收纹路并烘托到gameobject就能够了。
究竟结束效果如下,咱们能够看到flutterapplication界面完美的烘托到uniandroid是什么手机牌子ty中了
全体代码流程如下,其间重绘时Android分数据都在gpu内部,不触及来回拷贝,这便是纹路同享的好处,能够结束更高的刷新率。
点击作业
咱们接下来还flutter结构优缺点需求处理flutjava面试题ter点击作业,咱们需求在unity中获取点击作业,并将其传APP递给安卓,然后传递给flappstoreutter即可。
unity点击处理代码如下
void Update()
{
#if UNITY_ANDROID
if(mGLTexCtrl.Call<bool>("isNeedflutter值得学吗Update"))
mGLTexflutter言语Ctrl.Call("updatjava言语eTexture");
if (Input.touchesandroid平板电脑价格.Length > 0){
if(haveStartFlutter == 1){
//坐apple标转化并传递给java,代码省掉,详细能够参看unity作业处理
}线程和进程的差异是什么else{
mFlutterApp.Call(线程安全"startFluJavatter");
haveStartFlutter = 1;
}
}
#endif
if(Input.GetMouseButtonDown线程和进程的差异是什么(1)){
Debug.Logappstore(Input.mousePosition);
}
}
安卓传递给flutter代码如下。这儿咱们能够在appreciateflutter源码中发现怎样传递点击作业,这儿也借助于flutter源码来结束
public void onTouchEvent(int type, double x, double y) {
ByteBuffer packet =
B线程池创建的四种yteBuffer.allocateDirect(1 * POINTER_DATA_FIELD_COUNT * BYTES线程池_PER_FIELD);
packet.order(ByteO线程的几种状态rderappearance.LITTLE_ENDIflutter是什么意思AN);
double x1flutter开发的app有哪些, y1;
x1 = GLTexture.instance.getStreamTextureWidthandroid是什么手机牌子() * x;
y1 = GLTexture.instance.getapp下载StreamTextureHeight() * y;
Log.i("myyf", "x:" + x1 + "&y:" + y1 + "&a线程安全mp;type:" + type);
addPointerForIndex(x1, y1, type + 4线程, 0, packet);
if (packet.position() % (POINTER_DATA_FIELD_COUNT * BYTES_PER_FIELD) != 0) {
throw new AssertFlutterionError("Packet position is not on field boundary");
}
flutterEngine.getRenderer().dispatchPointflutter中文官网e线程池的七个参数rDataPacket(packet,packet.positiandroid电子市场on());
}
//传递点击信息 ,详细代码参看flutter
// TODO(mattcarroll): consider creating a PointerPacket class instead of uandroid/yunossing a procedflutter言语ure that
// mutates inputs.
private vandroid/yunosoid addPointerForIndex(
double x,flutter结构 double y, int pointerChange, int pointerData, ByteBuffer packet) {
if (pointerChange == -1) {
return;
}
//……此处省掉
}
这样咱们就能够结束在unappointmentity中点击flutter界面了究竟结束效果如下
总结
上面咱们剖析了如和将flutter界面烘托到unity中,经过opengl的纹路同享和安卓的suapproverface即可结束,同理怎样将unity界面烘托到flutter也是相同,咱们只需求自定义UnityPlayer将其输出到纹路中,并在flutter中运用即可,java环境变量装备能够更广泛的推广,咱们能够经过这种办法将安卓界面烘托到flutter和unity中。