关于script:如何在运行时优雅地Reset-DOTS

1)如何在运行时优雅地Reset DOTS2)用顶点着色器进行旋转的Shader放在Image上不能失常工作3)FrameBuffer Fetch在确定反对的手机上显示全紫4)Unity零碎中,Android端判断GamePad文件在不在 这是第328篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 ScriptQ:DOTS环境为1.0.0 preview需要:以“局”为单位的战斗,单机小游戏。 目前我须要在StartCombat时手动拉起所有的System,在EndCombat时手动Disable掉所有的System。这些System都在Default Inject World中,性能勉强能实现,然而感觉不够优雅。 因为DOTS我的项目十分稀少,而且基本上所有的例子都没有思考过这个问题(他们都仿佛是点击运行游戏就进入战斗,没有思考到以“局”为单位),因而征求一下大家的优雅做法。 A:这个问题的收回阐明对ECS体系的设计思路理解欠缺,在System中保留了的NativeContainer(也就是State,跟局无关的数据)才会须要手动ResetSystem。 真正的ECS设计思路应该是System中齐全不蕴含任何State,不能图省事把以前的 XXXManager的设计思路拿过去:XXXManager设计思路指的是一个单例中有一个Map,还有N多办法来增删改查这个Map。 因而一个纯办法集的System不仅不须要Reset,甚至能够动静Reload代码段,咱们只须要捣毁所有的Entity CMP即可实现Reset。 感激题主刘泰言@UWA问答社区提供了答复 RenderingQ:整体思路就是想在UI中实现图片的可控旋转,然而发现Shader放在Image上时,一旦产生挪动就齐全乱了。已尝试开启了DisableBatching,不晓得问题出在哪里?也尝试过进行缩放,依然存在相似的问题。 float4 flip_base(float4 vertex, float2 uv){float2 pos;float2 center = float2(0,0); // 这个中央能够通过 BaseEffect 通过CPU 计算后 uv1传入,这里简化了。// 尝试过的缩放 //vertex.xy *= _FlipProgress;//return vertex;float2 dt = (vertex.xy - center.xy) * 100;float len = sqrt(dot(dt, dt));float theta = -len * _FlipProgress * pi;float2x2 rot ={cos(theta), sin(theta),-sin(theta) ,cos(theta)};dt = mul(rot, dt);pos = dt + center;vertex.xy = pos;return vertex;}v2f vert(appdata v){v2f o;o.uv = v.uv;float4 vertex = flip_base(v.vertex, o.uv);o.vertex = UnityObjectToClipPos(vertex);return o;}示例工程如下:https://uwa-public.oss-cn-beijing.aliyuncs.com/answer/attachm... ...

March 16, 2023 · 1 min · jiezi

关于script:2022年度大赏-UWA问答精选

UWA每周推送的知识型栏目《厚积薄发 | 技术分享》曾经随同大家走过了304个工作周。精选了2022年十大精彩问答分享给大家,期待2022年UWA问答持续有您的陪伴。 UWA 问答社区:answer.uwa4d.comUWA QQ群:465082844 Q1:动静获取URP设置里自定义的RenderFeatures咱们在URP我的项目中自定义了多个RenderFeatures去实现游戏成果,当初想动静开启和敞开相干的RenderFeatures,请问怎么在代码里动静获取这些Features呢? A:咱们应用反射获取,供参考: public static class ScriptableRendererExtension{ private static readonly Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>> s_renderFeatures = new Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>>(); public static ScriptableRendererFeature GetRendererFeature(this ScriptableRenderer renderer, string name) { if (!s_renderFeatures.TryGetValue(renderer, out var innerFeatures)) { var propertyInfo = renderer.GetType().GetProperty("rendererFeatures", BindingFlags.Instance | BindingFlags.NonPublic); List<ScriptableRendererFeature> rendererFeatures = (List<ScriptableRendererFeature>)propertyInfo?.GetValue(renderer); if (rendererFeatures == null) { s_renderFeatures[renderer] = null; } else { innerFeatures = new Dictionary<string, ScriptableRendererFeature>(); for (var i = 0; i < rendererFeatures.Count; i++) { var feature = rendererFeatures[i]; innerFeatures[feature.name] = feature; } s_renderFeatures[renderer] = innerFeatures; } } if (innerFeatures != null) { innerFeatures.TryGetValue(name, out var result); return result; } return null; }}感激yqsas@UWA问答社区提供了答复 ...

January 9, 2023 · 2 min · jiezi

关于script:如何根治-Script-Error

作者:卢峰(清锐) 本文简要介绍了 Script Error 问题的前因后果,但也不局限于 Script Error,对于通用的系统性问题,应该找到系统性解决方案,进而治本治标。 Script Error 起因与以后解法受浏览器同源策略限度,未知跨域脚本执行谬误时,抛出的错误信息为 "Script error.",导致开发者无奈定位具体谬误。为了获取具体错误信息及堆栈,个别解法是给 Script 标签配置 crossorigin 属性,同时对应脚本服务端需配置 Access-Control-Allow-Origin 响应头。 另外还有一些 hack 解法,对浏览器原生 API 做代理,将业务代码放在 Try Catch 作用域中执行,但写好代理办法是不容易的,粗制滥造的代理办法会制作很多暗藏 Bug,并且大量 Try Catch 在一些 JS Engine 中也存在额定性能损耗,为了解决 Script Error 采纳此计划得失相当。 还有什么问题crossorigin 不好加异步加载脚本套娃,A 加载 B,B 加载 C,以至于不晓得加载了哪些内部脚本 须要服务端配合设置响应头 Access-Control-Allow-Origin crossorigin 加不了内部注入代码,如浏览器插件、定制 Webview 容器(xx 浏览器) 有效 Script Error 数据,难以评估对业务理论影响,并且消耗监控资源 溯源:为什么是 Script Error从 2006 年一篇安全漏洞文章说起:I know if you're logged-in, anywhere 在那个年代大量网站都是服务端渲染,服务端依据用户登录态返回不同页面内容,黑客通过 Script 加载指标站点,用户已登录、未登录返回的 Response 内容不同,报错信息也会有差别,这样就能够通过报错信息辨别用户是否登录,进一步开展针对性的攻打。 ...

September 22, 2022 · 2 min · jiezi

关于script:如何判断设备是否支持64位应用

1)如何判断设施是否反对64位利用2)真机加载Timeline报错3)被动触发Shader编译报错4)Lens Flare(SRP)导致摄像机重叠后显示UGUI生效 这是第308篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:新的处理器对32位利用反对将越来越少,思考出包的时候只出64位的包,想提前统计下。当初我用的办法是System.Environment.Is64BitProcess来判断的,后果可能不精确,例如Kirin 980取到的后果就是false。 请问有没有其余路径或者接口能够获取呢? A:参考以下代码: if(IntPtr.Size == 8)//64else if if(IntPtr.Size == 4)//32感激萧小俊@UWA问答社区提供了答复 TimelineQ:如下图所示,这个预制体上有带一个Timeline,加载AssetBundle包的时候报错,尽管报错了然而理论游戏中又齐全没有影响,什么性能都失常的,请问是为什么? Unity版本:2020.3.1 A:以前也遇到过,退出link文件到Assets目录就好了。感激Xuan@UWA问答社区提供了答复 ShaderQ:以后版本下,Unity会在输入AssetBundle或者BuildPlayer等行为下,才会编译对应平台的Shader,并触发编译报错显示。然而这个编译报错的体现很奇怪,一部分会只显示在Shader Inspector上,另一部分尽管显示在Console中,然而依然会在刷新后被革除。 当初想找到一个办法,能被动触发编译并且将所有相应的谬误都收集到Log或者其余模式的文件中。以后思考过将所有Shader做AssetBundle编译,而后截取ErrorMessage,但还是遇到之前提到的问题,仅仅显示在Shader Inspector的局部。 不晓得有没有敌人有解决方案? A1:用ShaderUtil.GetShaderMessages(shader)这个办法能够拿到Inspector上的谬误。感激范世青@UWA问答社区提供了答复 A2:批准楼上,亲测无效:感激Xuan@UWA问答社区提供了答复 RenderingQ:Lens Flare(SRP)导致摄像机重叠后显示UGUI生效,Unity 2021.3.8应用新个性URP管线下的Lens Flare。 因为咱们的是太空我的项目,Lens Flare对成果晋升很大,所以降级到2021应用最新的炫光性能。然而加了后发现FGUI的重叠摄像机画面无奈显示了,不单单是FGUI,UGUI应用独自摄像机渲染模式也是不能显示。 工程链接见原问答。 A:测试了一下,如果是敞开了MSAA,UGUI就能够失常显示了,但奇怪的是FrameDebugger外面明明有UI DrawCall的,然而就是不显示。<br/> 从Renderdoc外面看到开了MSAA的时候Clear Attachment的时候会报错,导致后续的UI DrawCall渲染不失效,不开MSAA的时候是不会报错的,报错如下图: 感激Xuan@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

