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(原群已满员)