1)iOS导出AssetBundle需要30个小时的解决办法
2)Unity主程如何构建知识树
3)TMP中设置CullTransparent不能使Alpha为0的Text被Culling
4)Spine动画贴图在线性空间中出现黑边线
5)Spine数量太多导致Update性能损耗很大
这是第256篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
AssetBundle
Q:现在游戏资源大概870MB(Android平台导出的所有AssetBundle),在Windows(i5-7500 CPU@3.40GHz,GTX1050,16GB内存,SSD硬盘)下导出全量的Android资源耗时大概是2小时,i9机器上1小时,6年前的i3差不多4小时。
在导出代码相同的情况下,在Mac Mini(2018,i5@3GHz,Intel630,16GB DDR4内存,SSD硬盘)大概花了38小时,换了Macbook Pro(2018,i9@2.9GHz,Redeon560X 4G,16GB DDR4内存,SSD硬盘),也要30小时,不知道问题出在哪里,请教各位大神,有没有遇到过类似问题?也怀疑是PVRTC的问题,把所有资源重新导成了ASTC也没改善。
A:看看是不是这个问题:
https://forum.unity.com/threads/case-1192489-building-asset-bundles-decompresses-textures.742757/
简单来说就是加个-nographics参数打包。经过题主测试:最终生成在Mac Pro i9上面,40分钟不到。
感谢小埃拉@UWA问答社区提供了回答
Unity
Q:如果以MMORPG游戏为准,Unity主程需要构建什么样的知识树?
A1:这个问题很难回答,也不敢回答。外面好多大神,除了国内的,还有国外的。主程序除了知识体系,还有管理体系、方案分析、人员成本控制、运营和产品的把控体系。单从知识树上说,推荐Milo Yip的知识树+御三家(Unreal,Unity和寒霜)任意一款引擎源码的完整阅读:https://cloud.tencent.com/developer/article/1005446。
感谢马古斯@UWA问答社区提供了回答
A2:这个问题很宽泛,是一个很大的问题,即便把范围缩小到MMORPG的范围也包含了很多东西。其实楼上马古斯回答得已经很好了,Milo的那个图谱基本涵盖了核心技术的内容。论管理,UWA学堂有篇浅显的文章,讲我之前创业的时候做的一些管理工作,有兴趣可以看看《创业团队的技术管理》。
简单分享一些我认为一个MMORPG游戏主程应该掌握的技术的内容:
1. 编程语言
这个很容易理解,是程序的基础。
常用的静态语言:C++、C#、Go
常用的动态语言:Lua、Python
然后因为通常游戏开发需要多种语言配合,所以还需要混合编程的概念和技巧。
这其中每种语言的语法和特性需要了解之外,一般会涉及到内存管理。2. 编程规范
同样无需多言,作为主程,需要制定团队的编程规范,并且需要借助LuaCheck等静态检查等工具让规范可以更好地执行和保证。3. 编程范式
这块我认为包含两大部分:一块是搭建整个GamePlay框架的框架方式,传统Entity继承、组件化、ECS是三种比较常规的;还有一块就是设计模式以及它们的应用。4. 数据结构与算法,以及三维数学
默认是3D游戏,这块的基础知识还是需要的。5. 游戏引擎
要有自己熟悉和掌握的游戏引擎,包括客户端与服务端。6. GamePlay基础
除了前面提到的编程范式之外,GamePlay还有很多内容:
- 3C
- 游戏状态管理
- 常规的技能结构等等
7. 物理系统
如何设计碰撞检测、玩家控制、车辆系统、布娃娃、柔体效果。8. 动画系统
骨骼动画原理、蒙皮的基本概念、动作融合、Rootmotion、动画重定向、角色模型和动作制作规范等等。9. 特效系统
10. 渲染
- 了解基本的渲染管线
- 熟悉PBR
- 了解非真实渲染
- 各种后处理效果
11. 音频技术
- FMOD、Wwise、引擎自带音频功能的使用
- 材质音效区分、P1/P3区分
- 混音回响等功能支持
12. 大世界场景制作和管理流程
如果是MMORPG,很可能需要大世界制作的技术,基于World Mashine、Houdini等PCG的生产管线如何建立,如何支持场景同时编辑,如何解决大世界的场景资源加卸载管理、超远视距的阴影如何实现、昼夜天气系统、HLOD等等等等。13. 性能优化
常规的性能优化方式、以及如何持续监控发现性能问题并寻找方案解决,这里又包含CPU、GPU、带宽、内存和磁盘空间等等方面。14. 游戏更新机制
- 客户端Patch系统
- 服务器热更新
- 客户端代码的Hotfix
15. 网络
- 通讯协议如何定义
- 优化网络流量
- 优化弱网下的游戏表现
- 加密
- 限流
16. 服务器存储
MySQL和Mongo等常规数据库的使用17. 游戏AI
- 可能在客户端或者服务端,需要提供便利的编辑能力
- 基于深度学习的AI方案
18. 服务器稳定与安全
- 并发安全
- 进程监控
- 常规的运维知识
- 负载均衡
19. 常规的服务器技术
- AOI管理
- 服务端物理
- 体素
- 同步方案
20. IDE与调试工具
常用的VS Code、Visual Studio等IDE,以及对应开发模式下的相应调试工具。21. 版本管理软件
22. 编辑器开发
随手列,有些凌乱,一些技术内容本身就很复杂,继续拆分可以做得很细,比如在3C里面,如何做到主机级别的体验,就不是一个人能搞透彻的。
当然,肯定不止我列举的这些技术点,还有很多其它的和游戏类型相关的技术内容。
对于一款MMORPG项目的主程,我认为合格的标准是起码了解上面列举的80%以上的技术内容。当然每个人都有要自己擅长的领域,只要有足够的学习能力,能找到合适的人,技术上的内容都可以学习和弥补。只是主程本身就是要为项目的技术问题兜底,并要做技术方案的决策,因此对于技术宽度还是有较高要求的。
我自己的体验是:主程工作中,能有30%-40%的代码时间就很难得了,通常的工作是一天的沟通和会议。所以,主程的眼中,要有“事情”,更要有“人”——如何保持团队活力,如何激发团队战斗力等等,都是技术之外需要思考的难题。
感谢贾伟昊@UWA问答社区提供了回答
A3:前面两位大佬回答很全面了,学到了很多,膜拜!!!这里再补充一些,作为参考,希望有所帮助:
1. 技术方面
- 首先得是一个高级或者资深Unity开发,掌握不错的软件开发及计算机相关基础知识。
- 对Unity使用比较熟悉, 大的模块使用以及底层原理有一定的了解,比如动作,特效,GUI,Avatar,场景,Timeline和资源管理等等。
- 有一定的MMO开发经验,知道MMO游戏里面常见的概念以及实现方案,比如场景,位面,分线,AOI,属性同步,AI,Entity,技能,Buff和体素等等。
- 了解常用的性能优化工具,优化方案。
- 不断拓展技术视野,对技术方案的选型,决策会有帮助。
2. 管理方面
- 制定落地代码规范,了解什么样的代码规范是好的规范,适合项目的规范。
- 制定落地资源规范,能根据项目需求,以及性能预算制定美术同学认可的资源规范,并提供流程和工具帮助他们落地。
- 制定并不断优化开发流程,提升产出效率。
- 涉及的技术方面很多,一个人的精力毕竟有限,很难面面俱到,所以招人、识人、用人和找正确的人做正确的事也很重要。
- 如果是从纯技术岗升上来,一些基本的管理可能建议也要了解一些。
3. 产品方面
不是硬性要求,但是建议自己项目和同品类的竞品游戏,能有一定程度的游戏体验:
- 了解游戏里面的常见玩法。
- 体验游戏里面不同层级玩家的感受,了解他们的需求。
- 了解这类游戏需要做的技术突破点有哪些。
这样跟策划沟通产品需求、讨论优化方案,比较容易达成一致,会高效很多。
比如题主提到的MMORPG类型,目前《天涯明月刀》、《天谕》、《倩女幽魂》和《一梦江湖》等都是可以体验一下。
最后,我觉得一个好的心态也很重要。一个项目开发过程中,会有困难、挫折、甚至失败,遇到这些情况,保持正向积极的心态,同时给组员正向的影响,从而给大家信心,带领大家取得更好的成果。
感谢呼噜怪@UWA问答社区提供了回答
UGUI
Q:Unity 2020,CanvasRenderer中设置CullTransparentMesh属性可以让Alpha为0的元素不绘制网格,但是TMP为什么不行?
查看了UGUI的源码和TextMeshPro的源码发现都设置了网格,且都不为空,UGUI里是canvasRenderer.SetMesh(workerMesh);TMP里是 m_canvasRenderer.SetMesh(m_mesh);而CanvasRenderer源码显示是这样的public extern bool cullTransparentMesh { [MethodImpl(MethodImplOptions.InternalCall)] get; [MethodImpl(MethodImplOptions.InternalCall)] set; },怎么做才能让TMP元素是透明时像Text一样剔除网格绘制?
A:TMP网格中有不用的顶点颜色不是为0,也就是设置Color中Alpha不能设置未使用顶点的,导致传递给底层绘制的Mesh里面有颜色不为0的顶点,无法剔除,同时又有更大的问题,顶点信息不能清零,导致如果一个TMP里有100个字符,有400个顶点信息,重新赋值给一个文字,还是400个顶点信息,只是396个顶点不用来绘制罢了,所以TMP慎用,要么改源码,要么等官方修复。
感谢题主cwf@UWA问答社区提供了回答
Spine
Q:我们使用的Unity版本是2017.4.3f1,在Gamma空间下面做的Spine动画都没有问题,现在前后到Linear空间下面出现Spine动画好多小的接缝的地方出现黑边,如下图中的鼻子,其实鼻子在Spine中是一个小图,贴到脸上面的,现在Linear下面就会看到周围模糊的黑边,预计是这个鼻子贴图周围的Alpha值影响的,但是现在具体是什么原因还不确定,但是在Gamma空间下面都是正确的。
Gamma空间下面的图,鼻子的地方是正常的:
Linear空间下面的,鼻子的地方就有一圈黑边:
以下是两个清晰一点的局部图,对比一下:
A:第一,Spine关闭预乘Alpha重新导出;
第二,Shader勾选Straight Alpha Texture。参考以下信息:http://zh.esotericsoftware.com/forum/Spine-JSON-12274?p=54752#p54752
感谢动感光波@UWA问答社区提供了回答
Spine
Q:Spine数量太多导致Update性能损耗很大,如下图,SkeletonAimation.Update的耗时太长了,有什么有效的解决办法吗?
A1:转到GPU。
感谢付丶火柴@UWA问答社区提供了回答
A2:以下请参考:
- Spine多不代表就卡,主要在于顶点的多少;
- 还有就是在Unity的C#代码,因为这个函数导致卡是很常见的,其实这个卡就是Spine做裁剪的时候的遮罩,也就是遮罩的顶点太多了,因此让你的Spine动画师去优化;
- 总结起来就是不该被遮罩的顶点不要遮,顶点能少就少。
感谢夏霖锐@UWA问答社区提供了回答
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)