这是第162篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


本期目录:

  • 如何利用UWA优化物理开销
  • Unity中的Lua所占内存会统计到Profiler中吗
  • 如何获得AssetBundle加载任务的AssetBundleLoadResult
  • 如何在客户端和服务端保持Navmesh寻路计算结果相同
  • 如何设计渲染等级

Physics

Q:我们游戏项目使用UWA深度评测报告FixedUpdate.PhysicsFixedUpdate存在较大的CPU耗时,想问下这一块的耗时是怎么导致的,该如何优化?

A:首先,这是Unity引擎中物理模块的主要耗时开销。从图中可以看出,你们物理模块较高的一个主要原因是调用次数过高,显示了一帧中调用了17次,就算一次开销1ms,调用17次,也有17ms。所以,调用次数是需要题主项目中最需要注意的一点。游戏运行过程中物理模块的调用次数可以通过下图中的箭头查看,同时,物理的调用次数最好是每帧控制在1~3次,如下图所示。

而题主中的物理模块之所以会调用次数这么高,其主要原因是其他模块的耗时很卡,所以导致了物理模块的FixedUpdate在一帧中不断更新,而17次是默认情况下的上限值。物理模块有个有意思的特点,就是你的项目越卡,它会让你的项目更卡,切记!

所以,题主首先要做的是去看看其他模块改如何进行优化,优化下来后,物理模块的耗时自然就下来了。

其次,需要查看你们的项目是否确实需要物理模拟,很多项目(哪怕是MMO)的物理模拟都可以通过其他方式来代替。如果你们的项目中的物理模拟可以通过其他方式来代替,那么题主尽可能将物理模块进行关闭,在Unity 2018及以上版本中,可以自行关闭“Auto Simulation”选项,在5.4~2017版本中,Unity引擎会根据你们物理引擎使用与否来自行关闭。

最后,UWA线上深度测评中的性能简报中有更多的需要注意的关键点,可以根据性能简报中的建议来进行查看,同时,还有更多其他团队遇到的相关技术问题,建议详细查看,很多问题都是共通的,很有可能你们的项目也用的上。

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf22493d27511377098274b


Lua

Q:Unity中Lua部分所占用的内存会被统计到Profiler中吗?如果被统计到了Profiler中,那对应会是被统计到哪一块所占内存中?Mono吗?

实测了下,在Lua中实时创建一个全局超大数组,在Profiler未看哪项数值有变动,所以结论应该是Lua所占内存不会被Profiler给统计到?

A:是的,Lua堆内存并不会在Unity Profiler中被统计到。

目前,Lua堆内存只能通过第三方工具(比如UWA GOT Online)来进行统计。具体可以查看这篇文章:新功能!Lua,是时候和你走走心了!

游戏运行时的Lua总内存查看:

每一帧的具体Lua堆内存分配查看:

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf33be5d275113770982750


AssetBundle

Q:最近找到Unity里面有一个叫AssetBundleLoadResult的枚举值。目测这个枚举值是用来反馈一次AssetBundle加载任务的结束状态(错误原因)。
https://docs.unity3d.com/2019.1/Documentation/ScriptReference/AssetBundleLoadResult.html

但是实际在Untiy的各个AssetBundle相关的API中,我没有找到获得这个枚举值的方法。而且几个常用接口CreateFromXXX之类的,不管同步还是异步,出现错误只是返回空值,错误输出直接打进LogError,除了直接截取Log外,还没有想到其他解决方法。

不知道各位有没有能够获得这个值的方法,或者有没有其他干净的获得加载失败原因的方法?

A:这个枚举使用在AssetBundle.RecompressAssetBundleAsync的AssetBundleRecompressOperation中。

有相关的API:AssetBundleRecompressOperation.result,主要用于描述将AssetBundle的压缩方式转换到另一种压缩方式的状态。

参见官方文档:
https://docs.unity3d.com/ScriptReference/AssetBundle.RecompressAssetBundleAsync.html

https://docs.unity3d.com/2019.1/Documentation/ScriptReference/AssetBundleRecompressOperation.html

官方未提供任何的修复AssetBundle的机制,建议方式是自己对比MD5值,如果不一致就下载新的,本地AssetBundle失败无非两种,文件损坏或修改,或者不存在。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf5cf17a937dc376b4ccee8


Navmesh

Q:我这边尝试使用客户端使用Unity原生的Navmesh,服务端使用Recast,使用客户端导出Navmesh给服务端。

但是因为Unity对Recast进行了修改,所以更正确的情况或许应该是客户端和服务端都是使用Recast进行导航。

所以如何在Unity客户端中直接使用Recast?或者有什么其他的客户端服务器使用同一套寻路方案的方法吗?

A1:赞同你的思路。通过统一的数据和计算过程来保持寻路计算结果相同。在Unity没有开放自己修改过的Navigation源码的情况下,更好的方式是都使用recastnavigation的算法。由于recastnavigation是基于C++的,因此需要以native plugin的方式接入到Unity。

其他方案,如果不是很大和有很复杂的结构的地图,也可以基于A算法来做,导出一份标记了可行走区域的Grid数据。客户端和服务器共用一套A寻路算法。
感谢张锐@UWA问答社区提供了回答

A2:即使你客户端和服务器使用了相同的Recast&Detour,也不会得到相同的运算结果,这个系统都是基于浮点数运算的,得不到完全一致的结果,如果是服务器主导的寻路倒是没啥问题,除非,你要么使用Grid这种传统的整数格子寻路,要么实现定点数版本的Recast&Detour。

首先我觉得是否可以使用多线程跟寻路算法是无关的,原生的Recast对多线程的支持并不友好; 客户端想完全自己控制的话,可以考虑使用Unity 3D AssetStore的一个A* Pathfinding Project Pro的寻路插件,提供了三种寻路算法:Navmesh、Grid、Waypoint,实现了协程和多线程计算。我们项目以前用过,如果服务器使用的是Phong这种C#语言,应该很容易移植;如果服务器是C++ 使用了Recast,也许客户端可以考虑改造AStarPathFindingProject和C++ Recast两者之一来实现相同的算法。但是这样做代价高昂,也依然不能得到完全一致的结果,需要一致的运算首先不能使用浮点数。

我觉得你还是需要仔细评估你们项目的需求,Recast不是万能的,大规模场景快速获取结果适合但有误差,传统格子A*适合小场景适合服务器客户端一致,每种寻路算法都有优缺点,你需要根据核心的需求去选择评估。

另外,UWA学堂里我的那篇《Unity引擎Navmesh的导出及应用》是将Unity的Navmesh导出到Recast使用,也无法满足前后端运算结果一致,适合服务器需要客户端制作的数据然后来主导寻路。

感谢Yaukey@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf4fa55d2751137709827fc


Render

Q:现思考如何设计项目中的渲染等级,求有经验的大佬指个方向,例如ShaderLOD,还有其他什么思路吗?谢谢!

A:可以补充一下,目前我们这边尚未完善渲染等级模式,不过对于分级消耗的处理,其实没有提到的一点,就是根据手机型号自适应当前的分级,诊断如下:

需要建立一张表格:

类似这样的方式。然后客户端根据当前的手机型号,或者分配方式对应相应的调整,来自动化节省消耗。

另外,针对其参数,可以取当前的帧率来判断,保证游戏的流畅度,即当手机帧率下降时,主动提示玩家需要降低渲染等级,以保证平滑度。因为手机性能有时候会随着电池的发热而降低,是波动的。

由于篇幅有限,更多精彩回答,戳以下链接即可查看

感谢马古斯@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5acc208b425802635474fc7d

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)