September 7, 2022 · 1 min · jiezi

关于script:Android平台压缩纹理ETC2-VS-ASTC

1)Android平台压缩纹理ETC2 VS ASTC2)Unity应用Profiler和UWA内存差别微小3)Unity 2020 IL2CPP打包异样4)TouchScreenKeyboardWrap在PC模式下打包报错 这是第301篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) TextureQ:1. 2022年在Android平台的ASTC反对度怎么样了,预计2023年上的游戏能不能上ASTC?1.1 跟iOS对立不便解决1.2 更多抉择管制压缩比例 44->12121.3 成果比ETC2更好1.4 ASTC有没有什么坑,看到有说华为局部机器不反对,会黑屏 网上只找到上面这个数据,2020年9月,ASTC 77%。https://developer.android.goo... 2. 我了解的压缩纹理是CPU不必解压,间接传输给GPU,间接GPU硬件采样。绝对于采样ARGB32格局,采样压缩纹理的耗费是不是更高点,还是能够忽略不计? 3. 挪动平台纹理是否是2份?CPU一份,GPU显存一份,还是共享同一份? 4. ASTC/ETC2的压缩纹理尺寸是否须要2的幂?网上有些说法是非2的幂纹理加载到显存的时候会进行转换成2的幂,转换过程耗时,会导致卡顿。https://blog.csdn.net/linxinf... 我做过以下测试:1. AssetBundle内的纹理尺寸是原始尺寸。2. Mumu模拟器+GPA纹理尺寸是原始尺寸,格局转换成了ARGB32。3. Adreno+高通真机,目前还在测试,找的机器连不上Adreno Profiler。 A1:我2017年立项的时候跟你一样解决过这个问题,我过后的策略是主包应用ASTC,启动更新的时候判断玩家是否反对ETC2,不反对的话下载ETC2版本的AssetBundle资源。资源在线上是齐全独立的2份资源(打包的时候每次打包2份独立资源)。当年是为了海内做的这个兼容。通过这几年各个大厂的洗礼,间接ASTC就行了。如果你们的游戏类型肯定要下探到那么老的机器,就像我那种双保险的做法。 黑屏的问题没遇到。ETC2反而因为压缩算法不好,局部色彩失真,导致你在做局部PBR成果的时候,会有问题。须要硬件反对,就是因为不能用CPU去解决这种软解压跟软压缩,能够疏忽。挪动平台GPU跟CPU是共享一个内存,然而GPU会独立开拓一份内存,所以会有2份。开启了Mipmap的状况下不是单纯的2份雷同内存,所以还有Texture Streaming这种形式来缩小贴图内存占用。ASTC不须要。至于你的测试:Mumu模拟器在《楚留香》进去的时候就反对ASTC,前面吃鸡游戏风靡的时候更是所有模拟器都反对了,不反对的都要被淘汰。这块能够不必思考。如果不是独自为了发行模拟器渠道,大部分状况下,发行公司都是要求禁用模拟器登录的。 感激简略就好@UWA问答社区提供了答复 A2:1. 对于ASTC的反对度,题主查的数据自身能够作为参考,但还须要联合思考我的项目发行的市场。比方实际上对于中国市场而言ASTC的覆盖率曾经十分高,而对于东南亚南美等海内市场则还要酌情; 常见的压缩纹理是间接升高纹理资源品质,以品质换性能的行为,它不会在GPU端从新解压缩,相同在内存、带宽等方面都有所优化;只有当纹理资源须要运行时批改、开启了Read/Write Enable选项时,才会向CPU复制一份,否则就只有GPU的一份;ASTC对分辨率没有需要;ETC2要求分辨率为4的倍数,而非2的次幂;特地地,不论是ASTC还是ETC2,如果开启了Mipmap,则必须是2的次幂,否则同样会压缩失败。感激Faust@UWA问答社区提供了答复 MemoryQ:Unity应用Profiler和UWA内存差别为何差异这么大? A:Profiler显示的是引擎实在的分配内存,但这个内存在OS中并不仅仅是这些,它会调配更多的内存Page,而且不同的OS版本,不同的厂商调配的都不一样。 同时,OS层还会启动很多本身的Lib,比方渲染相干的库、文件加载的减速库等等,这些内存的调配,都是Unity统计不到的。 除此之外,还有虚拟机的第三方库,比方Lua等,这些的内存是会被统计到PSS中,但不会被统计到Profiler中,游戏启动时的各种渠道库,也是如此。 所以,PSS比Reserved大是失常的。 但如果你发现PSS比Reserved大了快2倍了,那肯定是大家某些库的内存调配过大,比方Lua、Wwise或其余大家应用的第三方库。 感激芭妮妮@UWA问答社区提供了答复 AndroidQ:Unity版本2020.2.3,在IL2CPP打包Android的编译过程报错,因为我的项目中用的Puerts框架,须要生成很多Wrap类。如果打包时勾选Split Application Binary,也用OBB分包状况下,应用Unity能够间接导出到APK和OBB。但如果不勾选,编译会报错。 同样不勾选Split Application Binary,在Build时,Export Project导出到AndroidStudio工程再生成APK也不会有问题。请问有遇到过这样的问题吗? Exception: Unity.IL2CPP.Building.BuilderFailedException: D:\DevEnvironment\android-ndk-r19\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ @“C:\Users\Administrator\AppData\Local\Temp\tmp30FE.tmp” -o “D:\workroot\Crusher\Crusher\Library\il2cpp_android_arm64-v8a\il2cpp_cache\linkresult_B322E1396ADEEC5519CBECC8D02E669C\libil2cpp.so” -shared -Wl,-soname,libil2cpp.so -Wl,–no-undefined -Wl,-z,noexecstack -Wl,–gc-sections -Wl,–build-id -stdlib=libc++ -static-libstdc++ -target aarch64-linux-android21 -Wl,–wrap,sigaction “D:\Softwares\Unity2020.2.3f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\StaticLibs\arm64-v8a\baselib.a” -llog -rdynamic -fuse-ld=bfd.exe报错详情可戳原问答查看。 ...

June 14, 2022 · 1 min · jiezi

关于script:如何动态获取URP设置里自定义的RenderFeatures

1)如何动静获取URP设置里自定义的RenderFeatures2)UGUI里,把UI丢回池里,把计划SetActive(false)办法的最佳3)Prefab中m_Text会主动换行导致搜寻不到4)URP变体优化shader_feature,MAIN_LIGHT_SHADOWS关键字废除 这是第295篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:咱们在URP我的项目中自定义了多个RenderFeatures去实现游戏成果,当初想动静开启和敞开相干的RenderFeatures,请问怎么在代码里动静获取这些Features呢? A:咱们应用反射获取,供参考: public static class ScriptableRendererExtension{ private static readonly Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>> s_renderFeatures = new Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>>(); public static ScriptableRendererFeature GetRendererFeature(this ScriptableRenderer renderer, string name) { if (!s_renderFeatures.TryGetValue(renderer, out var innerFeatures)) { var propertyInfo = renderer.GetType().GetProperty("rendererFeatures", BindingFlags.Instance | BindingFlags.NonPublic); List<ScriptableRendererFeature> rendererFeatures = (List<ScriptableRendererFeature>)propertyInfo?.GetValue(renderer); if (rendererFeatures == null) { s_renderFeatures[renderer] = null; } else { innerFeatures = new Dictionary<string, ScriptableRendererFeature>(); for (var i = 0; i < rendererFeatures.Count; i++) { var feature = rendererFeatures[i]; innerFeatures[feature.name] = feature; } s_renderFeatures[renderer] = innerFeatures; } } if (innerFeatures != null) { innerFeatures.TryGetValue(name, out var result); return result; } return null; }}感激yqsas@UWA问答社区提供了答复 ...

May 10, 2022 · 1 min · jiezi

关于script:Timeline技能编辑器如何提取关键帧信息

1)Timeline技能编辑器如何提取关键帧信息2)Mesh资源开启R/W内存的翻倍问题3)UI的Animator动画对Canvas.SendWillRenderCanvas()耗时影响4)对Shader变体的了解 这是第281篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:最近在用Unity做一个技能编辑器,让策动能够在Timeline编辑器里编辑技能动画、施法特效、受击动画、受击特效和播放声音等等。编辑这些都没什么问题,我想依据编辑好的Timeline导出一系列行为节点,在Editor的环境下导出成配置(蕴含所有行为节点)。当初我不分明怎么获取Timeline里第m帧开始某动画x,第n帧完结这些行为。同时怎么能给动画打上对应Tag? A:Timeline的组成如下图: 每个Track对应一个TrackAsset其实就是一个PlayableAsset,整个Timeline也是一个TimelineAsset,外面存了所有Track的数据: 对于每个Clip的开始和完结工夫在TimelineClip中能够获取: 感激羽飞@UWA问答社区提供了答复 MeshQ:为什么Profiler中显示开启网格的Read/Write没有使其内存翻倍,而仅仅是回升了一点? A:如果是FBX中的网格资源,则该网格资源很有可能除了本身网格的顶点数据外,还带有动画和骨骼信息。而当开启FBX的Read/Write时,仅会使网格资源本身的内存翻倍,而动画和骨骼信息不会,且Profiler并不能将他们离开统计,从而产生了整体没有翻倍的景象,如图。 开启Read/Write: 没开Read/Write: 这一点能够通过将FBX设置中Animation Type设置为None、勾销Import Animation勾选、勾销Import Materials勾选证实。此时Profiler中该网格资源内存显著降落,并根本合乎开启Read/Write前后内存翻倍了。 值得一提的是,在较新版本的Unity中(图截自2020.3),选中网格资源是能够看到其内存的实践大小和具体组成部分的。 感激Faust@UWA问答社区提供了答复 UGUIQ:对UGUI增加Animator动画会造成UI更新耗时吗?如果Animator组件处于Active状态但没有进行Loop会有继续耗时吗? A:在Unity 2018.4版本中对于这个问题试验如下:步骤1,场景中为一个UI增加批改Scale的动画,并复制1000个;步骤2,增加了其Position和Color属性的动画;步骤3,批改了所在Canvas的Render Mode为Overlay模式和Camera模式;步骤4,批改了所在Canvas的Pixel Perfect为关上。 只进行1的状况下无论动画是否Loop,Canvas.SendWillRenderCanvas()都只会在刚开始时有一段高耗时。 而批改2之后的所有状况下,开启Loop时Canvas.SendWillRenderCanvas()始终具备高耗时。但敞开Loop后,播放完一次动画后Canvas.SendWillRenderCanvas()的耗时就始终靠近于0了,如图: 而此时动画零碎自身的Animator.Update()耗时依然很高,如图: 总的来说,从2018.4上的这次试验来看,现版本的UGUI不会被不在播放状态的Animator影响而造成Canvas.SendWillRenderCanvas()耗时。 感激Faust@UWA问答社区提供了答复 ShaderQ:除了不倡议应用Standard Shader外,还有其余的Unity默认的Shader不举荐应用吗?比方官网的Universal Render Pipeline/Particles/Unlit有6个变体,其中也用到了雾效的计算。然而咱们我的项目中没有用到雾效,而且这个Shader用得十分多,这类状况是否有必要本人弄一个简洁版? A:对于Shader变体数量次要影响的是Shader的内存(尽管变体数量和内存并不是齐全的线性关系),如下PPS中的Uber变体数为3.74K很高: 次要是因为有很多multi_compile的Keywords,倡议手动删除一些不必的(或应用shader_feature代替),能够大大降低变体数量: 以上示例就是简略粗犷的优化对内存影响较大的Shader,当然最好是通过SVC对我的项目中所有Shader的所有变体进行治理,但工作量绝对会大很多。 感激羽飞@UWA问答社区提供了答复 封面图来源于Animation Rigging: Advanced Setups展现了Unity动画索具包的高级设置和用例。 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

January 17, 2022 · 1 min · jiezi

关于script:Lua代码内存泄漏的疑惑

