1)Packages 目录下 Shader 打包疑难
2)如何敞开资源的 RW 选项
3)RenderTexture 单个像素的色值大于 Shader 的输入值
4)客户端背包刷新机制
5)PBXProject.AddCapability 增加失败
这是第 218 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
AssetBundle
Q:Unity 引入了 Package Manager 来进行治理插件治理,例如 URP 引入 Packages 之后会有目录 Packages/com.unity.render-pipelines.universal@7.3.1。求教一下各位,如何对 Packages 目录下的资源进行 AssetBundle 打包?
例如,工程目录中有材质球援用到 URP 的 Shader,那么材质球打成 AssetBundle 之后会将 Shader 蕴含进去,会有 Shader 解析耗时。
A1:我这边是只应用 SBP 而不必 Addressable,这样通过应用 AssetBundleBuild 是能够将 Packages 中的资源也打包成 AssetBundle 的。
将所有依赖到的 Shader(包含 Packages 中的)都应用 AssetBundleBuild 设置到同一个 shader.bundle 的,打包后也解包确认了,Packages 中的 Shader 也打包在 shader.bundle 而不会被蕴含在材质 AssetBundle 中。
感激黄晓文 @UWA 问答社区提供了答复
A2:我在尝试将现有我的项目转成 URP 的时候,遇到和 Addressable 零碎有些不兼容问题。
在打包援用了 URP 的 Shader 的 Material 时会产生 Shader 被反复打包景象。
如果想把 URP 的 Shader 独自打包,又会发现因为不在 Assets 目录内,Addressable 管不到的问题。我的解决方案是将用到的 URP 的 Shader 拷进去,放到 Assets 目录下通用 Shader 目录。
当然须要将该 Shader 改名,并且要留神将外部援用的 Shader 也一并拷出治理。不过个别我的项目中应用的 Shader 往往还是会本人编写,间接应用官网提供总会遇到这种那种问题。因而我也会思考尽量不必官网默认 Shader,这时对于 URP 而言天然更加须要将 Shader 拷进去进行革新了。
感激黄程 @UWA 问答社区提供了答复
A3:通过 黄晓文 的思路,曾经解决。
打包 AssetBundle 最重要的,就是指定资源 Path 的源门路,以及去往的目标 AssetBundle 地址,这个问题要害是须要晓得资源在 Packages 中的源门路。例如一个 Packages 下的 Shader 资源,Lit.shader,通过 AssetDatabase.GetAssetPath 能够发现门路是:Packages/com.unity.render-pipelines.universal/Shaders/Lit.shader,这个是正确的门路,用它即可。
而谬误的门路别离是:
- Unity 中看到的:Packages/Universal RP/Shaders/Lit.shader 谬误。
- 在文件目录中看到的:Packages/com.unity.render-pipelines.universal@7.3.1/Shaders/Lit.shader 谬误
所以得出结论:Packages 下的资源打包,去除一下 @x.y.z 即可。
感激题主一刀 @UWA 问答社区提供了答复
A4:能够试试应用 Scriptableobject 或 Material 援用到 Shader 文件,而后把 ScriptableObject 或 Material 打到 AssetBundle 里。
感激上午八点 @UWA 问答社区提供了答复
Texture
Q:请问一下,一张通过代码创立的 RGBAHalf 图片,而后存储图片资源后缀为.asset,这样运行时图片的 RW 选项是开启的,会导致内存翻倍,大家晓得有什么方法能关掉这种资源的 RW 选项么?
A1:动态创建的 Texture 是没法敞开读写的,这里截一下 Texture2D 的一个 isReadable 属性获取的接口阐明:
// 摘要:
// Returns true if the Read/Write Enabled checkbox was checked when the texture
// was imported; otherwise returns false. For a dynamic Texture created from script,
// always returns true. For additional information, see TextureImporter.isReadable.
public override bool isReadable {get;}
感激李星 @UWA 问答社区提供了答复
A2:解决了,补充一下下面 Profiler 测试的内存是在 PC 上测试的。
其实.asset 图片文件内有个序列化属性为 isReadable 改为 0,在真机上测试运行时 RW 就是敞开的。
感激题主范世青 @UWA 问答社区提供了答复
Rendering
Q:这几天工程在进行粒子特效的性能检测,咱们应用了 UWA 的 ParticleEffectProfiler 工具进行性能剖析。在进行检测的时候发现一个问题,单个广告板的粒子 Overdraw 为 5,实践上应该是 1 的。我本人断点发现,尽管相机的 Shader 片元输入色彩为 fixed4(0.1, 0.04, 0.02, 0),然而在进行像素绘制次数计算的时候色彩的 g = 0.2196…导致结算后果谬误。起初向 UWA 反馈后,技术人员通知我说把色彩空间改为 Gamma 就好了,试验了一下,的确好了。然而我有困惑。
在线性空间下,Shader 返回的 g 值为 0.04,为什么 RenderTexture 的 g 值为 0.2196…?线性空间下色彩在显示器上显示的不应该是 0.04^2.2 <0.0016 吗?为什么会是 0.2196…变大的值,难道显示器自身也进行 Gamma 校对吗?再者,Untiy 色彩的线性空间和 Gamma 空间是个什么样的逻辑,怎么感觉跟我学习的常识反着的,亦或者是我了解不到位。请各位大神帮忙解惑。
A1:先简略解释一下,Unity 的 Color Space 为 Linear 时,会在最初输入阶段,进行的伽马校对(Gamma Correction),将 Linear 空间的像素转换为 sRGB 空间。Gamma Correction 会将色彩的亮度变大(弥补),Unity 会将弥补后的像素值输入给显示设施(UWA 的 Effect Scanning 工具会输入到 RenderTexture 上)。
因而,应用 UWA 以后版本的的特效检测性能,应该把我的项目的 Color Space 设置成 Gamma。如果是 Linear Space,计算失去的 Overdraw 率会偏高。
Gamma Correction(transform the linear values into sRGB) 的公式为:
感激 Prin@UWA 问答社区提供了答复
Script
Q:网游客户端同步背包数据机制怎么比拟正当一点,当初的解决形式是:
1. 登录的时候获取用户背包所有的数据(这个数据量随着游戏经营工夫变长,数据质变大)。
2. 服务器差别推送(变动的物品推送)。
3. 从较量正本进去再全量申请一次全量背包数据,避免差别的包应网络起因没有收到包。
这样的设计方案,实测流量耗费比拟大,想优化一下流程,征求各位意见,谢谢。
A1:个别都是这样的,如果是 TCP 基本不须要 3。
感激 littlesome@UWA 问答社区提供了答复
A2:不晓得题主所说的背包数据具体有那些内容,个别背包内寄存的都是道具,或者宝箱(其实也是一种道具),碎片(也能够是一种道具)等等。那么这些属性其实根本都是能够序列化到本地文件或者 scriptableObject 的。这个本地文件,或者说对象保留了所有 Item 相干的配置属性。那么网络通信时只须要同步 ID 和数量就行了(依据具体需要可能还有别的,然而应该量很少才对。)
那么假如只是同步 ItemId,ItemCount,通过办法 1 全拉取其实通信量应该不大。
假如 2 个数据都是 int 型,一组 Item 数据是 8 个字节,背包寄存 1024 个不同的 Item 才近 8KB。当然也能够压缩一下,int16 能寄存 65535 个不同 ID 了,而数量往往会设计的是有下限的,比方:9999,即便超过 65535 个道具,也能够拆分成两个,这样一个 int 的高位能够寄存 ID,低位寄存数量,1024 个 Item 则是 4k 左右。
序列化后的道具配置表能够做热更下载。往往减少一些新的道具也会波及到减少新性能,因而一起更新也是必要的。
感激黄程 @UWA 问答社区提供了答复
A3:能够思考利用 ProtoBuf 来同步网络音讯,序列化后会被压缩得很小。服务器同步到客户端的时候,也能够利用 GZIP 来压缩,实测压缩率在 1 / 9 左右。
感激萧小俊 @UWA 问答社区提供了答复
A4:倡议如下:
- 双端各自保护一个背包数据的版本号,Server 批改背包数据之后就版本号自增 +1。客户端在登录的时候承受来自 Server 的背包版本号,如果发现本地磁盘的版本号和 Server 给的版本号不一样,则申请 Server 进行更新,至于是增量更新 / 还是全量更新,看具体实现了。
- 差异化推送,也就是增量更新,这个个别以 key/value 模式推送。
感激上官狗蛋 er@UWA 问答社区提供了答复
Build
Q:这里返回值都是 true,然而只有第三个 PushNotifications 这个增加胜利了(XCode 工程中能够看到),其余的都没增加胜利,版本 Unity2019.4.8f1,这是为什么?
proj.AddCapability(target, PBXCapabilityType.SignInWithApple);
proj.AddCapability(target, PBXCapabilityType.InAppPurchase);
proj.AddCapability(target, PBXCapabilityType.PushNotifications);
A:InAppPurchase 须要增加 Storekit 框架,而后加了 Storekit 框架后会主动加上对应 Capability。
感激吴方杰 @UWA 问答社区提供了答复
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)