如何利用UWA优化物理开销相关推荐

  1. 服务器和交换机物理连接_利用Calico融合物理网络的云原生容器SDN方案

    01 云原生的背景 随着云计算的蓬勃发展,越来越多的IT设施及架构具备了虚拟化.分布式.多租户的云计算能力,这些能力为高速发展的互联网行业插上了腾飞的翅膀.并为互联网业务的开展提供了极大的便利. 当移 ...

  2. CUDA实例系列三:利用GPU优化向量规约问题

    CUDA实例系列三:利用GPU优化向量规约问题 先简单的描述一下题目中说的向量规约问题. 这里举个例子, 比如: 我要求出1+2+3-+100的和 我要求出123-*100的积 我要找到a[100]中 ...

  3. 利用鸿鹄优化共享储能的SCADA 系统功能,赋能用户数据自助分析

    摘要 本文主要介绍了共享储能的 SCADA 系统大数据架构,以及如何利用鸿鹄来更好的优化 SCADA 系统功能,如何为用户进行数据自助分析赋能. 1.共享储能介绍 说到共享储能,可能不少朋友比较陌生, ...

  4. mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 create table tbl1 ( id int unique, sname varchar(50), index tbl1_index_sname(sname desc ...

  5. html优化网站的方法,利用HTML优化加快网页速度方法介绍

    减少web页面下载时间的关键就是设法减小文件大小.当多个页面共用一些成分内容时,就可以考虑将这些公用部分单独分离出来.比如:我们可以将多个HTML页面都用到的脚本程序编写成独立存在的.js文件,然后再 ...

  6. MySQL-索引优化篇(3)_利用索引优化锁

    文章目录 生猛干货 官方文档 利用索引优化锁 为什么索引能优化锁 演示 无索引的情况 (获取不同的数据 发生了阻塞) 有索引的情况 (获取不同的数据 未阻塞) 搞定MySQL 生猛干货 带你搞定MyS ...

  7. Tabu搜索(TS—Tabu search)算法是近年来出现的用于求解组合优化问题的一种高效的启发式搜索技术。 本文采用固定并联电容器作为研究对象对系统进行无功补偿,并利用智能优化方法得到使配电网损耗

    禁忌搜索算法解决配电网无功优化问题对应的MATLAB源码,有对应的参考资料. 电力系统配电网的无功优化规划是保证配电网安全.经济运行的一项有效手段,是降低网损.提高电压质量的重要措施. 因此,电力系统 ...

  8. 建模实践3 —— 优化物理仿真模型

    建模实践3 -- 优化物理仿真模型 1.husky_kinova.xacro 2.husky_wheel宏在 wheel.urdf.xacro中定义 3.kinova_armlink宏.kinova_ ...

  9. matlab物理实验数据处理,利用Matlab对物理实验数据进行处理

    利用Matlab对物理实验数据进行处理 李凌云;王海军;韩之乃 [期刊名称]<南京晓庄学院学报> [年(卷),期]2005(021)005 [摘要]本文以热电偶的定标实验.二极管伏安特性实 ...

最新文章

  1. 16-djongo中间件学习
  2. 你真的不了解这个地球
  3. android shell强制删除文件夹_手机文件夹都是英文,看不懂、又不敢删?教你如何辨别、释放内存...
  4. SSD固态硬盘一键分区后如何检测4K对齐?
  5. SVG-edit 是一个快速的、基于 Web 的、由 JavaScript 驱动的 SVG 绘图编辑器
  6. PPT镂空字体、填充文字、图片字、拆分字制作
  7. HTML header 标签的用法
  8. 使用PQ分区魔术师与DiskGenius合并主分区与逻辑分区
  9. 黑客学习-SQL注入:利用Havij对PHPCMS网站进行SQL注入
  10. 下载c语言软件后怎么解压,手机怎么解压文件 盘点常用手机压缩打包解压文件应用...
  11. USB 为什么一般选择48MHz
  12. aspen压缩因子_利用aspen plus进行物性参数的估算讲解
  13. annaconda 安装 opencv(cv2)
  14. python不支持下标访问元素吗_Python 集合不支持使用下标访问其中的元素
  15. vue 省市区选择插件v-distpicker设置初值与选择后触发方法
  16. 如何判断线性方程组是一个解还是无穷个解
  17. ebs 选择excel输出 后缀 html,EBS报表输出文件格式控制
  18. oracle中查询当前系统时间用到的dual是什么?
  19. MacBook, OS X系统下解压RAR文件
  20. linux下默认国外源下载过慢的解决方法

热门文章

  1. 腾达tenda FH451无线路由器 试用感受
  2. jQuery siblings() 兄弟节点的方法
  3. VS Code:使用VS的cl.exe编译运行C/C++程序
  4. 机器学习基础 KNN(K近邻)算法及sklearn的基本使用(附带一些基础概念)
  5. 生活随记-关于手机重启
  6. 张铁林忆吴若甫绑架案 “皇阿玛”曾是绑架对象
  7. electron 获取屏幕
  8. Random随机小游戏 结合scanner
  9. 源码探秘之 vue-property-decorator
  10. 中国女性七大肌肤真相