1)Lua代码内存透露的纳闷2)一个Lua反复加载后造成的泄露问题3)对于Addressable中计数的纳闷4)合并Mesh的插件举荐 这是第265篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:Lua Profiler提醒调用红框中函数,每次都会减少大略0.23KB的内存,且随工夫始终减少,求教一下,这个是因为闭包函数中用了局部变量i,部分table a导致的吗? A:是局部变量table a的内存在减少。至于是否泄露:因为局部变量返回的时候被援用了,如果卸载正当,每次GC是会革除的,不会造成泄露。对代码的倡议是:如果数据是雷同的,倡议做一个池子复用,不要每次生成。这样会造成堆内存升高导致触发GC,造成大量耗时。另外,闭包的创立也会减少内存。感激小ben@UWA问答社区提供了答复 ScriptQ:当初的被动技是Lua写的,所以每场战斗会Reload,然而又没有调用package.loaded[‘xxx’] = nil来强制开释,目前用的Tolua,不晓得会不会主动开释? A:package.loaded其实是Lua外部保护的一个Table。Require的时候都会优先从package.loaded中查问一下,如果查问胜利,会间接返回package.loaded[“Name”], 如果须要开释,必须手动package.loaded[‘xxx’] = nil。 感激萧小俊@UWA问答社区提供了答复 AddressableQ:试用一下Addressables,看了看调试窗口,发现Instantiation Counts这里的值只有调用过一次Addressables.InstantiateAsync后就始终为1,依据文档的形容是这里是每帧Addressables.InstantiateAsync的调用次数,难道真的是每帧都在调用?还是说是Unity的显示有错? Addressables版本1.16.19,Unity版本2020.3.14f1,测试代码如下: public AssetReference Prefab;List<GameObject> ActiveObjs; private void Update() { if (Input.GetMouseButtonDown(0)) { if (Camera.main.GetMouseInputCastPoint(Input.mousePosition, out var point)) {//这里是本人扩大的 Prefab.InstantiateAsync(point,Quaternion.identity).Completed += (op)=> { ActiveObjs.Add(op.Result); }; } } } void ReleaseInstance() { foreach (var item in ActiveObjs){ Prefab.AssetReference.ReleaseInstance(item); } ActiveObjs.Clear(); }A:这个并不是每帧调用的数据,这个面板外面统计的是“驻留”的Operation以及被援用的次数,能够帮忙查看哪些该被卸载的Bundle然而却还在内存中。感激Xuan@UWA问答社区提供了答复 MeshQ:在没有美术的前提下,Unity程序想要合并Mesh,求举荐好用的插件,我晓得的有MeshBaker,有没有其它的举荐? A1:举荐应用SimpleLod,不过这个咱们没用只是测试过,次要还是MeshBaker。感激萧小俊@UWA问答社区提供了答复 A2:首先,StaticBatchingUtility.Combine这个办法归根结底是一个手动动态批处理的操作,它的直观作用是通过动态批处理升高DrawCall。尽管它能够合成Mesh,然而这个Mesh我的确拿不到(如果谁能够拿到请不吝赐教)。 而后回归该问题,其实需要只是一个功能性而并非优化性的问题,只有把几个Mesh拼接进一个物体就能够了,那么CombineInstance就和这个需要很对口。 代码如下: 该办法的益处就是能够把须要合并的物体的材质信息也蕴含进来,成果如下: 合并完了之后能够通过AssetDatabase.CreateAsset保留该Mesh: 感激翟孟飞@UWA问答社区提供了答复 20210830更多精彩问题等你答复~ ...

September 6, 2021 · 1 min · jiezi

关于script:HttpWebRequest下载大文件速度变低问题

1)HttpWebRequest下载大文件速度变低问题2)Unity 2018.4.3X版本打AssetBundle慢3)Unity 2D地图的动静批改4)Unity 3D UGUI粒子特效裁剪的解决方案5)Addressables LoadAssetAsync加载预设体的执行问题 这是第259篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:游戏应用HttpWebRequest进行内容更新,在Google Play只上传小包,关上后再下载资源。 失常下载速度在10MB左右,在应用4G的状况(Wifi下没呈现过,4G根本必现)下下载大略10几秒会呈现速度断崖式降落,达到10几KB乃至几KB。而后会卡在这个速度进行龟速下载,如果中断连贯从新开始断线重连又会回到10MB的速度,根本下载残缺资源须要如此重复2~3次。 下载资源放在腾讯云香港服务器,应用腾讯云的CDN减速服务。版本:Unity 2018.4.34。 A:能够查看下: Wifi下没有呈现过问题而4G上呈现问题,须要先排查一下是不是运营商的问题,电信挪动联通都试一下。能够检查一下CDN的状态,CDN的后盾应该能够看到2XX、3XX、4XX或5XX呈现的次数 ,排除某文件自身存在的问题或者CDN网络不稳固。思考下载一个文件,分多个Range段,多线程下载。能够参考一下UWA学堂的文章《手游HTTP多线程下载原理与优化》,这篇文章写得不错,解决了很多热更新的资源的痛点。 感激萧小俊@UWA问答社区提供了答复 BuildQ:Unity 2018.4.3X版本打AssetBundle慢,同样的电脑环境下,曾经换过2018.4.36f1、32f1、20f1和34f1版本,但用之前的2018.4.1f1版本打AssetBundle就飞快。 曾经把各种资源都试了一波,Unity和工程都放在C盘,都是固态环境,电脑i7-10700,老版本2018.4.1f1飞快,2w资源增量一次3分钟,从头开始打得20分钟左右,而后新版本从头打得10小时+,不晓得那个中央我有忽略,曾经来回把工程导入了好几次。 A1:介绍几个分析方法: 看Editor.log能看到Unity大略正在做什么;用Procexp、Process Hacker之类的工具,配置好符号PDB门路,能够看Unity主线程的栈,多刷新几次,能猜到大略在做什么;用VS附加一个性能分析器到Unity过程,抓几分钟,能看到热点调用栈。感激littlesome@UWA问答社区提供了答复 A2:楼主看看这个帖子有没有帮忙,也是前不久呈现在问答区外面的:https://answer.uwa4d.com/ques...感激马三小伙儿@UWA问答社区提供了答复 RenderingQ:斗斗堂炮弹轰击后地表塌陷如何实现? A:给对应的场景图片生成一个Mesh,之后打到的时候去更新那个网格即可。 UnityStore上有一个不错的插件能够看一下:https://assetstore.unity.com/... 也能够看一下Poly的算法:https://blog.csdn.net/6346289... 感激萧小俊@UWA问答社区提供了答复 UGUIQ:请问UGUI粒子特效的裁剪有哪些比拟好的解决方案?比方Sprite Mask要设置缩放,感觉应用起来有些不不便,比方用Shader如何裁剪? A1:能够参考一下这个:https://www.programmersought....感激羽飞@UWA问答社区提供了答复 A2:能够参考一下这个:https://blog.csdn.net/akak201...感激super@UWA问答社区提供了答复 AddressableQ:我在我的项目中应用Addressables.LoadAssetAsync加载预设体,而后实例化,在我加载结束实例化之前就会执行预设体挂载的脚本。如果我再实例化预设体,则会执行两遍脚本。请问这块正确的做法是怎么样的呢? A1:这个是1.18加了同步加载呈现的问题,版本降回1.17.17就好了。感激唐@UWA问答社区提供了答复 A2:发现上面一个帖子,的确是版本的问题,我当初降级到1.18.11,目前没有遇到这个问题了。https://forum.unity.com/threa...感激题主BreakJail@UWA问答社区提供了答复 20210719更多精彩问题等你答复~ 1.Vulkan与OpenGL的抉择是否会对内存大小产生影响2.对于Unity出AAB包的问题3.RTS 手游技术难点 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

July 21, 2021 · 1 min · jiezi

关于script:AssetBundle中加载SpriteAtlas图集之后卸载异常

