2

iOS导出AssetBundle需要30个小时的解决办法

 2 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_256.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 [email protected],GTX1050,16GB内存,SSD硬盘)下导出全量的Android资源耗时大概是2小时,i9机器上1小时,6年前的i3差不多4小时。

在导出代码相同的情况下,在Mac Mini(2018,i5@3GHz,Intel630,16GB DDR4内存,SSD硬盘)大概花了38小时,换了Macbook Pro(2018,[email protected],Redeon560X 4G,16GB DDR4内存,SSD硬盘),也要30小时,不知道问题出在哪里,请教各位大神,有没有遇到过类似问题?也怀疑是PVRTC的问题,把所有资源重新导成了ASTC也没改善。

1.png

A:看看是不是这个问题:
https://forum.unity.com/threads/case-1192489-building-asset-bundles-decompresses-textures.742757/
简单来说就是加个-nographics参数打包。

经过题主测试:最终生成在Mac Pro i9上面,40分钟不到。

感谢小埃拉@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60d3ee2de58b4719dd3e26cd


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还有很多内容:

  • 游戏状态管理
  • 常规的技能结构等等

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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60d1eb54e58b4719dd3e26bc


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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60d29dd9e58b4719dd3e26bf


Spine

Q:我们使用的Unity版本是2017.4.3f1,在Gamma空间下面做的Spine动画都没有问题,现在前后到Linear空间下面出现Spine动画好多小的接缝的地方出现黑边,如下图中的鼻子,其实鼻子在Spine中是一个小图,贴到脸上面的,现在Linear下面就会看到周围模糊的黑边,预计是这个鼻子贴图周围的Alpha值影响的,但是现在具体是什么原因还不确定,但是在Gamma空间下面都是正确的。

Gamma空间下面的图,鼻子的地方是正常的:

2.png

Linear空间下面的,鼻子的地方就有一圈黑边:

3.png

以下是两个清晰一点的局部图,对比一下:

4.png

A:第一,Spine关闭预乘Alpha重新导出;
第二,Shader勾选Straight Alpha Texture。

参考以下信息:http://zh.esotericsoftware.com/forum/Spine-JSON-12274?p=54752#p54752

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


Spine

Q:Spine数量太多导致Update性能损耗很大,如下图,SkeletonAimation.Update的耗时太长了,有什么有效的解决办法吗?

5.png

A1:转到GPU。

感谢付丶火柴@UWA问答社区提供了回答

A2:以下请参考:

  1. Spine多不代表就卡,主要在于顶点的多少;
  2. 还有就是在Unity的C#代码,因为这个函数导致卡是很常见的,其实这个卡就是Spine做裁剪的时候的遮罩,也就是遮罩的顶点太多了,因此让你的Spine动画师去优化;
  3. 总结起来就是不该被遮罩的顶点不要遮,顶点能少就少。
    6.png

感谢夏霖锐@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60b085bd6bb31032f9791991

封面图来源于网络


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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK