基于Unity3d 引擎的Android游戏优化

2023-11-14





最近项目进入收尾阶段,之前对项目做了很多优化,mesh合并 ,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等,在IOS上还好,但是Android上,试过几款手机,从低端到高端,发现性能还是很差,所以又花了几天来研究摸索,终于把游戏性能搞定。记录下来,留作以后参考。

1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式,
2. 对于透明贴图,我们只能选择RGBA 16bit 或者RGBA 32bit。
3. 减少FPS,在ProjectSetting-> Quality中的VSync Count 参数会影响你的FPS,EveryVBlank相当于FPS=60,EverySecondVBlank = 30;
这两种情况都不符合游戏的FPS的话,我们需要手动调整FPS,首先关闭垂直同步这个功能,然后在代码的Awake方法里手动设置FPS(Application.targetFrameRate = 45;)
   降低FPS的好处:
 1)省电,减少手机发热的情况;
 2)能都稳定游戏FPS,减少出现卡顿的情况。
4. 当我们设置了FPS后,再调整下Fixed timestep这个参数,这个参数在ProjectSetting->Time中,目的是减少物理计算的次数,来提高游戏性能。

5. 尽量少使用Update LateUpdate FixedUpdate,这样也可以提升性能和节省电量。多使用事件(不是SendMessage,使用自己写的,或者C#中的事件委托)。

6. 待机时,调整游戏的FPS为1,节省电量。

   Unity3D中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间。一直不太明白是怎么回事,现在基本上明白了。我在这里解释一下原因,如有错误,欢迎指正。在Unity3D中当运行场景打开Profiler的时候,我们会看到VSync 这一项占了很大的比重。这个是什么呢,这个就是垂直同步,稍后再做解释。我们可以关闭VSync来提高帧速率,选择edit->project settings->Quality 在右侧面板中可以找到VSync Count ,把它选成Don't Sync。这就关闭了VSync(垂直同步),现在在运行场景看看,帧速率是不是提高很多。

       现在来说说什么是垂直同步,要知道什么是垂直同步,必须要先明白显示器的工作原理,显示器上的所有图像都是一线一线的扫描上去的,无论是隔行扫描还是逐行扫描,显示器都有两种同步参数——水平同步和垂直同步。

       什么叫水平同步?什么叫垂直同步?

       垂直和水平是CRT中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间,垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而恰恰是垂直同步代表着CRT显示器的刷新率水平。

       为什么关闭垂直同步信号会影响游戏中的FPS数值?

       道理一点都不复杂,首先我们平时运行操作系统一般屏幕刷新率是多少?大概一般都是在85上下吧,那么显卡就会每按照85的频率时间来发送一个垂直同步信号,信号和信号的时间间隔是上两次屏幕更新的时间间隔

如果我们选择等待垂直同步信号(也就是我们平时所说的垂直同步打开),那么在游戏中或许强劲的显卡迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等85单位的信号到达,才可以绘制。这样FPS自然要受到操作系统刷新率运行值的制约。

        而如果我们选择不等待垂直同步信号(也就是我们平时所说的关闭垂直同步),那么游戏中作完一屏画面,显卡和显示器无需等待垂直同步信号就可以开始下一屏图像的绘制,自然可以完全发挥显卡的实力。但是不要忘记,正是因为垂直同步的存在,才能使得游戏进程和显示器刷新率同步,使得画面更加平滑和稳定。取消了垂直同步信号,固然可以换来更快的速度,但是在图像的连续性上势必打折扣。这也正是很多朋友抱怨关闭垂直后发现画面不连续的理论原因。


1、顶点性能

      一般来说,如果您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,那么对于一些配备 MBX GPU的旧设备(比如,原始的iPhone,如 iPhone 3g和 iPod Touch第1和第2代)来说,你应该保证每帧的渲染顶点在10000以下。

2、光照性能

      像素的动态光照将对每个受影响的像素增加显著的计算开销,并可能导致物体会被渲染多次。为了避免这种情况的发生,您应该避免对于任何单个物体都使用多个像素光照,并尽可能地使用方向光。需要注意的是像素光源是一个渲染模式(Render Mode)设置为重要(Important)的光源。像素的动态光照将对顶点变换增加显著的开销。所以,应该尽量避免任何给定的物体被多个光源同时照亮的情况。对于静态物体,采用烘焙光照方法则是更为有效的方法。

3、角色

      每个角色尽量使用一个Skinned Mesh Renderer,这是因为当角色仅有一个 Skinned Mesh Renderer 时, Unity 会 使用可见性裁剪和包围体更新的方法来优化角色的运动,而这种优化只有在角色仅含有一个 Skinned Mesh Renderer 时才会启动。角色的面数一般不要超过1500,骨骼数量少于30就好,角色Material数量一般1~2个为最佳。

4、静态物体

      对于静态物体定点数要求少于500,UV的取值范围不要超过(0,1)区间,这对于纹理的拼合优化很有帮助。不要在静态物体上附加Animation组件,虽然加了对结果没什么影响,但是会增加CPU开销。

 5、摄像机

      将远平面设置成合适的距离,远平面过大会将一些不必要的物体加入渲染,降低效率。另外我们可以根据不同的物体来设置摄像机的远裁剪平面。Unity 提供了可以根据不同的 layer 来设置不同的 view distance ,所以我们可以实现将物体进行分层,大物体层设置的可视距离大些,而小物体层可以设置地小些,另外,一些开销比较大的实体(如粒子系统)可以设置得更小些等等。

6、DrawCall

      尽可能地减少 Drawcall 的数量。 IOS 设备上建议不超过 100 。减少的方法主要有如下几种: Frustum Culling , Occlusion Culling , Texture Packing 。 Frustum Culling 是 Unity 内建的,我们需要做的就是寻求一个合适的远裁剪平面; Occlusion Culling ,遮挡剔除, Unity 内嵌了Umbra ,一个非常好 OC 库。但 Occlusion Culling 也并不是放之四海而皆准的,有时候进行 OC 反而比不进行还要慢,建议在 OC 之前先确定自己的场景是否适合利用 OC 来优化; Texture Packing ,或者叫 Texture Atlasing ,是将同种 shader 的纹理进行拼合,根据 Unity 的 static batching 的特性来减少 draw call 。建议使用,但也有弊端,那就是一定要将场景中距离相近的实体纹理进行拼合,否则,拼合后很可能会增加每帧渲染所需的纹理大小,加大内存带宽的负担。这也就是为什么会出现“ DrawCall 降了,渲染速度也变慢了”的原因。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Unity3d 引擎的Android游戏优化 的相关文章

  • [LeetCode-202]-Happy Number-LeetCode 30天挑战赛-2

    文章目录 题目相关 Solution 题目相关 题目解读 给定一个正数 判断该数是否是快乐数 快乐数定义 将该数进行拆分 拆分后的各个数值的平方求和 求和的结果进行如下判断 该数是否为1 或者该数包含在一个循环中无休止地循环 如果数值是1就
  • android获取string.xml的值

    为什么需要把应用中出现的文字单独存放在string xml文件中呢 一 是为了国际化 当需要国际化时 只需要再提供一个string xml文件 把里面的汉子信息都修改为对应的语言 如 English 再运行程序时 android操作系统会根
  • 6、hilens-only 手势识别控制 竞速小车

    hilens only 手势识别控制 竞速小车 hilens only 手势识别控制竞速小车 1 网络配置 2 hilens 手势识别 3 hilens控制台代码 hilens only 手势识别控制竞速小车 1 网络配置 Address
  • Valid Palindrome问题及解法

    问题描述 Given a string determine if it is a palindrome considering only alphanumeric characters and ignoring cases 示例 A man
  • 2021-02-22

    MFC GDI对象累计问题 我遇到的情况是 运行MFC程序一段时间后 发现界面出现变白 卡死情况 通过查看 任务管理器 详细信息 在状态栏任意处单击右键 选择 选择列 gt GDI对象 如果GDI对象值一直在增加 则说明你的界面窗口中GDI
  • 【华为OD机试】最长公共后缀(Java & JS & Python)

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • win10下,安装Qt5.9.7(一)

    工作需要 用Qt代替mfc 所以记录一下安装过程 1 下载安装包 http download qt io archive qt 找到自己需要的版本 2 安装 选中的那个是需要安装的 双击 next skip 即可 东西很大 放哪个盘 看自己
  • 直观的获得MATLAB训练得到的深度学习网络参数与结构

    在MATLAB当中可以通过在 命令行窗口 输出help trainNetwork获得简单的深度学习网络的搭建的代码 为了获得经过训练得到的深度学习模型的结构与学习参数个数 而不用动手分析和计算 可以使用MATLAB中的函数实现对深度学习模型
  • 不能打开localhost 但是能打开127.0.0.1 ; 可以访问127.0.0.1,不能访问localhost

    可以访问127 0 0 1 不能访问localhost 1 确定C WINDOWS system32 drivers etc hosts文件中是不是存在 127 0 0 1 localhost 且这一行没有被 注释掉 如果没有则添加 试验能
  • 论文精读:YOLOv4: Optimal Speed and Accuracy of Object Detection

    Abstract 大量的特征据说可以提高卷积神经网络 CNN 的精度 需要在大数据集上对这些特征的组合进行实际测试 并对结果进行理论证明 有些特性只适用于某些模型 只适用于某些问题 或仅适用于小规模数据集 而一些特性 如批处理标准化和残差连
  • vue中如何使用ueditor?

    1 首先进入gitee gitee网址快 中拉代码 git clone https gitee com msea ueditor 2 在下载的文件中打开终端 检查是否安装grunt 如果没有 则运行 npm install g grunt
  • ImportError: cannot import name ‘XXX‘ 问题最全解最根本决方案 [循环引用]

    0 前言 导入的实质是什么 以下是我从简书收到的一篇文章 https www jianshu com p a1e91cc53b07 我截了一个片段 python中 每个py文件被称之为模块 每个具有 init py文件的目录被称为包 只要模
  • 松灵机器人——ROS下的CAN通讯调试(内含所需调用包,都是操作步骤)

    松灵机器人 ROS下的CAN通讯调试 1 代码包地址 2 硬件准备 2 1 SCOUT MINI 小白车 尾部航空插头 CAN TO USB适配器 2 2 接线 3 具体操作 3 1 ROS安装和环境设置 3 2 配置 CAN TO USB
  • ubuntu20.04安装以及后续配置

    1 Ubuntu安装过程中如何分区 比较复杂的方案 安装时如果遇到关于boot的错误提示框 使用如下方法解决 win 10 U盘启动安装ubuntu遇到的问题和解决方式 预装win8的电脑上U盘安装ubuntu出现了问题 比较简洁的分区方案
  • 设计模式--observer观察者模式

    转自 http blog csdn net Venlin article details 1658821 一 观察者 Observer 模式 观察者模式又叫做发布 订阅 Publish Subscribe 模式 模型 视图 Model Vi
  • JMETER链接数据库(保姆级教学)

    第一步 下载mysql connector java 5 1 44 bin jar插件 RUL https www mysql com cn products connector 点击 Download 点击 Archives 选择版本后
  • 开发完成的golang项目如何上线部署到Linu服务器上?

    windows服务器 先本地编译 go build main go 编译后会在同级目录生成可执行文件 main exe linux服务器 方法一 服务器上去编译 安装go 配置GOPATH 1 把服务器上配置成本地一样的环境 2 包括项目里

随机推荐

  • 【Shell案例】【打印指定行用sed、for循环、head和tail配合使用】4、输出第5行的内容...

    描述写一个 bash脚本以输出一个文本文件 nowcoder txt 中第5行的内容 示例 假设 nowcoder txt 内容如下 welcometonowcoderthisisshellcode 你的脚本应当输出 is 方法1 变量定义
  • android源码编译错误:ninja failed with: signal: killed

    原因是内存不够 解决方法 更换大内存条 编译时关闭占内存的应用 开启或者扩大swap分区 free m 查看swap分区大小 dd if dev zero of var swap bs 1024 count 2000000 2000000为
  • Linux OOM机制&线上osd异常kill

    一 引言 某日早上收到邮件告警信息 上报pg stale以及recovery信息 于是登录系统运维 二 排查 解决 登录系统后发现系统已恢复正常 按照正常来讲并无影响 但系统既已出现recovery信息意味着一定有osd down发生 于是
  • 2023-9-10 集合-Nim游戏

    题目链接 集合 Nim游戏 include
  • uniapp体验如何?uniapp开发感受及优缺点分析

    很多开发者在没有入坑uniapp之前 都想知道uniapp的体验到底怎么样 开发爽不爽 优缺点是怎么样的 坑多不多 今天就以我个人开发的项目来谈一谈 首先介绍一下我在公司开发的项目 购靓号APP 也有h5 购靓号小程序 扫描下方二维码可以快
  • 华为OD机试 - 矩形相交的面积 - 逻辑分析(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 1 输入 2 输出 3 说明 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收
  • 在HTML页面加载完毕后运行某个js.

    js方法 以下为jQuery方法 需要引用jQuery文件 或者其简写 function
  • CSDN删除、修改分类标签

    点击头像 进入 管理博客 点击个人分类管理 就可以修改分类标签 备注 删除标签后 该标签下的文章还在 不会丢失
  • LeetCode Number Complement

    class Solution public int findComplement int num int temp i 1 j temp num while temp 0 temp 2 i 2 j i 1 num return j temp
  • 部分选主元matlab,列选主元的高斯消去法-matlab

    大家对高斯消去法应该比较了解了 高代和线性代数中做的已经不少了 但是计算机实现的时候还是要注意一些东西 列选主元的高斯消去法 function X lufact my A B Inpiut A 是系数矩阵 B是右端项 Output x是解
  • 三层网络结构(核心层、汇聚层 、接入层)

    三层网络架构设计的网络有三个层次 核心层 网络的高速交换 汇聚层 提供基于策略的连接 接入层 将工作站接入网络 核心层 在核心层应该采用高带宽的交换机 核心层的设备采用双机冗余热备份是非常必要的 也可以使用负载均衡功能来改善网络性能 对于网
  • 软件测试复习(5)----基本路径测试中的细节

    在做基本路径测试的题中又有了新的发现 希望大家可以注意 另外 如果你是第一次看 可以先看一下我之前讲的基本路径方法的步骤 先看一下题目 我们不讲如何做这道题 只是讲一下我通过这道题关于知识点新的理解 题目 答案 知识点 细节 逻辑与 逻辑或
  • 雪崩击穿/齐纳击穿

    雪崩击穿 发生在掺杂浓度较低 自由电子冲撞价离子 温度越高 雪崩击穿需要的击穿电压越高 齐纳击穿 发生在掺杂浓度比较高的时候 自由电子直接跳出共价键 温度越高 齐纳击穿需要的击穿电压越低
  • 适用于小白-vs2019的下载与安装

    学习c语言时 少不了编译器的使用 那么传统的dev c 过于古老的同时 也不再更新 而大学授课老师一般要求安装vc 6 0 学校机房也一般为vc 6 0 但这两种都还是过于古老 现在机构授课过程一般采用vs2019 使用起来更加便捷 清晰
  • 将CelebA数据集所给标签转化为MTCNN中训练集所需标签

    img dir r D datasets CelebA Img img celeba 7z img celeba anno src r D datasets CelebA Anno list bbox celeba txt anno lan
  • Oracle数据库索引管理-基于函数索引ORA-30553

    在ORACALE数据库中 创建函数索引时 若函数是自定义的函数 须在定义函数时加上deterministic关健字 不然会出现 函数不确定 的错误提示 创建函数索引 ORA 30553 函数不确定 原函数如下 create or repla
  • Hibernate HQL绑定变量

    Hibernate HQL查询 插入 更新 update 实例 1 实体查询 有关实体查询技术 其实我们在先前已经有多次涉及 比如下面的例子 String hql from User user List list session Creat
  • 毕业设计 - 个人博客系统的设计与实现【源码+论文】

    文章目录 前言 一 项目设计 1 模块设计 博主功能用例 游客功能用例 2 实现效果 二 部分源码 项目源码 前言 今天学长向大家分享一个 Java web 毕业设计 项目 个人博客系统的设计与实现 一 项目设计 1 模块设计 博主功能用例
  • Linux驱动_多点电容触摸

    一丶Linux下多点电容触摸驱动框架 电容触摸屏IC是FT5426 为IIC协议芯片 因此需要编写IIC驱动 触摸IC会发出中断信号 并在中断服务函数中上报信息 因此需要编写中断框架 触摸屏向Linux内核上报的信息都属于Input子系统
  • 基于Unity3d 引擎的Android游戏优化

    最近项目进入收尾阶段 之前对项目做了很多优化 mesh合并 减少DrawCall和模型骨骼以及物理计算 合并材质球 优化代码等等 在IOS上还好 但是Android上 试过几款手机 从低端到高端 发现性能还是很差 所以又花了几天来研究摸索