1)AssetBundle中加载SpriteAtlas图集之后卸载异样2)Shader相干问题3)如何监听GameObject的localScale扭转4)我的项目中大量的字节文件的合并和热更新计划5)一个对于相机的几何数学问题 这是第232篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) TextureQ:我从AssetBundle包中加载图集和音频,而后在卸载的时候应用Resources.UnloadAsset,发现音频能够卸载,然而SpriteAtlas无奈卸载。 代码: using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.U2D;using UnityEngine.SceneManagement;public class Test_ResourceUnload : MonoBehaviour{ public AudioClip[] clips; public SpriteAtlas[] atlas; private void Update() { if (Input.GetKeyDown(KeyCode.A)) StartCoroutine(LoadAB()); if (Input.GetKeyDown(KeyCode.Space)) { //SceneManager.LoadScene("222"); 加载场景主动卸载 for (int i = 0; i < atlas.Length; i++) { Resources.UnloadAsset(atlas[i]); //不能卸载 } for (int i = 0; i < clips.Length; i++) { Resources.UnloadAsset(clips[i]); //能够卸载 } //上面的能够卸载 //for (int i = 0; i < clips.Length; i++) // clips[i] = null; //for (int i = 0; i < charAtlas.Length; i++) // charAtlas[i] = null; //Resources.UnloadUnusedAssets(); } } private IEnumerator LoadAB() { atlas = new SpriteAtlas[5]; for (int i = 1; i < 6; i++) { string ABPath = Application.streamingAssetsPath + "/chars/" + i.ToString(); var ABRequest = AssetBundle.LoadFromFileAsync(ABPath); yield return ABRequest; AssetBundle charAB = ABRequest.assetBundle; if (charAB != null) { atlas[i - 1] = charAB.LoadAllAssets<SpriteAtlas>()[0]; charAB.Unload(false); } else Debug.LogError("加载关卡charAB谬误 null"); } string ABPathAudios = Application.streamingAssetsPath + "/audiodubbing/1"; var ABRequestAudios = AssetBundle.LoadFromFileAsync(ABPathAudios); yield return ABRequestAudios; AssetBundle charABAudios = ABRequestAudios.assetBundle; if (charABAudios != null) { clips = charABAudios.LoadAllAssets<AudioClip>(); charABAudios.Unload(false); } else Debug.LogError("加载关卡charAB谬误 null"); }} 在Proflier中查看(打包后电脑测试,非Editor),按下A加载如下: ...

December 30, 2020 · 2 min · jiezi

关于script:使用ScriptableObject代替部分配置表的坑点

1)应用ScriptableObject代替局部配置表的坑点2)加载配置内存过大问题3)URP的UI在Android模型器下比在真机上暗4)Unity在Windows上第一次运行Play启动很慢5)如何正确卸载UnityWebRequest下载的图片资源 这是第231篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:ScriptableObject能够通过Runtime批改,资源能够拖拽配置。这些都是Excel无奈做到的劣势。 所以筹备尝试用ScriptableObject代替局部Excel的配置用在我的项目里。想晓得,ScriptableObject这样用,大家有没有遇到过比较严重的坑点?例如这样的Asset的加载、解析的空间或工夫上的开销是否可承受等等。 补充一下,比方配备是成组的,对每组配备做一个ScriptableObject对应的Asset拖一组配备Prefab援用,而后由内部持有ScriptableObject Asset的门路即可。像这种局部资源相干的配置走这套,粒度更细,一个Asset中蕴含的资源自身就是应该被同时加载的。这种状况是不是没有这种冗余加载的问题? A1:之前的我的项目已经用过这种形式做配置表,然而随着表格和配置的减少,会呈现许多问题,比方以下几个: 内存:内存要比一般的加载、解析二进制文件要大不少,大略有8倍。加载速度:加载速度比一般的解析二进制要慢十倍以上,也是个大略值,毕竟是三年前做的我的项目了。卡顿:ScriptableObject的加载和解析都在主线程,会卡主线程,而本人实现的二进制能够本人写个子线程去解析,就算在主线程解析起来也很快。这块大略也是十倍的量级。硬盘:如果二进制不压缩,其实硬盘上差距不那么大,然而略微用zip压缩一下,就有十倍的差距了。策动:如果面对大量的数据,Excel显然更能帮忙策动高效地配置,比方当初须要配置100个道具,如果用ScriptableObject比较复杂。Runtime:Runtime批改尽管做不到,然而热重载是能够做到的,效率也不差多少。资源可拖拽:这个性能你考察过策动是否喜爱了吗?热更新:如果我的项目应用的语言是Lua,ScriptableObject会妨碍新增字段的更新,毕竟是C#申明的字段(或者后续有表格热更新增字段、表格的需要)。以上状况如果都能承受,那么用ScriptableObject是能够的。据我所知,还是有一些上线我的项目是用这套计划的,并且也稳固经营了3年以上。 感激xiaobai@UWA问答社区提供了答复 A2:举个例子,比方一个配备表关联上百个配备模型。加载间接拖上去的ScriptableObject就得同时加载这上百个配备模型。如果不必拖拽援用,这个的可编辑性远远不如Excel。感激欧月松@UWA问答社区提供了答复 A3:个别这种资源援用,能够思考应用一个可加载的门路或者地址来代替,防止间接援用带来的同时加载问题。感激静风霁@UWA问答社区提供了答复 A4:ScriptableObject大部分时候还是没有Excel好用的,比方在公式和索引上,也无奈疾速定位配置谬误,然而大多数Editor的编辑器性能须要用到ScriptableObject。咱们我的项目的计划是Excel转Protobuf + ScriptableObject转Protobuf,运行时只加载Protobuf的二进制文件即可。 感激萧小俊@UWA问答社区提供了答复 ScriptQ:配置表太多占用内存过大时,除了采纳Sqlite,还有什么好的解决办法吗?FlatBuffer不必全副进内存吗?如果不全副进内存,访问速度如何呢? A1:解答第一个问题: 能够针对反复数据进行剔除,尤其是一些字符串的配置。在配置导出时把这样的数据提取一份,其余用到的中央只是援用,会节俭不少。数据类型要正当。能够应用相似FlatBuffer/ZeroFormatter的提早加载的思路,在真正应用时再去反序列化。一次游戏过程中理论用到的配置量比拟无限,应用这种策略能够尽可能地缩小不必要数据的加载(这一条可能次要实用于C#层去读配置的,如果你们是存成Lua这条就不肯定实用了)。解答第二个问题:咱们上个我的项目也是到前期优化时遇到相似问题,只是参考了这种思路,并没有进行齐全替换。在打包时,会对配置以行为单位,进行Offset和Length的计算;在Runtime阶段,初始加载只会加载每行的ID,对应的这一行的Offset和Length,而后后续逻辑调用配置表接口拿数据的时候,如果发现没有反序列化过,就依据Offset和Length再去构建一下相应的数据提供给下层。访问速度必定没有开始间接全副加载的好,但咱们测下来影响不大。 感激范君@UWA问答社区提供了答复 A2:字符串吃内存,尽量少用或者复用。表格中比拟多的会是哪种?攻打-1000、进攻-2000、血量-3000,每个Int都是4个字节,数量多了会顶不住。这种能够思考用一个int32/int64/uint32/uint64去存多个数值。感激萧小俊@UWA问答社区提供了答复 RenderingQ:URP的UI在很多Android模型器下的显著比在手机上要暗很多。确认模拟器用的Gles3.0+ 反对Linear色调空间,看上去就像是模拟器对UI进行了一次额定的GammaToLinearSpace,如果在导入UI图片时把sRGB勾掉,或者进行一次LinearToGamma,就能在模拟器上显示失常,但手机上就色彩太亮了,如下图: A1:最新进展:之前用2019.3.5f1,更新到2019.4.10f1就没有这个问题了。感激题主loy_liu@UWA问答社区提供了答复 A2:Unity论坛有很多人反馈SRP + OPENGL ES + Linear Color Space在Android下面有渲染Bug。看下Player Settings->Android->Resolution and Presentation->Blit Type设置成Auto是否解决问题呢? 感激范君@UWA问答社区提供了答复 A3:2019.3.6f1的Release Note里有说到这个是Bug。[Mobile: [Android] [Gles3] [URP] Darker UI when using Gles3, Linear and URP]感激Xuan@UWA问答社区提供了答复 EditorQ:Unity在Windows上第一次运行Play启动很慢,但在Mac上没有这个问题。该如何进行排查呢? A1:Mac没问题,有可能是Play启动游戏的时候在扫描各种资源文件导致,能够排查下AssetPostprocessor相干的,比方OnPostprocessAllAssets是不是每次启动的时候都在遍历。感激Kenji@UWA问答社区提供了答复 A2:如果是Editor的问题能够试一下Unity官网提供的编辑器耗时剖析工具Performance Tracking(2019.4+),低版本从Profiler中看看能不能定位到耗时。Performance TrackingScriptableObject导致的相似的问题 感激羽飞@UWA问答社区提供了答复 ResourceQ:通过UnityWebRequest和DownloadHandlerTexture下载的Texture资源,下载实现后赋值到RawImage组件,如何正确卸载UnityWebRequest下载的图片资源? A:咱们上个我的项目此类Texture都会被专门的Manager治理起来,确保没有被其余GameObject援用后,应用Object.DestroyImmediate来销毁掉,尽管这个接口官网不举荐应用。或者能够尝试下确保没有援用后应用Object.Destroy卸载或期待下次调用Resources.UnloadUnusedAssets时来卸载。 感激范君@UWA问答社区提供了答复 封面图来自网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

