Version: 1.5
语言 : 中文
Render As Service (URAS)
Render As Service -- 工程隔离版

Render As Service – 非工程隔离版

Notes: - 本文档为URAS(非工程隔离)的开发流程介绍,和关键操作文字版说明。URAS Demo Package 已上线,可查看 URAS Demo Package - URAS(非工程隔离版)支持 Asset BundleAddressable, 请使用最新版团结引擎,可查看 AssetBundle & Addressable in URAS

Render As Service介绍

  • Render As Service,英文简称为URAS,下同。
  • 基于UAAL(Render As Library),支持把渲染服务嵌入原生安卓APP
    • Tuanjie 引擎可作为 Render Service,嵌入原生 Android APP,为原生 Android APP 提供 3D 内容
    • 支持多个 view,支持非全屏渲染,每个 APP 仅需集成 View 组件,脱离 Activity
    • 支持加载多个 Tuanjie 实例
  • 提供单进程和多进程的开发模式
    • 工作流程如下:
      • 单进程模式下,Tuanjie Editor 打包出的 Android Studio 工程或 APK 包括 Client 和 Service
      • 跨进程模式下,Service 端由 Tuanjie Editor 打包得到;Client 端由 Tuanjie Editor 打包出 RenderServiceLibrary,在安卓原生 APP 工程中导入 RenderServiceLibrary 作为 Library,Service 和 Client 之间进行 IPC 通信
    • 支持 Service 运行在独立进程,支持 Service 和 Client 一对多,即把不同 APP 中的多份引擎整合到一份,提供统一的后台渲染服务,节省对系统资源的占用
    • 架构灵活,Service 和 Client 可以形成 M 对 N 的关系
    • 具备保活机制,自动重连

单进程模式URAS使用说明

URAS架构
URAS架构

工作流程说明:单进程模式下,Editor 打包出的 Android Studio 工程或 APK 同时包括 Client 和 Service

使用Tuanjie Editor开发说明

Build Setting设置

  • 点击File >> Build Settings,打开面板

  • 切换至HMI Android平台

  • Export as Render Service中,选择Single Process Mode后,关闭窗口

    URAS Single Process Mode
    URAS Single Process Mode

配置Target Display

  • 切换至 HMI Android 平台后,Editor 里已集成完整的 URAS 功能,通过 Target Display 参数控制需要使用 URAS 的 Camera,具体使用方法如下:
    • 选择需要使用 URAS 的 Camera
    • 在该 Camera 的 Inspector 面板中,找到 Target Display 参数
    • 展开下拉列表,选择一个 Display 使用
    • 注:此处的 Display 与 Android 端工程 TuanjieView 的 tuanjieDisplay 对应
    tuanjieDisplay
    tuanjieDisplay
  • 若有Canvas,Screen Space - Overlay模式的Canvas的 Target Display 需要与对应相机的 Target Display 参数保持一致。

    Render Mode
    Render Mode

Touch事件处理:

  • Touch事件处理的sample code:

    void HandleTouch()
    {
        for (int i = 0; i < 10; i++)
        {
            #if ENABLE_INPUT_SYSTEM
            if(i < Touch.activeTouches.Count)
            {
                var touch = Touch.activeTouches[i];
                Vector3 touchPos = touch.screenPosition;
                Debug.Log($"Get touch position {touchPos} at display {touch.displayIndex}");
            }
            #else
            if (i < Input.touchCount)
            {
                Touch touch = Input.GetTouch(i);
                Vector3 touchPos = touch.position;
                Debug.Log($"Get touch position {touchPos} at display {touch.displayIndex}");
            }
            #endif
        }
    }
    

导出Android Studio工程

  • 点击左上角 File >> Build Settings
  • 再次检查参数设置
  • 切换至 HMI Android
  • 勾选 “Export Project”
  • “Export as Render Service”一栏,选择 Single process mode
  • 点击 “Export”,选择导出路径后,即可导出 Android Studio 工程文件

使用Android Studio开发说明

