Unity面经(自整)——移动开发与Shader
Unity与Android混合开发
为什么使用Flutter构建
Flutter 是 Google 的开源工具包,用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序(一套代码跨平台构建app是它最大的优点),并且可以构建高性能、稳定和丰富UI的应用程序。
Flutter向Unity发送消息
通过unityWidgetController.posMessage来发送一个string,参数为GameObject name和方法名。
Unity向Flutter发送消息
Unity通过AndroidJavaClass获取jar实例并调用其中某个方法。
AndroidJavaClass jc = new AndroidJavaClass("com.xraph.plugin.flutter_unity_widget.UnityPlayerUtils");
jc.CallStatic("onUnityMessage", message);
Flutter通过onUnityMessage接收来自unity传来的message。
Unity向Andorid发送消息
Unity通过AndroidJavaClass获取jar实例并调用其中某个方法。
public static void CallAndroidMethod(string methodName, string str) {using var clsUnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //获取UnityPlayerusing var objActivity = clsUnityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); //获取当前activityobjActivity.Call(methodName, str); //调用实例中的方法
}
Unity怎么导出给Andorid使用的?
在Flutter中嵌入Unity3D,需将Unity项目导出为Android Library,该包可以添加到 Flutter 应用程序的原生代码库中。
从 Unity 构建 Gradle 项目时,无需进行任何其他操作。Unity 生成的每个Android Gradle项目中都具有以下结构:
- unityLibrary 模块中的一个库部分,可以集成到其他任何 Gradle 项目中。这包含 Unity runtime和Player数据。
- launcher 模块中的thin launcher部分,其中包含应用程序的名称及其图标。这是一个可启动 Unity 的简单 Android 应用程序。您可以将此模块替换为自己的应用程序。
要将 Unity 集成到另一个 Android Gradle 项目中,必须通过 settings.gradle 文件将生成的 Android Gradle 项目的 unityLibrary 模块包含在您的 Android Unity 项目中。
Shader
计算机图像渲染流水线
-
应用阶段。应用主导的,由CPU实现。1. 准备好场景数据。2. 剔除不可见物体。3. 设置模型的渲染状态。
分为3个阶段:1. 将数据加载到显存中。2. 设置渲染状态。3. 调用Draw call(CPU-> GPU)。
-
几何阶段。处理与要绘制的几何相关的事情。通常在GPU上实现。将顶点坐标变换到屏幕空间中。
-
光栅化阶段。产生屏幕上的像素,渲染出最终图像。逐像素处理。
GPU 流水线