December 30, 2020 · 1 min · jiezi

关于script:开启Allow-unsafe-code的影响

1)开启Allow unsafe code的影响2)Unity线性空间下,PhotoShop制作半透明图片,制作带外发光、内发光的图层如何正确导出3)Unity中实现欠缺的暂停机制4)RenderPipelineManager.DoRenderLoop_Internal的堆内存优化5)Unity 2020版本中ARBackgroundRenderer和ARRenderMode的相应代替类 这是第223篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:最近我的项目引进几个插件,以及学习他人的插件,代码中用到了unsafe关键字,须要再project settings中勾选Allow unsafe code,之前晓得一点是不勾选最好,然而勾选当前到底哪里不好也忘了,也没有勾选之后上线来验证,所以问问大家,是否应该勾选,以及勾选之后有何影响? A:勾了没什么实际上的害处,只是因为.net当初设计的时候是不激励应用unsafe代码的,所以在编译器默认设置这个门槛,激励大家尽可能应用平安的代码(也就是不要间接操作原生内存地址)。然而,很多高性能的C#代码为了最大限度地高效拜访内存,不可避免要用unsafe,只有保障unsafe代码被限度在较小的范畴并严格测试保障不会出内存拜访谬误,对整个工程来说就不是大问题。 感激招文勇@UWA问答社区提供了答复 TextureQ:大家好,因为我的项目是PBR我的项目,所以Unity应用线性空间,当初在制作UI的时候,带通明通道的图片,混合时候就会出错。 咱们前后试了几种办法:1. 改PhotoShop的工作空间为线性的,定义Gamma为1.0:2. 独自改用灰度系数混合RGB色彩:1.00,这样大部分状况下,Unity中成果PhotoShop中成果就是统一的:3. 改Unity渲染管线。 以上办法都有一些局限和问题。 1. 一般不透明图层有些突变成果无奈绘制,因为线性空间下的暗部色彩精度不够;2. PhotoShop制作带外发光、内发光的图层合并之后会谬误: 3. 因为用的还是内置Forward管线,影响太大,低端机效率低下,暂不思考。咱们最终采纳的是第二种,美术还是在Gamma工作空间作图,只是图层混合采样。 最初想问下大家,针对线性空间下的半透明图层如何导出?或者有没有什么方法能解决这种外发光、内发光图层问题? A1:目前公司我的项目都采纳Linear形式,美术间接批改PhotoShop设置,出图过后,在Unity中测试,能与原图是一个色调,之前也尝试过其余方法,如Shader修改,然而都有肯定的问题,目前采纳的这种计划,暂未发现问题。 感激范超@UWA问答社区提供了答复 A2:用下图的配置,在PhotoShop CC 2019里试了下,只有不合并图层,间接导出png,再放到Unity中就没有问题。另外如问题中的例子,只有从下向上合并图层(带着背景),最终后果就没问题。可能是PhotoShop的Bug。 就我和美术理解的状况,他们很少合并图层。个别导出就是把不须要的图层暗藏了。所以这种状况应该是能够防止的。 感激张首峰@UWA问答社区提供了答复 ScriptQ:目前应用TimeScale=0来暂停游戏,然而在UI上不想让特效和动画暂停,而在某些战斗场景,只心愿暂停一部分逻辑。如果把TimeScale=0,就要解决ParticleSystem、TrailRenderer、Spine动画等组件,特地是TrailRenderer和Spine都须要批改源码。如果不必TimeScale=0, 是不是就要在框架层就解决好各模块的更新逻辑? A1:惯例的做法的确就如你说的,不必TimeScale=0,各个中央去实现暂停,而后对立治理。感激邓永健@UWA问答社区提供了答复 A2:可参考这篇文章:《Unity Chronos - Time Control 工夫控制器》感激黄程@UWA问答社区提供了答复 MonoQ:我的项目采纳了URP,用UWA进行了初步测试,发现RenderPipelineManager.DoRenderLoop_Internal调配了很多堆内存,这个函数是URP中的内置函数吗?应该如何定位问题进行优化? A:这个函数是内置用于SRP的总函数,不过调配堆内存的很有可能是题主本人写的C#函数。从图中来看,目前堆内存调配的太多了,倡议通过GOT(Online)中的Mono模式来进行测试,就能够看到其具体的堆内存分配情况了。通过“倒序”查看形式,能够间接查看调配的最低级子函数,如下图所示。 以上答复由UWA提供 EditorQ:请问下,以下这两个类当初有代替类吗?是怎么布局解决的?UnityEngine.XR.ARBackgroundRendererUnityEngine.XR.ARRenderMode 以上这两个类经测试:Unity版本:2020.1.4f1c1,找不到;Unity版本:2019.4.7f1,找失去。 我又试了下以后最新的Untiy 2020.2.0b6版本这两个类也没有。看了些材料,Unity 2020版本后,这两个类应该就被删除了。 A:Unity新版本将很多性能都是以Package的形式导入,对于AR从PackageManager中导入AR Foundation包,ChangeLog中有提到ARBackgroundRenderer曾经在某个版本重命名为ARCameraBackground,AR/VR开发可能须要相熟一下相干的Package,如下图: 感激羽飞@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网技术QQ群:793972859(原群已满员)