添加View

  • 将 Tuanjie Editor 导出的 Android Studio 工程文件导入 Android Studio

  • 在 XML 文件中添加 Tuanjie View窗口,以展示 3D 场景,可对工程中的XML进行如下配置:

    <com.unity3d.renderservice.client.TuanjieView 
        android:id="@+id/tuanjieView1"
        android:layout_width="match_parent"
        android:layout_height="275dp"
        app:tuanjieViewType="SurfaceView" 
        app:tuanjieDisplay="1"
        app:tuanjieRenderFrameInterval="1"
        app:tuanjieServicePkgName="com.tuanjie.renderservice" />
    
    • tuanjieView 既可以通过代码动态添加,也可以在layout.xml中配置

      tuanjieView
      tuanjieView
    • 其中:
      • tuanjieDisplay:对应在 Tuanjie Editor 里 Camera 上的 Target Display,输出 Camera 的渲染结果
      • tuanjieRenderFrameInterval:Camera 渲染间隔,设置为0则暂停渲染,默认为1则每帧渲染。
      • tuanjieViewType:分为 TextureView 和 SurfaceView 两种,对应安卓的原生控件,提供了接口在运行时切换

配置消息交互

  • 设置Client端到Service端交互
    • 可调用 TuanjieRenderService.c2sSendMessage 方法向场景中物体发送信息,例如可以向 Cube 物体发送消息,将颜色进行改变。传入参数分别为物体名称、方法名称和方法参数
        mTuanjieRenderService.c2sSendMessage("Cude","ChangeColor","Yellow");
    
    Render Mode
    Render Mode

Service启动/停止渲染调试方法

  • 启动渲染服务可以调用 ensureStarted 方法

  • 停止渲染服务调用 ensureStopped 方法

  • 【Sample Code】:Android Studio 运行 app 之后,点击页面上的 start render service按钮,调用 ensureStarted 开启服务,等待服务启动成功后可出现画面另外两个按钮分别对应增加/减少帧渲染间隔

    mStartServiceBtn =findViewById(R.id.startServiceBtn);
    mStartServiceBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onclick(View view) {
            Log.d(LOG_TAG,msg:"onClick To Start TuanjieRenderService");
            mTuanjieRenderService.ensureStarted();
        }
    });
    
    mStopServiceBtn = findViewById(R.id.stopServiceBtn);
    mStopServiceBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onclick(View view) {
            Log.d(LOG_TAG, msg: "onclick To Stop TuanjieRenderService");
            mTuanjieRenderService.ensureStopped();
        }
    });
    
    URAS example 1 UI
    URAS example 1 UI

导出APK文件

  • 开发完成后,可通过Build >> Build Bundle(s)/APK(s) >> Build APK(s) 正常打包APK文件

    Build APK
    Build APK

跨进程/多进程模式URAS使用说明

URAS工程隔离架构
URAS工程隔离架构

工作流程说明:跨进程模式下 Tuanjie editor 只会打包 Service,Client 需要在安卓原生 App 基础上导入 RenderServiceLibrary 作为 Library,Service 和 Client 之间通过 aidl 进行通信

Service开发说明

Build Setting设置

  • 点击 File >> Build Settings,打开面板
  • 切换至 HMI Android 平台
  • Export as Render Service 中,选择 Inter-Process Mode 后,关闭窗口

URAS Inter-Process Mode

使用 Tuanjie Editor 开发并导出 Android Studio 工程和 RenderServiceLibrary 包

配置Target Display
  • 切换至 HMI Android 平台后,Editor 里已集成完整的 URAS 功能,通过 Target Display 参数控制需要使用 URAS 的 Camera,具体使用方法如下:
    • 选择需要使用 URAS 的 Camera
    • 在该 Camera 的 Inspector 面板中,找到 Target Display 参数
    • 展开下拉列表,选择一个 Display 使用
    • 注:此处的 Display 与 Android 端工程 TuanjieView 的 tuanjieDisplay 对应
    tuanjieDisplay
    tuanjieDisplay
  • 若有Canvas,Screen Space - Overlay模式的Canvas的 Target Display 需要与对应相机的 Target Display 参数保持一致。

    Render Mode
    Render Mode