几何阶段和光栅化阶段。
顶点着色器
顶点着色器完全可编程的,实现顶点的空间变换(坐标变换:从模型空间转换为齐次裁剪空间)、顶点着色(逐顶点光照)。
输入来自于CPU,处理单位是顶点。
片元着色器
可编程的。逐片元(像素)操作。决定每个片元的可见性和颜色的混合。
模板测试
GPU会读取模版缓冲区中该片元位置的模版值,然后将该值和读取到的参考值进行比较。
深度测试
GPU把该片元的深度值和已经存在于深度缓冲区中的深度值进行比较
性能优化
如何减少Draw Call
把很多小的DrawCall合并成一个大的Draw Call,即合批处理。比如那些静态的物体更适合批处理,也可以对动态物体进行批处理。
此外应该注意:
(1)避免使用大量很小的网格,如果要使用的话考虑是否可以合并它们。(我们使用了MeshBaker插件来合并mesh和模型贴图)
(2)避免使用过多的材质,尽量在不同网格之间共用一个材质。
我们在实际开发过程中可使用Frame Debugger来发现不合批原因,从而对症进行优化。
渲染Rendering优化
看下pass的次数与set pass 次数, pass 次数,比如阴影这些都会导致多次pass,多光源这些会导致多次pass, 我们可以通过定制渲染管线,优化shader代码, 优化光照计算等,从Shader+渲染管线级别来做好渲染优化,还有LOD优化。
物理引擎优化
减少物理引擎的迭代参数,减少计算量,减少物理刚体的数目。
如何减少GC
GC可以保证内存安全,而不用担心内存未释放而导致的内存泄漏,但GC需要很大量的CPU时间,不合理的GC会影响到性能。
- 避免分配临时数据
- 可使用对象池重用Object,避免频繁的Create和Destroy。
- 字符串连接使用StringBuilder
- 避免在函数中创建Array,而是作为参数传进去去改变它的值
- 避免在Update中每次创建List对象(字典或Array),而是重用它们。
资源如何优化
纹理图片
- 降低最大分辨率
- 采用二次幂压缩格式
- 制作纹理图集
- 取消Read/Write Enabled
- 禁用多余的Mip Map
模型
美术规范可以进行优化,我们可以在导入时,禁用Read/Write Enables,设置一些Mesh Compression或者Optimize Mesh。
使用LOD(多层次细节)
可使用服务器上部署资源包来实现打空包机制进一步减少包体体积。
资源部署与热更新
可使用AssetBundle, Addressable, YooAsset来组织和管理资源,资源可以打补丁包传输到CDN服务器,这样就可以进行资源的热更新,而无需重新build程序。
Addressable
资源(例如预制体)被标记为“可寻址”后,就会为该资源生成一个全局地址,系统可在任何地方通过该全局地址定位该资源。该地址是可寻址对象系统与资产位置关联的字符串标识符,无论该资产是驻留在您构建的游戏本地还是远程CDN网络上。如果资产位置发生更改,也无需重写代码。并且在需要加载资源的时候才会将资源加载进内存。
相关文章:
Unity面经(自整)——移动开发与Shader
Unity与Android混合开发 为什么使用Flutter构建 Flutter 是 Google 的开源工具包,用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序(一套代码跨平台构建app是它最大的优点),并且可以构建高性能、稳定和丰富UI的应用程…...
Nginx实现反向代理、负载均衡、动静分离
1. 什么是Nginx的反向代理? Nginx的反向代理是指Nginx作为服务器的前端,接收客户端的请求,然后将请求转发给后端的真实服务器,并将真实服务器的响应返回给客户端。这种代理方式使得客户端并不知道真实服务器的存在,它…...
【Linux】网络基础(一)
文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层(或四层)模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…...
前端小白学习Vue框架(二)
一.属性计算、属性监听、属性过滤 1.认识MVVM V (用户视图界面)通过VM (应用程序) 向Model(数据模型) 取值与赋值的过程! 数据双向绑定 视图改变更新数据,数据改变更新视图 2.属性计算 //在vue实例中通过computed去计算new …...
飞书api增加权限
1,进入飞书开发者后台:飞书开放平台 给应用增加权限 2,进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行,则需要修改数据权限,修改为全部成员可修改。 改完…...
CSS3 平面 2D 变换+CSS3 过渡
个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍一、CSS3 平面 2D 变换💎1 坐标轴💎2 transform 语法…...
【Jenkins】Jenkins自动化工具介绍
目录 技术背景常规的手动打包步骤 Jenkins简介起源与发展Jenkins的核心价值1.自动化1.1代码构建1.2测试自动化1.3自动部署 2.持续集成与持续部署CI/CD的概念如何减少集成问题更快速地发布软件版本 Jenkins优势Jenkins的主要竞争对手Travis CI:CircleCI:GitLab CI: Jenkins与其他…...
课时93:流程控制_函数进阶_综合练习
1.1.3 综合练习 学习目标 这一节,我们从 案例解读、脚本实践、小结 三个方面来学习。 案例解读 案例需求 使用shell脚本绘制一个杨辉三角案例解读 1、每行数字左右对称,从1开始变大,然后变小为1。 2、第n行的数字个数为n个…...
oracle创建整个数据库的只读账户
在源用户readonly 下创建只读用户 reader readonly 的表空间为AA 一、创建只读用户 create user reader identified by 密码 default tablespace AA; 二、授权 grant connect to reader ; 三、获取原账号readonly 的查询权限 select grant select on ||owner||.||object…...
文件名乱码危机:数据恢复全攻略
在数字化时代的浪潮中,电脑文件成为我们日常生活和工作中不可或缺的一部分。然而,有时我们会突然遭遇一个令人头疼的问题:原本清晰易读的文件名突然变成了乱码。这些乱码文件名不仅让我们无法准确识别文件内容,更可能意味着数据丢…...
Unity Standalone File Browser,Unity打开文件选择器
Unity Standalone File Browser,Unity打开文件选择器 下载地址:GitHub链接: https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…...
面向对象的架构三段式写一篇论文
在面向对象的软件架构中,系统设计通常遵循一种“三段式”方法论,以确保软件的可扩展性、可维护性和灵活性。这种方法论包括三个核心阶段:概念化、详细设计和实现。通过这三个阶段的逐步深入,开发团队可以有效地应对复杂系统的挑战…...
npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED
解决npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to 分析过后这个问题是证书过期的意思 考虑到其他的原因 这里给出三个解决方案 一: 清除npm缓存 npm cache clean --force 取消ssl验证: npm config set strict-…...
pytorch-多分类实战之手写数字识别
目录 1. 网络设计2. 代码实现2.1 网络代码2.2 train 3. 完整代码 1. 网络设计 输入是手写数字图片28x28,输出是10个分类0~9,有两个隐藏层,如下图所示: 2. 代码实现 2.1 网络代码 第一层将784降维到200,第二次使用…...
httpsok-快速申请谷歌SSL免费证书
🔥httpsok-快速申请谷歌SSL免费证书 使用场景: 部署CDN证书、OSS云存储证书证书类型: 单域名 多域名 通配符域名 混合域名证书厂商: ZeroSSL Lets Encrypt Google证书加密类型: ECC、 RSA 一、证书管理 进入 证书管…...
LiveGBS流媒体平台GB/T28181功能-国标级联中如何自定义通道国标编号编辑通道编号保持唯一性
LiveGBS国标级联中如何自定义通道国标编号编辑通道编号保持唯一性 1、国标级联选择通道修改2、通道编辑修改3、分屏展示设备树修改3.1、编辑名称中修改 4、分屏展示分组修改4.1、编辑名称中修改4.2、选择通道中修改 5、搭建GB28181视频直播平台 1、国标级联选择通道修改 国标级…...
mysql 大表凌晨定时删除数据
有几张表数据量非常大,一次维护量有点大(一个月有500多万条数据,并且还在往上涨), 于是想了个定时删除数据,每天凌晨执行,这样每天删除数据量就小, 循环删除,每次删除5…...
ArcGIS和ArcGIS Pro快速加载ArcGIS历史影像World Imagery Wayback
ArcGIS在线历史影像网站 World Imagery Wayback(网址:https://livingatlas.arcgis.com/wayback/)提供了数期历史影像在线浏览服务,之前不少自媒体作者在文中宣称其能代表Google Earth历史影像。 1、一点对比 (1)同一级别下的版本覆盖面 以下述区域为例,自2014年2月20…...
数据仓库的—数据仓库的体系架构
数据仓库通常采用分层的体系架构设计,作为支撑企业决策分析需求的数据基础设施。典型的数据仓库体系架构由以下三个核心层次组成: 源数据层(Source Layer) 这是数据仓库的数据来源,包括组织内部的各种运营系统,如ERP、CRM、SCM等,以及外部数据源如互联网、社交媒体等。这些系…...
【C/C++基础知识】const 关键字
文章目录 Q&A and 前言const 修饰基本变量初始化const 对象仅在文件内有效 const 的引用应用 指针与 constconst 修饰类成员函数参考写在最后 Q&A and 前言 Q:简要说一说 C 中的 const 关键字,含义以及常见的使用位置 A:const 是 C…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