October 21, 2020 · 1 min · jiezi

关于script:Packages目录下Shader打包疑问

1)Packages目录下Shader打包疑难2)如何敞开资源的RW选项3)RenderTexture单个像素的色值大于Shader的输入值4)客户端背包刷新机制5)PBXProject.AddCapability增加失败 这是第218篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) AssetBundleQ: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问答社区提供了答复 TextureQ:请问一下,一张通过代码创立的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问答社区提供了答复 ...

September 15, 2020 · 1 min · jiezi

关于script:Addressable资源管理

1)Addressable资源管理 2)Addressable热更新问题 3)不合理旧图集拆分成新的小图集 4)XLua中在Lua和C#传递自定义值类型 5)Toggle的onValueChanged如何正确移除某个匿名的监听 这是第216篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.com UWA QQ群2:793972859(原群已满员) AddressableQ1:大家用Addressable治理资源,对于AssetsGroups的Bundle Mode:选用Pack Together好,还是选用Pack Separately好?大家有什么好的倡议吗? A:Pack Together是最简略的治理形式,然而适宜打包后比拟小的资源集,比方大量通用的Shader能够打包在一起。然而往往还是Pack Separately用的比拟多,集体感觉Separately更容易治理。 其实具体如何抉择要看咱们须要打包的资源如何分类。假如一个游戏的资源分出以下类型:玩家、怪物、NPC、地图、特效、音乐和通用资源等,那么从性能和治理的角度思考,来对这些资源进行目录治理。 RemoteAssets |__Players (Group) | |__Player01 (拖入Group) | | |__Animations (作为SubAsset,不可批改,会被打包进Player01) | | |__Materials | | |__Textures | | |__Models | | |__Prefabs | |__Player02 |__Monsters | |__Common | |__Monster001 | |__Monster002 |__Maps |__Map001不同Group内则以更新为单位来思考,比方版本2须要新加Monster003,版本4须要添Map002。天然应该按这些小分类做Bundle打包。 于是能够以大分类做Group,抉择Pack Separately,以小分类的目录拖进Group作为AssetEntry,这样根本就能治理好了。并且个别每个Bundle的大小也能管制在正当范畴内。 然而离开打包可能因为各个包内资源援用到其余共用资源,造成反复打包。因而整体尺寸会大于Together。于是咱们能够在某个Group内建设一个Common的子目录,将这个Group内可能被共用的局部提出来打包。 另外一部分资源比方UI,能够思考纳入一个Group,而后抉择按Label打包。按UI应用的界面和更新批次建设Label,咱们这个步骤是联合AssetGraph利用文件名主动生成Label来设置Group的。 一些通用资源能够独自建设Group,而后抉择Pack Together。然而咱们仍然是建设一个叫Common的Group,而后还是抉择Separately。 这个组外面增加各个资源目录: Common |__ Fonts |__ Shaders |__ Materials大抵思路是这样,然而还会要联合各个我的项目的理论需要,性能宰割,更新和经营要求来做设计。 Q2:目前比拟奇怪的景象是用Pack Separately打出的包要比Pack Together的大很多。 ...

August 19, 2020 · 2 min · jiezi

关于script:厚积薄发LuaJIT性能热点函数优化

1)LuaJIT性能热点函数优化 2)Unity 2019.4打包Android疑难 3)RenderTexture.GetTemporary报错问题 4)WaitForTargetFPS耗时太高 5)ParticleSystem.Main的有效性 这是第214篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.com UWA QQ群2:793972859(原群已满员) ScriptQ:征询我的项目中的这个函数耗时十分重大,有什么优化的办法吗? A1:这个是table.get,对应获取字段或者拜访数组时调用的函数: 优先应用间断数组而不是英文名字段,能够显著晋升拜访效率并升高内存耗费,很多团队喜爱应用Class的写法,能够这样革新: local obj = ClassA.New() obj.abc = 1 obj.cde = "test" 变成: local obj = ClassA.New() obj[1] = 1 obj[2] = "test" 这个办法能够针对应用频率较高的代码进行革新。本人开发工具,在编译Lua之前,将Lua代码中的常量从英文名变量转换为数值,这个能够联合1应用,就能够在开发期写英文名字段名,而后编译时转换为数组。感激招文勇@UWA问答社区提供了答复 A2:字符串应该是哈希值计算的耗费,这样的开销应该是很频繁地调用了。感激王欢@UWA问答社区提供了答复 A3:批准你的观点,但可读性变差了,得失相当。第二点,可能比拟容易出错。感激Robot.Huang@UWA问答社区提供了答复 BuildQ:Unity版本由2018.4.0f1降级到2019.4.5f1,其中Android的Custom Manifest、Custom Gradle Template都拆分为了两个,别离为Main和Launcher。之前对接的各个Android SDK感觉须要从新做了。请问有比拟相熟的,能够指导一下这里吗? 咱们之前各个SDK都是以JAR和AAR的模式间接放在Unity工程内,间接Unity出包,当初间接Build会有各种报错,感觉是不兼容之前的格局了。 A1:咱们也遇到了内部编译的AAR内的Manifest和Unity内的Manifest抵触问题。因为2019其实是能够间接编译Java的,咱们罗唆勾销了内部工程,间接把Java代码和OC的代码放入Unity工程,而后只应用Unity内的Manifest,就没有抵触谬误了。咱们我的项目是2017的,过后记得MM能够,然而Java不行。起初用2018开的其余我的项目因为临时没遇到相似需要,就没试,最近另外一个我的项目间接2019来做就这样对应了。 感激黄程@UWA问答社区提供了答复 A2:找了找文档 https://forum.unity.com/threads/using-unity-as-a-library-in-native-ios-android-apps.685195,咱们是手动把原来一个Manifest文件的内容给拆了一下,LauncherManifest只放图标和App Name相干的设置。之后有工夫也筹备试试黄程大佬的办法。 感激题主张斌@UWA问答社区提供了答复 ScriptQ:应用GetTemporary这个办法进行图片资源的创立时,产生了这个谬误:ArgumentException: RenderTextureDesc width must be greater than zero. 望各位赐教。请问这部分源代码在哪里能够看到? A:源代码: https://github.com/Unity-Technologies/UnityCsReference参数Width不能小于等于0。 感激羽飞@UWA问答社区提供了答复 ScriptQ:应用GPM查看我的项目性能,发现WaitForTargetFPS耗时太高,均值在20ms左右。网上查找说是因为开了垂直同步的问题,依照网上的解决形式从新打包过后,并没什么成果。 ...

August 5, 2020 · 1 min · jiezi

关于script:厚积薄发LuaJIT性能热点函数优化