Touch事件处理:
  • Touch事件处理的sample code:

    void HandleTouch()
    {
        for (int i = 0; i < 10; i++)
        {
            #if ENABLE_INPUT_SYSTEM
            if(i < Touch.activeTouches.Count)
            {
                var touch = Touch.activeTouches[i];
                Vector3 touchPos = touch.screenPosition;
                Debug.Log($"Get touch position {touchPos} at display {touch.displayIndex}");
            }
            #else
            if (i < Input.touchCount)
            {
                Touch touch = Input.GetTouch(i);
                Vector3 touchPos = touch.position;
                Debug.Log($"Get touch position {touchPos} at display {touch.displayIndex}");
            }
            #endif
        }
    }
    
导出Android Studio工程
  • 点击左上角 File >> Build Settings
  • 再次检查参数设置
  • 切换至 HMI Android
  • 勾选 “Export Project”
  • “Export as Render Service”一栏,选择 Inter process mode
  • 点击 “Export”,选择导出路径后,即可导出 Android Studio 工程文件
导出 RenderServiceLibrary 包
  • 点击File >> Build Settings
    • 再次检查参数设置
    • 切换至 HMI Android
    • 勾选 “Export Project”
    • “Export as Render Service” 一栏,选择 Inter-process mode
    • “Service Package Name” 一栏,配置导出的 service 包名,如果只有单个 service 用默认包名 com.tuanjie.renderservice 即可
    • 点击“Export”,选择导出路径可导出 RenderServiceLibrary 包和 Android Studio 工程

使用 Android Studio 开发并导出 APK(Service)

同单进程

Client开发说明

导入 RenderServiceLibrary 包并配置

  • 使用 Android Studio,将 RenderServiceLibrary 包导入 Android Studio 工程

    Import Android Studio Project
    Import Android Studio Project
  • 在原生 app 的 build gradle 中添加 implementation project (’:RenderServiceLibrary‘) ,路径根据需求可修改

    implementation project(":renderServiceLibrary")
    
    Add Implementation Project
    Add Implementation Project
  • 在 AndroidManifest.xml中添加:

    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
    tools:ignore="QueryAllPackagesPermission" />
    

Tuanjie View配置

TuanjieView 创建时需要指定 service 包名进行绑定 xml <com.unity3d.renderservice.client.TuanjieView android:id="@+id/tuanjieView1" android:layout_width="match_parent" android:layout_height="275dp" app:tuanjieViewType="SurfaceView" app:tuanjieDisplay="1" app:tuanjieRenderFrameInterval="1" app:tuanjieServicePkgName="com.tuanjie.renderservice" />

Service启动/停止渲染调试方法

  • 启动渲染服务可以调用 ensureStarted 方法

  • 停止渲染服务调用 ensureStopped 方法

  • 【Sample Code】:Android Studio 运行 app 之后,点击页面上的 start render service按钮,调用 ensureStarted 开启服务,等待服务启动成功后可出现画面另外两个按钮分别对应增加/减少帧渲染间隔

    mStartServiceBtn =findViewById(R.id.startServiceBtn);
    mStartServiceBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onclick(View view) {
            Log.d(LOG_TAG,msg:"onClick To Start TuanjieRenderService");
            mTuanjieRenderService.ensureStarted();
        }
    });
    
    mStopServiceBtn = findViewById(R.id.stopServiceBtn);
    mStopServiceBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onclick(View view) {
            Log.d(LOG_TAG, msg: "onclick To Stop TuanjieRenderService");
            mTuanjieRenderService.ensureStopped();
        }
    });
    

导出APK文件

同单进程

APK安装调试

  • 将 Service 和 Client 分别打包的 APK 文件进行安装
  • Service APK 在安装后设置应用启动管理权限,以华为为例,也可能不需要设置,与设备品牌有关
  • Service APK 需要开启后台弹窗权限

|安卓应用启动管理|URAS权限管理| | :- | :- |

Render As Service (URAS)
Render As Service -- 工程隔离版