1)LuaJIT性能热点函数优化 2)Unity 2019.4打包Android疑难 3)RenderTexture.GetTemporary报错问题 4)WaitForTargetFPS耗时太高 5)ParticleSystem.Main的有效性 这是第214篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.com UWA QQ群2:793972859(原群已满员) ScriptQ:征询我的项目中的这个函数耗时十分重大,有什么优化的办法吗? A1:这个是table.get,对应获取字段或者拜访数组时调用的函数: 优先应用间断数组而不是英文名字段,能够显著晋升拜访效率并升高内存耗费,很多团队喜爱应用Class的写法,能够这样革新: local obj = ClassA.New() obj.abc = 1 obj.cde = "test" 变成: local obj = ClassA.New() obj[1] = 1 obj[2] = "test" 这个办法能够针对应用频率较高的代码进行革新。本人开发工具,在编译Lua之前,将Lua代码中的常量从英文名变量转换为数值,这个能够联合1应用,就能够在开发期写英文名字段名,而后编译时转换为数组。感激招文勇@UWA问答社区提供了答复 A2:字符串应该是哈希值计算的耗费,这样的开销应该是很频繁地调用了。感激王欢@UWA问答社区提供了答复 A3:批准你的观点,但可读性变差了,得失相当。第二点,可能比拟容易出错。感激Robot.Huang@UWA问答社区提供了答复 BuildQ:Unity版本由2018.4.0f1降级到2019.4.5f1,其中Android的Custom Manifest、Custom Gradle Template都拆分为了两个,别离为Main和Launcher。之前对接的各个Android SDK感觉须要从新做了。请问有比拟相熟的,能够指导一下这里吗? 咱们之前各个SDK都是以JAR和AAR的模式间接放在Unity工程内,间接Unity出包,当初间接Build会有各种报错,感觉是不兼容之前的格局了。 A1:咱们也遇到了内部编译的AAR内的Manifest和Unity内的Manifest抵触问题。因为2019其实是能够间接编译Java的,咱们罗唆勾销了内部工程,间接把Java代码和OC的代码放入Unity工程,而后只应用Unity内的Manifest,就没有抵触谬误了。咱们我的项目是2017的,过后记得MM能够,然而Java不行。起初用2018开的其余我的项目因为临时没遇到相似需要,就没试,最近另外一个我的项目间接2019来做就这样对应了。 感激黄程@UWA问答社区提供了答复 A2:找了找文档 https://forum.unity.com/threads/using-unity-as-a-library-in-native-ios-android-apps.685195,咱们是手动把原来一个Manifest文件的内容给拆了一下,LauncherManifest只放图标和App Name相干的设置。之后有工夫也筹备试试黄程大佬的办法。 感激题主张斌@UWA问答社区提供了答复 ScriptQ:应用GetTemporary这个办法进行图片资源的创立时,产生了这个谬误:ArgumentException: RenderTextureDesc width must be greater than zero. 望各位赐教。请问这部分源代码在哪里能够看到? A:源代码: https://github.com/Unity-Technologies/UnityCsReference参数Width不能小于等于0。 感激羽飞@UWA问答社区提供了答复 ScriptQ:应用GPM查看我的项目性能,发现WaitForTargetFPS耗时太高,均值在20ms左右。网上查找说是因为开了垂直同步的问题,依照网上的解决形式从新打包过后,并没什么成果。 ...

August 5, 2020 · 1 min · jiezi

关于Texture2D-Crunched压缩格式

1)关于Texture2D Crunched压缩格式 2)Unity自身GC和.NET的GC如何协调工作 3)关于环境光照球面坐标映射2D贴图UV的某算法的疑问 4)iOS审核dlopen、dlsym风险 5)Unity 2018.4在iOS上压缩贴图用的是哪个可执行文件 这是第208篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。 UWA 问答社区:answer.uwa4d.com UWA QQ群2:793972859(原群已满员) TextureQ1:关于Texture2D的压缩格式设置上,想问一下大家有没有Crunch ETC2 压缩格式的上线经验。效果如何? A1:当时是使用的Unity 4.7,后来翻了5.6的源码移植。2017的算法有了更多的优化。为了解决包体大小的问题,曾经在某上线项目中,将Crunched ETC2功能移植到了Unity早期的版本中。使用Crunched ETC2压缩后会降低包体的大小,但同时会增加运行时解压缩的时间消耗,总体来说效率影响是比较可控的。不同的贴图使用Crunched ETC2会有不同的压缩比,于是对于一类贴图批量控制贴图格式将达到更好的压缩性价比。 当时我们针对部分类型的帖图进行了Crunched ETC2的压缩,测试下来的效果是默认开启Crunched ETC2整体包体可以优化百分之十左右。其中在三星 Note3上,单张512开启10级Mipmap,解压时耗大约在2ms左右。 使用最新的Unity引擎启用Crunched后将获得更好的效率(Unity本身也持续有优化。貌似之前Crunched的作者已被官方收编)如果对包体大小要求较高,建议可以大胆尝试。 Q2:目前用Crunch ETC2算法压缩在安卓平台下一个2048*1536的图可以压到342KB。压缩比例很高,使用的版本用的Unity 2017还是更早? A2:当时是使用的Unity 4.7后来翻了5.6的源码移植。2017的算法有了更多的优化。感谢康斯特@UWA问答社区提供了回答 ScriptQ:Unity有自己的GC,.NET也有自己的GC,两者在游戏运行的时候,是如何协调工作的? A1:提出这个问题之前,先要搞清楚一个问题:Unity与Mono和.NET三个概念之间的的关系。维基百科: .NET框架(英语:.NET Framework)是由微软开发,一个致力于敏捷软件开发(Agile Software Development)、快速应用开发(Rapid Application Development)、平台无关性和网络透明化的软件框架。 .NET Framework是一个软件框架,可以理解为对一系列结构和功能的期待。不是一个具体的某个软件。最初有一段时间,.NET框架只能在Windows平台上运行。 Mono是.NET运行时和开发库的实现版本,为C#脚本提供一个编译器和运行的虚拟机(CLR)。Mono的初衷是:(1)使微软.NET应用可以跨平台运行 (2)支持.NET在Linux上使用。Mono比.NET Core支持更多的平台(如:Linux、FreeBSD、Unix、Mac OS X和Solaris)。 Unity引擎对跨平台特性有很大的需求,于是使用Mono提供C#等符合CLI规范的脚本语言的运行环境。 直观的理解参考下图: 总的来说,Unity驱动Mono,为C#等提供编译和运行的环境。而C#等脚本的GC便是由Mono的虚拟机提供的。 因此,题主说的Unity自己的GC,和.NET的GC,应该是一回事,也就是Mono的GC。(如有错误之处,希望大神指出) Ref: https://www.cnblogs.com/shanyou/p/4295163.html https://www.cnblogs.com/zhujinghui/p/3369217.html https://zh.wikipedia.org/wiki/.NET框架 https://en.wikipedia.org/wiki/Mono_(software)) https://www.cnblogs.com/u3ddjw/p/10909975.html 上面忽略了Native层的内存垃圾,不过Native的垃圾回收不存在像Mono一样的自动回收机制。需要主动调用Resources.UnloadUnusedAssets()来触发。 感谢Prince@UWA问答社区提供了回答 A2:Unity里面的 C# GC是针对代码层的。Unity的所谓GC是针对资源的。 感谢欧月松@UWA问答社区提供了回答 ...

June 24, 2020 · 1 min · jiezi