关于rendering:ScrollView如何裁剪粒子特效

1)ScrollView如何裁剪粒子特效2)Unreal在挪动设施中无奈应用Stat命令获取到GPU Thread的耗时3)Unity中如何看到相机视线范畴内的剔除后果 这是第354篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 RenderingQ:本想用模板测试实现裁剪成果,然而测试发现ScrollView的Mask在完结时会重置模板测试,如下图: 导致Draw Dynmic Particle System想通过模板测试,无奈失效。请问大家是如何解决的? 目前想到计划是:在渲染粒子时再做1次模板测试,渲染完再重置。 A:能够参考文章《Unity粒子在UI界面中的裁切、蒙版、层级问题的解决(ScrollView裁切、Mask蒙版、UI粒子层级关系)》。感激不打嗝@UWA问答社区提供了答复 PlatformQ:我在挪动设施Android上,输出Stat Unit命令,结果显示: Frame:42.33msGame:24.22msDraw:42.22msRHIT:25.00msMem:1.96GBDraws:496Prims:545.33KB 为什么没有GPU的耗时显示呢?可能是什么起因? A:Stat Unit在挪动平台是无奈显示GPU信息的,能够借助第三方工具剖析GPU。感激Saber@UWA问答社区提供了答复 ScriptQ:Unity中如何看到相机视线范畴内的物体?相似Unreal Engine的FreezenRendering性能,不便疾速的定位视锥体剔除。 A1:1)如果“UE的freezen rendering”是指UE的FreezeRendering,能够参考《可视性和遮挡剔除》。<br/>2)如果应用Unity,能够参考《【unity】性能优化之——视锥体剔除(Frustum Culling)(一)》。感激Jackie@UWA问答社区提供了答复 A2:能够用SceneVisibilityManager的Hide和Show接口,加上下面提到的相机剪裁面相干API本人写一段代码来实现。感激欧月松@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.comUWA社区:community.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

September 22, 2023 · 1 min · jiezi

关于rendering:从Gamma空间改为Linear空间会导致性能下降吗

1)从Gamma空间改为Linear空间会导致性能降落吗2)如何解决没有应用Unity Ads却收到了GooglePlay平台的正告3)C#端如何解决xLua在执行DoString时候死循环4)Texture2DArray相干 这是第350篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 RenderingQ:Linear性能比Gamma差吗?咱们我的项目从之前应用的是Unity 2020.2.7f1版本,抉择的是Gamma。目前降级到2021.3.21f1,切换为Linear空间,Shader和图片都进行过批改,性能也优化过。 然而总体测试下来性能不如之前的Gamma,帧率没有以前高,帧率掉了很多,通过优化,还是不太令人满意,总感觉会卡顿,不晓得是不是从Gamma降级到Linear的起因? A1:应该和换色彩空间没关系。如果没有非凡性能,Gamma和Linear的次要区别就是最初输入到显示器时要不要做色彩的修改,依据你的形容应该和批改Shader无关。感激李伟@UWA问答社区提供了答复 A2:在硬件反对的设施上,不该当有显著的性能差别。 在硬件不反对的状况下(比方OpenGL ES 2.0),如果是基于Shader中的模仿转换来实现Linear Space的成果,会有肯定的GPU耗费。然而如果感触上是卡顿,而非继续的低帧率,那也不像是这种状况,倡议从具体的性能Profile数据动手来进行排查。 这里有一个相干的探讨,搜寻performance关键词能够看到一些人做的试验:https://forum.unity.com/threads/gamma-vs-linear-space.613294/ 局部论断援用如下:“I have just done a stress test of Gamma vs Linear color spaces with transparencies and Gamma is indeed a liiiitle faster than Linear, but the difference is so minimal it doesn't even matter. (2 to 3 frames per second more on a stress test that was overdrawing 8 transparent planes one over the other for the full screen space.)On any GPU that handles GLES3 there is no performance reason to use Gamma space over Linear. ...

August 30, 2023 · 1 min · jiezi

关于rendering:为何反射探针关闭Mipmap后变成了白图

1)为何反射探针敞开Mipmap后变成了白图2)2021.3 Android从AssetBundle中加载视频播放失败问题3)SBP是否能够解决打包时FBX等模型文件中额定的GameObject4)Addressables加载已打包过的Prefab后Mono脚本失落 这是第349篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 RenderingQ:反射探针敞开Mipmap后,变成了白图,请问这是为什么? A:是与以下这个选项无关: 在Unity官网手册中提到,该选项会以镜面卷积的形式解决立方体贴图的Mipmap: 不过这里的Mipmap和传统的Mipmap不太一样,是依据粗糙度不同进行划分的: 在Shader代码中也能够看到: 如果把这个设置改成none,那么无论开不开Mipmap都是一样的成果。 感激真谛@UWA问答社区提供了答复 LoadingQ:在Unity 2021.3版本下,Android从AssetBundle中加载视频播放:AndroidVideoMedia::OpenExtractor could not translate archive 1. 应用的版本是Unity 2021.3.82. 在打包视频的时候设置了不压缩3. AssetBundle放在StreamingAssets目录下4. 相干代码 btn.onClick.AddListener(() => { AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/assetbundle/videos"+ "/1109.ab"); Debug.Log(ab == null); videoPlayer.clip = ab.LoadAsset<VideoClip>("1109"); videoPlayer.Play(); });///build BuildPipeline.BuildAssetBundles(config.OutPath, BuildAssetBundleOptions.UncompressedAssetBundle, config.buildTarget);呈现的问题:在Android 9.0以下手机加载视频播放不了,日志: Unity AndroidVideoMedia::OpenExtractor could not translate archive:/CAB-8621c60d70de42f9c22e8270082bc81a/CAB-8621c60d70de42f9c22e8270082bc81a. resource to local file. Make sure file exists, is on disk (not in memory) and not compressed.Android 9.0以上则没有问题。 ...

August 29, 2023 · 1 min · jiezi

关于rendering:Wwise内存问题

1)Wwise内存问题2)安卓平台特效显示不统一的问题3)多个矩形小方块组成的地形接缝处有黑线问题 这是第339篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 WwiseQ:Unity自带的Profiler工具不能对Wwise内存进行Profiler,用Wwise Profiler只能看到一个总的Total Used,具体加载了哪些没有一个具体的表格,有什么工具或者办法能够截取音频的内存快照呢? 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/6474912f279f4105e1cb543a RenderingQ:明天测试反馈了一个问题,说咱们这个特效在安卓手机上显示很多尖刺,试了很多办法都没有用,感觉遇到常识盲区了,有大佬晓得其中的原理吗? Unity下的成果:就是用一个摄像头去看一个筒状模型,边缘是失常的。 安卓手机下的截图:打包放到手机下面看就呈现很多尖刺,我晓得这些就是筒的面片,然而不晓得为何会和Unity上的有差别。 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/646db8220cb71c66f8a213ab RenderingQ:多个矩形小方块组成的地形的接缝处会有黑线,特地是摄像机旋转的时候,如下图中跟虚线一样的就是交接的中央。原本黑线更显著,我在Shader里增加了ZTest Less缓解了不少,但摄像机旋转的时候还是会若有若无。请问这个怎么解决? 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/64788a8047691b75be04aa8d 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.comUWA社区:community.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

June 7, 2023 · 1 min · jiezi

关于rendering:SRP-Batcher在真机上失效

1)SRP Batcher在真机上生效2)Shader外面对同一张纹理屡次采样会影响效率吗3)为什么纹理开启了mipmap后,纹理内存反而降落了4)TMP为什么有屡次Delegate.Combine()的GC 这是第336篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 RenderingQ:Shader是Compatible的,在编辑器外面DrawCall也是SRP Batcher合批的,然而在真机上却没有合批胜利,是什么起因造成的? A:须要排查对应的Shader是否存在在Constant Buffer中却不在Properties中的Uniform变量,这种情况会导致在OpenGLES的真机上SRP Batcher生效,然而这种情况在编辑器外面是SRP Batcher合批且Shader显示是Compatible的。感激Xuan@UWA问答社区提供了答复 ShaderQ:Shader外面对同一张纹理做屡次采样会影响效率吗? float2 flowVector = tex2D(FlowMap, IN.uvMainTex).rg * 2 - 1;float noise = tex2D(FlowMap, IN.uvMainTex).a;如上代码,有材料简略提了一句说Shader代码编译的时候会主动优化到一次采样外面去,不过并没提是SurfaceShader才有的编译优化还是所有的Shader的编译优化都会这样? A:测试后果来看,只有是uv雷同的贴图采样,surface和unlit shader编译之后都会优化掉多余的采样次数。感激范世青@UWA问答社区提供了答复 TextureQ:为什么纹理开启了mipmap后,纹理内存反而降落了? A:很可能是Quality Settings外面的Texture Quality抉择的不是Full Res导致的,比方抉择的是Half Res,这样对于开启了mipmap的纹理来说,第0层的mipmap层级就不会加载进内存,所以纹理内存反而表小了。 通过测试,1024x1024 ETC2_8Bits格局的纹理,没开启mipmap是1MB,开启了变成333KB,512x512 ETC2_8Bits格局的纹理,开启mipmap前后别离是256KB和128KB。 感激Xuan@UWA问答社区提供了答复 LuaQ:只有一个界面对一个TMP的OnPreRenderText进行了一次+=的操作,为什么在其余界面也发现有Delegate.Combine()的GC,且每次大小不同? 这是惟一操作过的界面: 这是其余界面,有2M的,还有些几十K的。 A:Unity TextMeshPro (TMP) 组件的OnPreRenderText事件是一个委托类型,能够通过 += 运算符来订阅事件,但每次订阅事件时都会创立一个新的委托实例。如果须要屡次订阅事件,须要应用Delegate.Combine() 办法将多个委托实例合并为一个。然而,每次应用Delegate.Combine() 办法都会创立一个新的委托实例,这可能会导致频繁的垃圾回收。 依据你的形容,只有一个界面对一个TMP的OnPreRenderText 进行了一次 += 的操作,但在其余界面也发现了Delegate.Combine() 的垃圾回收。这可能是因为 TMP 组件在外部订阅了OnPreRenderText事件,并且每次订阅事件时都会应用Delegate.Combine() 办法。此外,可能还存在其余脚本或组件订阅了该事件,导致创立了额定的委托实例。 每次Delegate.Combine() 办法创立的委托实例的大小可能不同,这取决于合并的委托实例的数量和每个委托实例的大小。因而,每次Delegate.Combine() 办法调用时,垃圾回收器可能会回收不同大小的垃圾。为了缩小垃圾回收的频率和影响,你能够尽可能减少应用 Delegate.Combine() 办法的次数,并确保及时勾销订阅不再须要的事件。 感激轩辕小羽@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.comUWA社区:community.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

May 23, 2023 · 1 min · jiezi

关于rendering:TMP的阴影性能如何

1)TMP的暗影性能如何2)CommandBuffer.DrawMeshInstanced无奈画暗影问题3)Unity编辑器在Require大量加载Lua文件时,常常报出not enough memory4)场景制作的时候,2D资源受后处理调色影响比拟大 这是第335篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 TextMeshProQ:请问TMP的暗影性能如何?TMP的描边没方法改成外描边吗?看起来Outline是内外都扩的,如果想要改成外扩只能改源码吗? A1:UGUI的Outline会让对象多渲染n次,TMP的Outline并不会让对象的渲染次数减少,性能更好。 在这个Shader中把“+outline”删除,Outline就会只往外扩散了。 感激Xuan@UWA问答社区提供了答复 A2:TMP的暗影性能十分不错,因为它应用的是基于间隔场的渲染技术,这种技术能够在放弃高质量的状况下缩小渲染工夫。这意味着,即便在文本中应用多个暗影成果,也能够取得良好的性能体现。 至于TMP的描边成果,它是反对外描边的。默认状况下,TMP的描边是内外都扩的,然而你能够通过更改材质属性来将其改为外描边。 具体来说,你能够在应用TMP组件的对象上找到对应的材质,而后将材质的Outline Width属性设置为正数,这样就能够将描边扩大到文本的内部。 须要留神的是,TMP的材质是应用ShaderLab语言编写的,如果须要批改其外部逻辑,可能须要肯定的编程常识。然而,对于简略的批改,例如更改描边成果,你能够尝试应用Shader Graph工具来简化批改过程。 感激NG週@UWA问答社区提供了答复 RenderingQ:想用CommandBuffer.DrawMeshInstanced画暗影,应用的是URP的Lit Shader,ForwardLit 是能够的,且能够AfterRenderingOpaques。然而暗影是画不进去,请问有什么解决办法吗?以下是代码(代码不是原创):https://forum.unity.com/threads/commandbuffer-drawmeshinstanc... 局部代码截图: 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/6455c52f66cf0b727a3226f9 RenderingQ:场景制作的时候,要不要开着后处理,遇到的问题是2D资源受后处理调色影响比拟大? 咱们的状况比较复杂:1. 从性能角度思考,低配机型是不开后处理的2. 2D角色、2D修建、3D场景混合渲染3. 有半解锁的和平迷雾成果 在这些需要下,场景制作跟后处理要怎么协同呢? 思考了几个计划都不太行:1. 在UI相机画2D,但无奈完满解决深度问题,因为场景的RT是缩放过的,但UI采纳全分辨率2. 2D片写入Stencil,有一些半透的云可能遮住2D片,写入Stencil解决的话可能会有显著的边界问题,且UberPost最初是全屏的,因为场景RT跟界面RT尺寸不同,Stencil也不对应3. 将后处理的调色放到Opaque之后进行,但这样其余的半透则无奈参加调色,且这种计划带来更多的RT切换,在挪动端并不明智 当初想着是在不开前期的状况下设计场景,而后前期调色只是进行微调,尽量不影响2D,如果成果甚微的话,就不开启前期调色了,不知这样解决如何?次要是2D与3D混合的场景,不是说UI,UI相机自身是不开前期的,不知大家有什么计划? 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/643e255a4530066a5c277d8f LuaQ:在Unity 2018编辑器上跑时,启动Require大量加载Lua文件时,常常报出not enough memory,很频繁但非必现,在Windows/Android/iOS上都不会,用的是toLua。 A:能够在编辑器外面用System.IO.File的接口读Lua,避开TextAsset在编辑器不能卸载的问题。或者尝试降级Lua版本。感激欧月松@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.comUWA社区:community.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

May 17, 2023 · 1 min · jiezi

关于rendering:Application-targetFrameRate设置帧率慢

1)Application. targetFrameRate设置帧率慢2)URP Shader FrameBuffer Fetch Mali Crash3)Unity 2021出Profiler包长时间黑屏问题4)在Android设施上,是否能够同时预览前后摄像头 这是第334篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 RenderingQ:应用天玑8100处理器,我的项目用到动静帧率,60/30频繁切换,关了垂直同步的。在30切60时,若场景有大量GPU Skin,30到60就特地慢,大略6-7秒。 求教下有解决办法吗? A:这个问题的起因有几个方面: targetFrameRate从30切换到60时,须要渲染更多的帧来达到60fps的帧率,这会导致GPU须要做更多工作,特地是在场景中有大量GPU皮肤(GPU Skin)这类资源时,GPU的工作量会猛增,因而帧率切换时会呈现比拟长的Stall。尽管敞开了垂直同步(VSync),然而GPU仍须要肯定的工夫来筹备好图像并切换帧缓冲(Framebuffer),这也会导致额定的提早。如果GPU渲染能力较弱,那么在简单场景下,特地是产生帧率变动时,GPU更难以跟上CPU的节奏,导致呈现卡顿。Unity的Render Pipeline机制也会对此产生影响。当指标帧率变动时,Unity须要重新配置和优化其渲染流程,这也须要肯定的工夫,在低端GPU上会更显著。综上所述,这个问题的本源在于GPU在解决大量GPU资源的简单场景时,渲染能力跟不上帧率的变动,导致Tile重绘和Framebuffer切换时呈现提早景象。 一些改良措施能够尝试: 防止频繁切换targetFrameRate,尽量保持稳定的帧率。缩小场景中的GPU资源或减低材质品质来升高GPU负载。应用更高性能的GPU,特地进步GPU的带宽和填充率指标。调整Unity的Graphics品质设置,敞开一些高负载的成果。优化自定义Shader的性能,缩小适度耗费GPU资源的Shader。感激NG週@UWA问答社区提供了答复 RenderingQ:以下设施应用FrameBuffer Fetch华为Mali设施编译Shader间接闪退,然而如果把纹理采样去掉就失常了,有遇到过这种问题的嘛? Unity 2021.3.23Custom SRPDevice : HUAWEI P40 --- Mali-G76 代码如下: Shader "unlit/test"{ Properties { _Color ("Main Color", Color) = (1,1,1,1) [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } Pass { Name "ForwardLit" Tags {"LightMode" = "UniversalForward"} HLSLPROGRAM #define ENABLE_FRAMEBUFFER_FETCH 1 #pragma vertex Vertex #pragma fragment Fragment #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Varyings { float4 positionCS : SV_POSITION; float4 texcoord : TEXCOORD0; half4 color : TEXCOORD2; UNITY_VERTEX_OUTPUT_STEREO }; TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); CBUFFER_START(UnityPerMaterial) half4 _Color; CBUFFER_END Varyings Vertex(Attributes input) { Varyings output; UNITY_SETUP_INSTANCE_ID(input); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); output.positionCS = TransformObjectToHClip(input.positionOS.xyz); output.texcoord = input.texcoord.xyxy; output.color = input.color; return output; } half4 FragmentInner(Varyings input) { half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_LinearClamp, input.texcoord.xy).rgba; return color * input.color * _Color; } void Fragment(Varyings input, inout half4 output : CoLoR0) { half4 col = FragmentInner(input); output.rgb = lerp(output.rgb, col.rgb, col.a); output.a = col.a; } ENDHLSL } }}设施自身是反对GL_EXT_shader_framebuffer_fetch的,代码如下: ...

May 6, 2023 · 2 min · jiezi

关于rendering:ParticleSystem中的Culling-Mode对耗时有怎样的影响

1)ParticleSystem中的Culling Mode对耗时有怎么的影响 2)对于API,OpenGL和Vulkan的疑难 3)SVC别离收集Keyword,屡次收集与独自收集Warmup内存比拟 4)Occlusion Culling是否升高Culling耗时 这是第332篇UWA技术常识分享的推送,也是《厚积薄发 | 技术分享》第二回,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:https://community.uwa4d.com UWA QQ群:465082844 RenderingQ:请问ParticleSystem中的Culling Mode对耗时有怎么的影响? A:当Culling Mode设定为Automatic,将Simulation Space批改为World,或者加了一些Module,都会导致屏幕外的ParticleSystem被Culling生效,从而导致耗时减少。所以尽量应用Pause的模式,而不要应用Automatic。 实质起因是World或者其它的Module会影响粒子系统的可预测性,这样会导致没法Culling。影响因素如下: 具体参考: https://blog.unity.com/technology/unitytips-particlesystem-pe... 感激Xuan@UWA问答社区提供了答复 RenderingQ:想问一下,下图中所说的这个能够打完包后在游戏内动静批改吗? 还是只能在这边设置批改? 另外,目前支流是动静抉择API还是只设置OpenGL?因为发现高端机,主动抉择Vulkan,会呈现闪屏的问题,想问问目前支流是怎么的? A:(1)这个应该不能在游戏内动静批改,Force OpenGL启动之类的形式也须要通过命令行来操作。 能够参考: https://forum.unity.com/threads/how-can-i-set-unity-opengles-... (2)如果是确认了下面闪屏的问题是Vulkan导致的,那能够去掉主动API,把OpenGL设置成首选项,当然也能够间接去掉Vulkan。目前国内大部分中高端手机,2017年当前安卓7以上都是反对Vulkan的。 但要说支流的话,还是倡议OpenGL的,因为若是Vulkan和OpenGL这两套驱动API,反对Vulkan的肯定反对OpenGL。 该答复由UWA提供 RenderingQ:SVC别离收集Keyword,屡次Warmup会导致内存比独自收集且一次性Warmup内存更高吗? A:Warmup变领会导致PSS内存回升,离开收集后离开预热变体和收集所有变体后一次预热减少的内存基本一致。当卸载SVC后内存降落。 一一Warmup,而后帧卸载所有SVC。 Warmup单个SVC,而后卸载SVC。 感激Xuan@UWA问答社区提供了答复 RenderingOcclusion Culling是否升高Culling耗时? 如果我的项目应用了多线程渲染且开启了Occlusion Culling,通常会导致子线程的压力过大导致整体Culling过高。 因为Occlusion Culling须要依据场景中的物体计算遮挡关系,因而开启Occlusion Culling尽管升高了渲染耗费,其自身的性能开销却也是值得注意的,并不一定实用于所有场景。这种状况倡议开发者选择性地敞开一部分Occlusion Culling去测试一下渲染数据的整体耗费进行比照,再决定是否须要开启这个性能。 期待更多探讨,欢送大家转至UWA社区交换: https://community.uwa4d.com/blog/detail?id=156161329240514560... 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.com UWA社区:community.uwa4d.com UWA学堂:edu.uwa4d.com 官网技术QQ群:465082844

April 20, 2023 · 1 min · jiezi

关于rendering:Unity升级后打包AssetBundle变慢

1)Unity降级后打包AssetBundle变慢2)打包使有些资源合成了一个资源data.unity3d,有些离开的起因3)Unreal在挪动设施中无奈应用Stat命令获取到GPU Thread的耗时4)Unity中如何看到相机视线范畴内的剔除后果 这是第330篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 AssetBundleQ:最近降级到了2021,遇到个奇怪的问题。打AssetBundle包,后面的速度失常,打到场景的时候变的十分慢,每2个场景之间不晓得为什么停了1分钟,几十个场景,加起来AssetBundle包不到20MB,打了1个半小时,如果我只打这些场景,速度就是失常的,残缺打AssetBundle包到了场景这里就特地慢。 A:能够尝试用Scriptable Build Pipeline来打包,在输入目录能够看到json文件,用Perfetto能够关上这个文件看耗时信息。https://docs.unity3d.com/Packages/com.unity.scriptablebuildpi...该问答由UWA提供 BuildQ:为什么打进去的包有些是资源合成了一个资源data.unity3d,有些是离开的? A1:能够看看是不是以下这个设置导致的: 感激范世青@UWA问答社区提供了答复 A2:比拟倡议应用LZ4的压缩形式的,AUP上传纹理必须应用LZ4的压缩形式,TextureStreaming也依赖LZ4的压缩。感激Xuan@UWA问答社区提供了答复 UnrealQ:我在挪动设施Android上,输出Stat Unit命令,结果显示: Frame:42.33msGame:24.22msDraw:42.22msRHIT:25.00msMem:1.96GBDraws:496Prims:545.33KB 为什么没有GPU的耗时显示呢?可能是什么起因? 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/641d1ca66778221ae304da66 RenderingQ:Unity中如何看到相机视线范畴内的物体?相似Unreal Engine的FreezenRendering性能,不便疾速的定位视锥体剔除。 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/63b41cd03bd6691a9ddc485c 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

April 4, 2023 · 1 min · jiezi

关于rendering:MeshRenderer如何使用GPU-Instancing的材质球正常合批

1)MeshRenderer如何应用GPU Instancing的材质球失常合批2)对于AssetBundle加密,如何从新实现LoadFromFile接口3)挪动端凋谢世界类型游戏中抉择动静暗影技术以及优化计划组合4)Unity导出Gradle工程,如何避免gradle-wrapper.properties文件的更改被笼罩 这是第329篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 RenderingQ:MeshRenderer应用GPU Instancing的材质球,不能失常合批。 材质球是反对实例化的,应用Graphics.DrawMeshInstanced能够失常绘制,然而应用MeshRenderer就不能失常合并,目前猜想是Shader的问题,因为URP自带的Lit材质球就能够失常合并。 经查,是因为开启了URP的SPR Batcher,Unity优先采纳了SPR Batcher,那么请问,手机端当初到底是走GPU Instancing还是SPR Batcher优化成果更佳呢? A:这两种都是同一种思路来进步渲染效率,就是缩小状态切换开销,在渲染数量十分大的状况下显然GPU Instancing更有劣势,但GPU Instancing的限度太大,只能利用到特定场景。 倡议在理论利用时大量雷同物体用GPU Instancing去实现,其它状况SPR Batcher。 感激李伟@UWA问答社区提供了答复 AssetBundleQ:请问,对于AssetBundle加密这块,如何从新实现LoadFromFile接口? A1:倡议简略做下Offered Load,真的想解资源方法多的是,越大的我的项目搞AssetBundle资源加密越影响游戏性能,齐全得失相当。感激学无止境@UWA问答社区提供了答复 A2:解密最大的问题就是会多一份内存,如果能够复用一个大的Byte数组,那是不是能够做到内存不会减少。 这个大的Byte数据要多大,能够在生成资源时计算一个最大值进去。 有一个问题就是加载对象前不能更改这个数组,所以解密完要把里边所有的资源先加载一次,而后再去解密另一个文件。 咱们我的项目里的数据表加载就是用的这种思路,一部分表解密完就会生成对象,这些表能够复用一个Byte数组,一部分表要在获取时生成对象,这些表就要保留一个独立的Byte数组。 从新实现LoadFromFile接口我感觉行不通,对于lz4的Bundle加载完只是加载了资源的形容信息,只有在调用加载对象的办法时才会再解压资源进去,除非解密完存到本地文件系统,加载完后再删除。 感激李伟@UWA问答社区提供了答复 RenderingQ:当初的挪动端游戏越来越多地向凋谢世界聚拢。求教一下大家会应用的技术组合有哪些?1. 近距离时的高质量软暗影技术,是应用PCSS吗?2. 配角或次要场景的动静暗影技术,会实时更新多大范畴的Shadow Map?3. 绝对较远的地位的暗影是否会进行转为动态暗影并进行缓存?Cascaded Shadow Map分级有什么根据吗? 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/63f3771a06385405990fbcbb AndroidQ:在降级Gradle版本过程中,批改了gradle-wrapper.properties文件中的distributionUrl,然而每次在Unity导出Gradle工程后,gradle-wrapper.properties文件就会被主动笼罩,导致批改无用。请问如何避免被笼罩? A1:能够试试在这里导出Gradle工程之后,手动批改一下这个文件:感激范世青@UWA问答社区提供了答复 A2:还有一个办法就是下载对应版本的Gradle版本,而后笼罩编辑器装置目录下的Gradle版本,因为从新生成的distributionUrl的Gradle版本就是对应着编辑器目录的Gradle版本。感激题主萧逐风@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

March 24, 2023 · 1 min · jiezi

关于rendering:SRP合批问题

1)SRP合批问题2)多个Base相机渲染到同一个渲染指标,挪动平台花屏的问题3)粒子系统对GPU Instancing的反对4)如何批改URP下场景和UI分辨率拆散(不须要改色彩空间) 这是第327篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 RenderingQ:在我的项目中,场景都是用SRP进行合批,SRP合批的要求是雷同Shader且Keyword雷同,然而通过实际发现,其实还有其余比方Cull Off或者Back就会影响不能合批。 因而有2个问题:1. 除了下面提到的Cull和Keywords,大家还有遇到什么状况不能合批吗?2. 这种Cull不能合批,大家是否有一些奇妙的教训,在不影响性能(如Cull都改成Off)的状况下,尽可能合批? 对于第二点,Cull这种,尝试都变成Back,这样反面会裁剪,然而有时候个别物体会Off,就没方法解决了,还有其余计划吗? A1:应用了不同材质的物体之间地位交叉也会导致合批失败。 举例说明,如果场景中有三个Shader,别离是A、B、C。应用这种Shader的物体各三个,一共九个物体随便摆放在场景中,让它们之间的地位穿插在一起,按理说是三个SRP Batch就能够实现的事件,硬是会被分成4-6个SRP Batch,因为不同的交叉程序会导致不同数量的Batch。 同时想问一下有什么方法使得它们即便地位有交叉也能只应用3个SRP Batch就实现? 感激Fantic-Xush@UWA问答社区提供了答复 A2:合批是要把应用雷同属性材质的渲染对象提交一次设置申请,这就要求在渲染过程中不能有状态扭转,你的截图中的这几项就代表多个属性,只有其中一项有变动,那就会中断合批。属性一样是硬性要求,剩下的就是开发者设置自定义的渲染程序。 像多个物体因为地位不同导致的合批失败,如果物体是通明的,为了通明性能正确会依据远近来确定渲染程序。如果是不通明物体也可能为了渲染效率把离相机近的提前渲染。 感激李伟@UWA问答社区提供了答复 RenderingQ:场景中常驻一个场景相机(Base)和UI相机(Overlay),有时候会呈现动静加载的Prefab(比方某个模型)自带一个渲染相机(前面称为动静相机),相机模式为Base。 因为想要和之前的渲染后果叠加,Background Type为Uninitialized,导致挪动平台渲染指标的Load Action为DontCare,所以屏幕中未被动静相机渲染的局部呈现花屏景象。 不过我想,既然Overlay能够实现正确的叠加,那Base也应该能够才对,于是我看下源码,并打了一些Log,发现动静加载的Base相机在SetRenderTarget的时候colorBuffer的Load Action的确是Load,所以比拟困惑为什么挪动平台依然是DontCare? 顺便想问一下,以上的需要正确的做法是不是把动静相机改成Overlay,并用代码把相机放入常驻场景相机的CameraStack中? 为了进一步了解,我又参考了URP自带的FinalBlitPass的做法: 但在Xcode外面查看依然对不上: 发现在Blit到一个曾经有内容的RT时,RT的LoadAction默认是Load,内置管线下能够应用RenderTexture.DiscardContents来防止,URP下有什么相似的办法吗? 针对以上问题,有教训的敌人欢送转至社区交换分享 RenderingQ:请问粒子系统是否可能反对GPU Instancing?做了些例子都没能看到GPU Instancing失效。 A1:Unity 2018曾经反对ParticleSystem的GPU Instancing了,不过必须是Mesh模式的,具体能够看这个文档:https://docs.unity3d.com/Manual/PartSysInstancing.html该答复由UWA提供 A2:粒子系统有必要用GPU Instancing实现吗?粒子系统的实现和GUI的实现差不多。把数据放到VBO上还是放到UBO区别不太大,并不能大幅度晋升效率,限度多通用性也不强。感激李伟@UWA问答社区提供了答复 RenderingQ:请问URP下场景和UI分辨率拆散怎么批改(不须要改色彩空间)? 临时没用到场景线性和UI Gamma,想单纯的批改场景分辨率而不批改UI的分辨率,不想独自给UI一个Buffer。 目前看URP源码,Overlay的UI相机间接用Base的相机的Buffer。 之前看到有计划,间接将UI绘制到屏幕上的。我仿造FinalBlitPass,在DrawObjectsPass里判断是否是UI相机从新设置了setRenderTarget,然而没有成果,UI没有绘制进去。请问这个计划可行吗? DrawObjectsPass.cs : if (!renderingData.cameraData.camera.CompareTag("UICamera")){ context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock);}else{ cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, // color RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare); context.ExecuteCommandBuffer(cmd); cmd.Clear(); context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock);}A1:须要将3D场景渲染到RT外面,再将RT作为RawImage的Texture渲染到UI外面,这样能够通过管制RT的分辨率来管制场景的渲染分辨率。 ...

March 8, 2023 · 1 min · jiezi

关于rendering:URP自带的Tone-mapping性能开销问题

1)URP自带的Tone mapping性能开销问题2)图集中未应用到Sprite也会被加载到内存中的问题3)GPU带宽:从纹理登程优化带宽①4)GPU带宽:从纹理登程优化带宽②5)GPU带宽:从纹理登程优化带宽③ 2023年伊始,从本期第320期的UWA《厚积薄发》开始,本专栏将以全新的风貌和大家见面。UWA将为大家精选UWA社区的热门话题,保留了经典的QA环节,并减少了UWA社区中相干的游戏开发技能,助力大家全面地把握更多元的知识点。 UWA社区主页:https://community.uwa4d.comUWA QQ群:465082844 RenderingQ:想理解下URP自带的Tone mapping性能开销,有用过的大佬分享下吗? A:Tone mapping,如果在LDR的状况下应用ACES的Tone mapping,会有十分高的开销,如果是HDR,则简直是收费的,只有一个纹理采样的开销。因为HDR的状况下,会在LUT的DrawCall中将 Tone mapping烘焙到32x1024的小图外面,所以开销是非常低的。如果是LDR,ACES的Tone mapping则会在UberPost的DrawCall外面进行十分高分辨率(渲染分辨率)的计算,因而开销会十分高。另外一种Netural则不管HDR还是 LDR,只会令UberPost的复杂度减少2,然而LDR下的ACES则会让UberPost的复杂度减少23。感激小ben@UWA问答社区提供了答复 SpriteAtlasQ:我有一个图集(外面蕴含两个图片:Sprite_A和Sprite_B),进入游戏后,调用spriteatlasBundle.LoadAssetWithSubAssetsAsync(“Sprite_A”);然而关上Profiler查看,发现Sprite_B也被加载到内存中了。这是失常的吗? Unity版本:Unity 2020.3.26 A:这就是依赖加载。要查看进去,就是扫Prefab外面哪个依赖了这个资源。Sprite自身的尺寸能够疏忽。若图集加载了,图片就会有,Sprite那点耗费能够不关怀。<br/>值得注意的是,小心Sprite依赖加载,导致额定加载的整个图集。感激欧月松@UWA问答社区提供了答复 RenderingGPU带宽:从纹理登程优化带宽① 如果大家看过很多理论我的项目的带宽数据,就不难总结出一个法则:个别读纹理带宽占带宽开销的大头。GPU在读纹理时会取以后画的像素左近N*N的区域到OnChip缓存中,若下一个像素要采样的点恰好落在这N*N中,就不须要向更远的中央去取造成更高的带宽,即通过这种形式升高了Cache Miss的概率。基于这个原理,咱们对于绘制3D物体的贴图纹理要抉择适合的分辨率,防止出现用大纹理画小物体时,画下一个像素时在大纹理上的采样点跳变,导致落在N*N范畴内概率低的状况。最好的方法是间接为所有非2D UI的、有深度的物体的贴图纹理都开启Mipmap,此时GPU会主动抉择适合的Mipmap分辨率层级,从而升高Cache Miss概率、无效管制带宽。 GPU带宽:从纹理登程优化带宽② 除了开Mipmap这个简略暴力的伎俩外,还须要关注:开启各向异性或三线性插值会大幅减少采样次数,从而导致Cache Miss概率回升,挪动端我的项目个别不倡议用或我的项目中个别纹理成果应用即可。另外,纹理格局也会造成影响,像RGBA32这种未压缩格局的纹理单个像素存储的信息越多,造成的带宽开销也就越高,应尽量应用压缩率更高的格局。 GPU带宽:从纹理登程优化带宽③ 还有一种非凡的,也就是Render Texture资源须要额定提一下。其中,RT应用的精度越高,带宽开销越高,个别在挪动端上用ARGB32格局或RGB111110Float就够了,如果用到ARGBHalf可能就存在节约了;另外,RT的Copy、下采样操作也会造成较高的带宽,常见的如Copy Color、Copy Depth和Bloom后效都会产生较高带宽。 期待更多探讨,欢送大家转至UWA社区交换 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.comUWA社区:https://community.uwa4d.comUWA学堂:https://edu.uwa4d.comUWA官网技术QQ群:465082844

January 11, 2023 · 1 min · jiezi

关于rendering:FSRUnityURP-10-的性能和兼容性问题

1)FSR-Unity-URP 1.0 的性能和兼容性问题2)计算大文件MD5耗时问题3)如何监听Unity行将Reload Script4)如何对Unity游戏的Android解体和ANR问题进行符号化解析 这是第315篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:对于FSR-Unity-URP 1.0 的性能和兼容性问题: 测试环境:Unity版本:2020.3.3URP版本:10.4.0Graphics API:Vulkan设施:OPPO K1 1. 兼容性问题场景相机开启了HDR,URP下渲染指标RT的默认格局为B10G11R11_UFloatPack32,在设施上会报错:Format unsupported for random writes - RG11B10。该纹理格局不反对随机写入,之后强制把格局设置为R16G16B16A16_SFloat,问题解决,然而想找到更为正规的做法。 2. 性能问题:在OPPO K1上,场景失常渲染状态下GPU耗时为20ms左右,开启FSR Performance Level后,GPU耗时飙升到100ms左右,同时在HUAWEI P30 Pro上做了测试,FPS降落了3FPS左右。 用RenderDoc在Editor做了抓帧,性能热点集中在FSR的Compute Shader中: Compute Shader单个Thread的采样次数为12次。 另外,应用集成后处理的形式后,在OPPO K1上做了测试,发现后处理的开销比把RenderScale改成0.5后节俭的开销还要大很多,整体帧率反而降落了。 不晓得各位同学是否有把FSR落地到我的项目的教训,心愿能够分享下。 A1:不要用Compute Shader版本的实现,参考URP12里后处理形式的实现。<br/>前一段时间我试了下,在晓龙660这个级别是不太行,670上耗费和节约的差不多,670再往上的才开FSR好一点。感激金喆@UWA问答社区提供了答复 A2:以下答复供参考:1.兼容性问题求教了一下Unity的敌人,对于B10G11R11_UFloatPack32 这个Format,实现外面有个默认是桌面零碎的OpenGL规范的要求,OGLES默认无奈开启的,所以临时来说你的做法是一个正确的操作。或者只能等Unity更新Code来反对OGLES下的B10G11R11_UFloatPack32。 2.性能问题:不是很相熟URP12上的后处理形式和Compute Shader实现的具体内容,下面金喆大佬的答复应该更靠谱。就以后贴出来的内容来看Compute的实现,仅从Driver和HW角度,可能有两个中央会导致肯定的性能问题:即vkCmdBeginRenderPass(C=Load, DS=load)和vkCmdEndRenderPass(C=store, DS=store),这两个中央Load Store都是必须的吗?尤其是DS局部? Store和Load会耗费GPU带宽去同步Mem读写vkCmdDispatch(188,94,1)和vkCmdDispatch(1,1,1),这两个WorkItem都不是一个很现实的设置,个别的手机平台的GPU配置,都心愿这两个是一个2的某个次方的,典型的是32的倍数或者64/128/256/512之类的倍数,若太大(比方超过2048,只是举例)或者太小(比方小于32)都会比拟影响GPU执行计算时候的并行度。 这两个可能是在骁龙660的K1上Compute执行工夫很长的局部起因。至于HUAWEI的Core,相似Turbo之类的技术会在底层思考一些优化而更改了APP的申请,从而导致性能稳定状况不太统一。 感激Seague@UWA问答社区提供了答复 ScriptingQ:在计算大文件MD5的时候,存在耗时重大问题,大略2分钟,在手机上承受不了,有大佬有办法吗? 测试发现:改Buffer大小到1MB,由2200毫秒变成了1980毫秒,优化成果并不显著。https://itecnote.com/tecnote/... A:能够尝试应用xxHash算法,比照过性能数据,比MD5算法快很多。https://github.com/uranium62/...https://github.com/Cyan4973/x...感激马三小伙儿@UWA问答社区提供了答复 ScriptingQ:请问如何监听Unity行将Reload Script? 有找到办法 [UnityEditor.Callbacks.DidReloadScripts(0)] ,这个是Reload Script之后的回调,但未找到Reload之前的监听办法,请问有方法监听到吗? A:以下两个事件,在一开始配合InitializeOnLoadMethod或者InitializeOnLoad应用:AssemblyReloadEvents.beforeAssemblyReloadAssemblyReloadEvents.afterAssemblyReload 再说个模式切换事件:EditorApplication.playModeStateChanged,我本人写了一个手动Reload Script,参考如下:https://github.com/ZeroUltra/... 感激zerolj@UWA问答社区提供了答复 ScriptingQ:如何对Unity游戏的Android解体和ANR问题进行符号化解析? A1:Google Play反对在Play管理中心为每个利用版本上传调试符号文件。这样能够更轻松地剖析和修复解体和ANR问题。 从Unity 2020.3及更高版本开始,您能够依照Unity的指南生成Android符号,而后将符号化解析文件上传到Google Play管理中心,以便在Android Vitals信息中心查看人类可读懂的堆栈轨迹。 否则,您能够依照Unity中的对Android解体进行符号化解析一文,手动解析堆栈轨迹或为较低版本的Unity生成符号文件。 ...

November 30, 2022 · 1 min · jiezi

关于rendering:Vulkan-API的性能及兼容性

1)Vulkan API的性能及兼容性2)FrameTiming.gpuFrameTime获取GPU耗时有什么条件3)MMO外面的寻路网格如何制作4)万国这种联盟边界的实现思路 这是第314篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:请问一下目前Android设施用Vulkan API的我的项目多吗,性能、兼容性及稳定性如何? A:Vulkan用的比拟好的应该是《咫尺明月刀》手游,《王者光荣》在三星平台上也开发过一段时间的Vulkan的版本,然而之后如同就更新打回ES版本了。感激萧小俊@UWA问答社区提供了答复 有没有更多的开发者能提供一些Vulkan稳定性相干的教训分享呢?欢送大家转至社区交换。 RenderingQ:手机为什么上获取不到FrameTiming.gpuFrameTime的工夫? 版本Unity 2020.3,手机华为 Mate 30P,CPU工夫能够显示但GPU工夫获取不到,测试代码如下: using System;using UnityEngine;using Unity.Profiling;public class FrameTimingsHUDDisplay : MonoBehaviour{ GUIStyle m_Style; // Profiling state. private int frameCount = 0; private float accumulatedFrameTimeCPU = 0.0f; private float accumulatedFrameTimeGPU = 0.0f; private float frameSampleRateMS = 0.0f; private FrameTiming[] m_FrameTimings = new FrameTiming[1]; void Awake() { m_Style = new GUIStyle(); m_Style.fontSize = 15; m_Style.normal.textColor = Color.white; } void OnGUI() { CaptureTimings(); var reportMsg = $"\nCPU: {m_FrameTimings[0].cpuFrameTime:00.00}" + $"\nMain Thread: {m_FrameTimings[0].cpuFrameTime:00.00}" + $"\ncpuTimeFrameComplete: {m_FrameTimings[0].cpuTimeFrameComplete:00.00}" + $"\ncpuTimePresentCalled: {m_FrameTimings[0].cpuTimePresentCalled:00.00}" + $"\nGPU: {m_FrameTimings[0].gpuFrameTime:00.00}" + $"\nCPUTotal: {accumulatedFrameTimeCPU:00.00}" + $"\nCPUAverage: {(accumulatedFrameTimeCPU / frameCount):00.00}" + $"\nGPUTotal: {accumulatedFrameTimeGPU:00.00}" + $"\nGPUAverage: {(accumulatedFrameTimeGPU / frameCount):00.00}"; var oldColor = GUI.color; GUI.color = new Color(1, 1, 1, 1); float w = 300, h = 210; GUILayout.BeginArea(new Rect(32, 100, w, h), "Frame Stats", GUI.skin.window); GUILayout.Label(reportMsg, m_Style); GUILayout.EndArea(); GUI.color = oldColor; } private void CaptureTimings() { FrameTimingManager.CaptureFrameTimings(); uint frameTimingsCount = FrameTimingManager.GetLatestTimings(1, m_FrameTimings); if (frameTimingsCount != 0) { accumulatedFrameTimeCPU += (float)m_FrameTimings[0].cpuFrameTime; accumulatedFrameTimeGPU += (float)m_FrameTimings[0].gpuFrameTime; } else { accumulatedFrameTimeCPU += Time.unscaledDeltaTime * 1000.0f; // No GPU time to query. } ++frameCount; }}以上问题有哪位大拿也已经做过相似的测试,能够来分享一下,欢送转至社区交换: ...

November 23, 2022 · 1 min · jiezi

关于rendering:Unity场景物体动态合批

1)Unity场景物体动静合批2)Unity内置音频Android平台播放提早问题3)对Unity Package中的Shader打包防止冗余的计划4)UnityEditor PropertyField并排显示谬误 这是第307篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ1:问题1:为了能使场景中物体合批(同材质球),场景在制作的时候雷同的预制体放在了一起,然而FrameDebug看到的却是乱序。请问在这个Frame里的程序是如何定义能力达到雷同的合批?也就是如何能起码化的Objects have different materials? 问题2:在FrameDebug高低排列且雷同物体,仍然没有合批。给出的起因是“Objects are lightmapped”。网上给出的解释是应用了不同的光照贴图(这里是一样的),或在雷同的光照贴图中由不同的光照贴图UV转换关系。这个转换关系是什么意思?是UV对应的Offset几个参数必须要一样么?然而物体在不同的地位,实践上肯定会不一样。请问这个要怎么解决?目前场景中物体占用了120个DrawCall,想尽可能优化。 A:第一个问题,针对不通明物体,Unity默认由近往远绘制(离相机的间隔),所以如果想要雷同的材质球是间断绘制的,能够通过调整RenderQueue来强行间断绘制,不过可能会导致渲染成果不合乎预期(遮挡关系错乱),另外的害处是会毁坏Early-Z的性能,尤其在没有HSR性能的低端机上,Overdraw会造成高复杂度的Shader带来的GPU高压力,所以须要衡量CPU提交Batch的耗时和GPU的压力。 第二个问题,同类型材质球(Shader一样,变体也一样),如果Lightmap index不一样(也就是Lightmap不一样),必定是不能合批的(SRP Batcher除外,SRP Batch忽视材质球,只有Shader和变体一样就能够)。在Lightmap雷同的状况下,如果对应的unity_LightmapST不一样,也是不能合批的。这里有两种办法解决,一种是用Static Batching,这样会让unity_LightmapST变成同一种,具体的UV会变成顶点数据(原本子Mesh的UV都是(0,1)的,合并Combined Mesh后会变成相似于(0.3,0.5)这样的区间),就是说顶点外面的UV原本存储的是Local空间的,变成Combined Mesh后,合体的Mesh数据外面存储的是World空间的,这样外在的unity_LightmapST对于不同的子Mesh就会变成共用的(1,1,0,0)这样的独特属性,也就能够合批了。另外一种是开启GPU Instancing,这样unity_LightmapST会变成CBuffer,这样也是会合批的。 如下图所示,Cube1和Cube2在FrameDebugger的惟一区别就是unity_LightmapST不一样,所以不开启GPU Instancing和Static Batching的状况下,是不能合批的,尽管它们是相邻的绘制程序,Lightmap也是雷同的。另外两个Cube(1)和Cube别离用的Lightmap2和Lightmap0。 开启动态合批后,两头的2个Cube合成了一个Batch,它们的unity_LightmapST变成了独特的(1,1,0,0),如下图: 材质球勾选GPU Instancing后,在FrameDebugger面板外面,曾经看不到unity_LightmapST这个属性了。这两个Cube也是合成了一个Instanced Batch。如下图: 感激Xuan@UWA问答社区提供了答复 Q2:对于第二个问题的解决办法。因为咱们是动态创建物体。所以无奈用动态合批。当我尝试应用GPU Instancing 后,批次简直没变,一种是咱们的不同的Mesh,应用同一个材质球,无奈合批;其次是同一个Mesh也无奈合批。如下提醒: 另外仍然还有“Objects are lightmaped”的提醒,且曾经没有Lightmap_ST,材质球都已勾选GPU: 还有Shader是有两个PASS的。是否另一个PASS也须要退出GPU Instancing 的代码?附Shader代码: Shader "WF/SceneObj"{ Properties { [NoScaleOffset]_MainTex("主贴图 (RGBA)", 2D) = "white" {} [Space(20)] _OutlineWidth("描边宽度", Range(0, 0.5)) = 0.018 _OutlineColor("描边色彩", Color) = (0, 0, 0, 1) [Space(20)] _EmissionMask("自发光遮罩 (G)", Range(0, 5)) = 1 [HDR]_EmissionColor("自发光色彩", Color) = (1, 1, 1, 1) _Color("Color", Color) = (1, 1, 1, 1) } SubShader { Tags{ "RenderType" = "Opaque" "Queue" = "Geometry+1" } // lightmap Pass { Tags { "LightMode" = "ForwardBase" } CGPROGRAM #pragma multi_compile_fwdbase #pragma multi_compile_instancing #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" #include "AutoLight.cginc" #pragma multi_compile_fog #define USING_FOG (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)) struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; float2 texcoord : TEXCOORD0; float3 uv1 : TEXCOORD1; // lightmap UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; float2 uv1 : TEXCOORD2; half3 worldlight : TEXCOORD1;#if USING_FOG fixed fog : TEXCOORD3;#endif UNITY_VERTEX_OUTPUT_STEREO UNITY_VERTEX_INPUT_INSTANCE_ID }; sampler2D _MainTex; float4 _MainTex_ST; float _EmissionMask; fixed4 _EmissionColor; UNITY_INSTANCING_BUFFER_START(Props) UNITY_DEFINE_INSTANCED_PROP(float4, _Color) UNITY_INSTANCING_BUFFER_END(Props) v2f vert(a2v v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_TRANSFER_INSTANCE_ID(v, o); o.pos = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // o.worldlight = UnityObjectToViewPos(v.normal); o.uv1 = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; // fog#if USING_FOG float3 eyePos = UnityObjectToViewPos(v.vertex); float fogCoord = length(eyePos.xyz); // radial fog distance UNITY_CALC_FOG_FACTOR_RAW(fogCoord); o.fog = saturate(unityFogFactor);#endif return o; } fixed4 frag(v2f i) : SV_Target { UNITY_SETUP_INSTANCE_ID(i); fixed4 originalCol = tex2D(_MainTex, i.uv) * UNITY_ACCESS_INSTANCED_PROP(Props, _Color); ////------------------------------漫反射------------------------------ //-----------------------------------自发光 //float emission = originalCol.a * _EmissionMask; //自发光 //float emisstionValue = emission < 0.5 ? 0 : 1; fixed3 emisstionCol = originalCol.rgb * _EmissionColor.rgb * _EmissionMask; // //叠加 fixed3 finnalCol = originalCol; fixed4 col = (fixed4)1;#if defined(LIGHTMAP_ON) // half4 bakedColorTex = UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv1.xy); col.rgb = DecodeLightmap(bakedColorTex);#endif finnalCol = lerp(finnalCol, emisstionCol, originalCol.a) * col.rgb; // fog#if USING_FOG finnalCol.rgb = lerp(unity_FogColor.rgb, finnalCol.rgb, i.fog);#endif return fixed4(finnalCol, 1); } ENDCG } Pass { NAME "OUTLINE" Cull Front CGPROGRAM #pragma multi_compile_fog #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 pos : SV_POSITION; UNITY_FOG_COORDS(0) }; sampler2D _MainTex; float4 _MainTex_ST; fixed4 _OutlineColor; float _OutlineWidth; v2f vert(a2v v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); float3 viewNormal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal); float2 ndcNormal = normalize(TransformViewToProjection(viewNormal.xy)) * pow(o.pos.w, 0.6) * 2; float4 nearUpperRight = mul(unity_CameraInvProjection, float4(1, 1, UNITY_NEAR_CLIP_VALUE, _ProjectionParams.y)); float aspect = abs(nearUpperRight.y / nearUpperRight.x); ndcNormal.x *= aspect; o.pos.xy += ndcNormal * _OutlineWidth * 0.1; UNITY_TRANSFER_FOG(o,o.pos); return o; } fixed4 frag(v2f i) : SV_Target { fixed3 col = _OutlineColor.rgb ; return fixed4(col, 0); } ENDCG } } Fallback "Diffuse"A:动态创建物体的动态合批的办法能够参考StaticBatchingUtility.Combine的API,这是一项运行时动态合批的做法;其次如果应用了多个Pass的Shader,想要应用GPU Instancing进行合批,每个Pass都要设置成GPU Instancing能力失常合批。感激宗卉轩@UWA问答社区提供了答复 ...

August 24, 2022 · 4 min · jiezi

关于rendering:手机端出现ZFighting现象

1)手机端呈现Z-Fighting景象2)不应用Scenes In Build的形式加载场景3)同时打包Vulkan和OpenGLES会使得Shader内存翻倍吗4)MaterialPropertyBlock批改多材质对象的问题 这是第306篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:咱们的游戏,手机端呈现Z-Fighting景象,且不稳固呈现。大部分的状况是刚进入大厅场景角色没闪动,进行战斗一场后切出来容易呈现闪动景象。查看了美术的角色模型,确实有近距离面的问题。 美术提出来的问题是近距离面,尤其不规则面应该拉多远才行,为何在Unity PC端上始终是失常的? A1:你能够先调整一下近立体和远立体,不要差值太大。感激1 9 7 3-311135@UWA问答社区提供了答复 A2:参考以下几点:挪动端的深度Buffer精度问题,在PC DX下有usesReversedZBuffer,所以精度Buffer比拟平均,挪动端GL稍远一点可能会丢精度,解决方案也是楼上说的调整近立体远立体。如果模型导入器开了Mesh压缩,能够去掉试试。如果是渲染程序是固定的,能够思考在Shader中应用Offset做偏移,也可能会好。感激范世青@UWA问答社区提供了答复 A3:手机上深度精度低,咱们个别设置0.1到3000,就缩小大部分闪动,剩下的还闪的就美术做拆散度高一些。感激UDX@UWA问答社区提供了答复 ScriptQ:想要动静应用名称来加载场景。所以不应用在Scenes In Build的形式,在真机上是能够应用AssetBundle来加载指定名称的场景,然而编辑器里也想放弃雷同的加载形式,是否有不应用Scenes In Build的形式加载场景呢? A:用这个接口就行了:UnityEditor.SceneManagement.EditorSceneManager.LoadSceneInPlayMode(string path, SceneManagement.LoadSceneParameters parameters);感激corsair@UWA问答社区提供了答复 AssetBundleQ:同时打包Vulkan和OpenGLES会使得Shader内存翻倍吗? A:不会。试了一下对于同一个Shader资源,上图设置里只保留一种图形API和两种都有时的区别,和只有一种API时相比,保留两种图形API,会使打包时这个Shader的变体翻倍,从而使包体大小回升。但运行时该Shader的内存却不会因而翻倍。感激Faust@UWA问答社区提供了答复 RenderingQ:MaterialPropertyBlock对SkinnedMesh上多材质球的其中一个批改会影响所有的材质球,请问如何解决? A:对于这个状况我在Unity 2018.4、2019.4、2020.3和2021.1这四个较新稳固版本尝试复现,发现2018.4、2019.4和2020.3中都呈现了楼主说的状况,直到2021.1版本中能力失常批改。因而揣测为Bug,但去Unity的Release Note中搜寻了一番,目前没看到相干的修复条目。 又试了一下MaterialPropertyBlock对个别MeshRenderer的多材质球的状况,在上述这些版本中都是能够只批改一个并只影响该材质球的,阐明该Bug只存在于SkinnedMeshRenderer。 所以如果的确有别离批改SkinnedMeshRenderer的多材质球的需要,在不合适通过降级Unity版本来解决该问题的前提下,为了优先实现性能的话,目前倡议对于SkinnedMeshRenderer改为对材质自身进行操作(相似于material.SetColor),只管这样的确会产生更多材质实例。 感激Faust@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

August 10, 2022 · 1 min · jiezi

关于rendering:如何只降3D相机不降UI相机的分辨率

1)如何只降3D相机不降UI相机的分辨率2)Unity应用Wwise音频打包后没声音3)和平迷雾中按区域解锁的不规则地形区域边缘是如何实现的4)PC包中文门路问题 这是第305篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:我的项目因为GPU压力较大,打算通过升高分辨率的形式来缩小性能压力。在降分辨率时,有什么办法能够只降3D相机,不降UI相机? A1:须要将3D场景渲染到RT外面,再将RT作为RawImage的Texture渲染到UI外面,这样能够通过管制RT的分辨率来管制场景的渲染分辨率。感激han@UWA问答社区提供了答复 A2:这个是我批改的URP管线:URP-12-GammaUIAndSplitResolution 次要解决的问题是:线性工作流下,场景相机和UI相机采纳独立的分辨率,并且UI可能放弃在Gamma色彩空间下工作(详情能够查看我的项目readme文件)。 感激夜莺@UWA问答社区提供了答复 WwiseQ:手动将GeneratedSoundBanks文件拖到StreamingAssets下还是没声音,Log也没显示找不到声音文件,求指导! A:Wwise的Bank加载机制相似于File.Open(Path),这种API对于安卓手机上的StreamingAssets目录(只读JAR包)是不能够的,你能够把Banks从StreamingAssets目录外面复制到Persistent Path外面。感激夜莺@UWA问答社区提供了答复 RenderingQ:如下图,这种和平迷雾的不规则区域是如何实现呢?按区域解锁,这种不规则的区域边缘大略是怎么的逻辑? 一次性解锁N个格子的区域,这N个区域应该是多边形Mesh,边缘应该是直的,然而不晓得在Shader里如何计算让他变得不规则还能连贯,像是做了噪声? 而且Mask都是按格子存的像素点,得进去区域边缘都是直的,这种不规则的连贯如何实现呢? A1:把地图宰割成多个Cell,而后每次解锁一片。至于看上去的不规则是通过一些固定的随机算法显示图片,原理和拼图差不多。感激萧小俊@UWA问答社区提供了答复 A2:绘制迷雾加一个能够Read/Write的Mask应该也能够实现。 直的还是不规则的具体看你的Mask的分辨率,而且Mask的值也不是非零即一的,要看具体怎么实现。 感激羽飞@UWA问答社区提供了答复 A3:能够参考:《平滑过渡的和平迷雾(一) 原理:Warcraft3地形拼接算法》感激jim@UWA问答社区提供了答复 ScriptQ:游戏打包时装置目录是中文,PC包的中文门路大家个别用什么办法解决? A:通常状况C#都是应用Unicode,库提供的文件读取办法应该是反对中文的。然而,如某些C库进行文件读取(比方可能会遇到间接通过lua_loadfile这类接口的),须要应用WindowsAPI:WideCharToMultiByte把Unicode转换为零碎可能辨认的多字节字符串后,再传给须要进行文件读取的接口。感激lujian@UWA问答社区提供了答复 封面图来源于《URP从原理到利用——进阶篇》 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

July 26, 2022 · 1 min · jiezi

关于rendering:UWA问答精选

1)Unity性能优化剖析思路2)资源打包关系依赖树3)SpriteAtlas 中Include in Build的作用4)应用Streaming Mipmap后纹理内存没有降落的疑难5)URP Renderer Feature实现二次元描边,Cutout的解决问题 UWA每周推送的知识型栏目《厚积薄发 | 技术分享》曾经随同大家走过了330个工作周。精选了2022年上半年的精彩问答分享给大家,期待UWA问答持续有您的陪伴。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) UnityQ:Unity有多少优化点?比方合批:动态合批、SRP合批、GPU实例化、UGUI Reruild、光照烘焙、反射探针、光照探针、Shader.Parse、Shader.CreateGPUProgram、场景加载优化和GC优化,还有哪些优化点? A1:大方向上能够从CPU、内存、GPU这三个方向切入。 细分一下能够从CPU、内存、渲染、资源优化、耗电优化、网络优化、卡顿优化、优化工具的抉择把握这几个点动手。一、CPU优化 缓存计算结果预处理限帧法主次法多线程引擎模块(动画、物理、粒子、导航)逻辑优化二、内存优化 缓存法内存池资源管理器管制GC逻辑优化Shader变体数量优化三、渲染优化 SetPassCall渲染状态切换频次管制DrawCall数量管制带宽负载显存占用GPU计算量四、卡顿优化 降帧法摊帧法限度数量法逻辑优化IO优化应用进度条五、资源优化 纹理优化UI优化字体优化模型优化场景优化粒子优化材质优化指定规范美术标准Shader变体数量优化六、耗电优化下面说到的优化点,或多或少都会影响到手机的耗电,也是优化耗电的措施,除此之外还有: 动静调整限帧动静调整画质七、网络优化 缩小无用字段升高字段精度防止反复发送网络异步化压缩有效字节压缩协定包以上说的这些要点,大部分摘抄演绎自《移动游戏性能优化通用技法》。强烈建议多花些工夫认真浏览一下这篇文章,而后以这篇文章作为指南,再去认真钻研外面提到的优化细节该如何开展。 感激马三小伙儿@UWA问答社区提供了答复 A2:优化点必定是无穷无尽的,这里搬运UWA的客户端性能优化思路,针对常见的引擎模块的相干问题都做了剖析,讲的是比拟全比拟透的,常见的优化难题都列举了。 《Unity性能优化 — 物理模块》《Unity性能优化 — 动画模块》《Unity性能优化系列 — 资源内存透露》《Unity性能优化系列—Lua代码优化》《粒子系统优化——如何优化你的技能特效》《Unity性能优化系列—加载与资源管理》《Unity性能优化系列—渲染模块》《Unity性能优化 — UI模块》《反对资源加载剖析、场景宰割》《UWA报告应用小技巧,你get了吗?》《UWA本地资源检测更新,助你严守我的项目性能的每个角落!》 感激芭妮妮@UWA问答社区提供了答复 AssetBundleQ:想做包体资源剖析,大家有什么好的树显示工具或者思路举荐吗?有比拟好的开源计划也能够。最简略就像N叉树一样,比方root一个文件名,而后开展整个树结构。 A1:我本人做了一个,供参考。都是用Unity本人的IMGUI最根本的接口去实现。EditorWindowsGUI.BoxGUI.BeginGroupGUI.LabelHandles.DrawBezierHandles.DrawWireDiscTreeView基本上,组织好各个AssetBundle的依赖关系其实是很好出现的。感激黄程@UWA问答社区提供了答复 A2:举荐一款比拟好用的插件,不止有依赖树,还有其余打包的资源数据可供剖析:https://assetstore.unity.com/... 感激郑骁@UWA问答社区提供了答复 AssetBundleQ:SpriteAtlas中Include in Build的作用是什么? A:专门做了一些测试,具体如下: 以下表白中Sprite对应的是Sprite类型的对象,Texture2D对应的是Texture2D的对象,这和Sprite对象是齐全不同的货色,sactx示意生成的图集纹理。 测试状况包含2个变量: SpriteAtlas对象是否被动打包AssetBundleSpriteAtlas对象上是否勾选Include in Build第一种状况,SpriteAtlas打包AssetBundle: 那这里要思考的是SpriteAtlas援用的Sprite是否会独自打包,如果这些小Sprite不被动打包,是会被动进这个SpriteAtlas的AssetBundle外面的,如果其余的UI Prefab中,比方有个Image应用了一个小Sprite,那么这个小Sprite就冗余了。 这里勾不勾选Include in Build的区别在于:加载Image的时候,这个Image会不会主动显示,勾选了Include in Build,会主动显示图片,不勾选,则须要脚本增加回调来被动加载SpriteAtlas,并callback(spriteatlas)。 第二种状况,SpriteAtlas不退出AssetBundle打包: 不勾选Include in Build假如小的Sprite打包AssetBundle,在这个AssetBundle外面不会有sactx,这个sactx的Texture2D的纹理变成“隐没”的状态,没有任何货色能够援用到这个sactx纹理,而且因为在工程外面有SpriteAtlas的存在,所以在小的Sprite的AssetBundle外面也不能让其自身对应的小的Texture2D纹理进AssetBundle包,所以图像就永远显示不进去了。勾选Include in Build所有的小的Sprite所在的AssetBundle外面都会被动蕴含sactx的图,且会蕴含所有没有被动打包的小的Sprite。如Sprite1和Sprite2是SpriteAtlas外面的两个小的Sprite。Sprite1被动打包,Sprite2不被动打包,那么Sprite1的AssetBundle外面是会有Sprite1和Sprite2以及sactx纹理。 总结: 如果有Sprite退出了某个SpriteAtlas,那么任何真正应用到这个Sprite的资源都不会有对Sprite对应的小的Texture2D纹理的援用,而是对sactx图集纹理的援用。如果SpriteAtlas不打包,必须勾选Include in Build,否则sactx纹理就“隐没”了,在勾选Include in Build的前提下,而且SpriteAtlas中的所有小的sprite必须打包到同一个AssetBundle外面,否则sactx会冗余。如果SpriteAtlas打包了AssetBundle,sactx永远不会冗余了(这里的冗余是指打包AssetBundle造成的冗余)。SpriteAtlas外面的小的Sprite也最好打包AssetBundle,不然这些小的Sprite就会冗余。勾选或者不勾选Include in Build都不影响各种依赖关系,惟一的区别是是否会被动显示图片,勾选了就会被动显示图片,不勾选就须要脚本管制来显示图片。感激Xuan@UWA问答社区提供了答复 ...

July 7, 2022 · 1 min · jiezi

关于rendering:2D项目大量物品图标Draw-Call优化方案

1)2D我的项目大量物品图标Draw Call优化计划2)UGUI SpriteAtlas的热更新问题3)iOS平台忽然有一帧UI渲染开销很高4)iOS上频繁Crash,堆栈很奇怪 这是第288篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:咱们有个2D我的项目,大抵布局如下图: 1.场景按格子划分,玩家能够在每个格子下面摆放物品,物品品种十分多(700+)。2.局部物品还有动画成果,动画会扭转该物品的材质属性。3.物品图标的大小不是严格一个格子大小,因而会有局部物品图标间的重叠。4.场景的视角可拖动,最远视距下能够看到超过100个物品。5.场景上除了物品,还有云雾、水波、发光粒子等各种特效。 具体实现:1. 场景底图采纳美术宰割形式,每张2048*2048大小,由16张组成,间接应用SpriteRenderer摆放渲染。2. 物品图标每张256以内,同样采纳SpriteRenderer摆放渲染。3. 应用Unity内置渲染管线。 通过一番Profile,发现目前次要性能问题在于Drawcall数量十分大,没摆满的状况下都靠近300,次要耗费点在于特效跟物品图标的渲染。 1.因为物品数量微小(后续还会减少),目前采纳SpriteAtlas形式把所有物品图标进行合图,会产生3张2048*2048尺寸的图集,各个物品可能会随便扩散在这3张图里,加上物品交叉显示,导致无奈合批。2.物品有状态,不同状态会对材质属性进行变更,扭转灰度亮堂度等成果,导致无奈合批。3. 场景上的粒子特效是3D的,会随便在物品图标中挪动交叉,导致图标无奈合批。 曾经思考过,但否决了的计划:1.把图标放大,使生成的图集在一张2048以内。=> 询问过策动,物品品种目前还不是全副的,残缺的配置里有超过1000+物品,都合成到一张2048里不事实。2.图标不合图集,间接散图集成,采纳运行时动静合图形式对场上物品进行合图。=> 游戏次要玩法会导致不停拖动物品图标以及旧物品的删除跟新物品的生成,操作会十分频繁,动静合图形式耗费微小。 鉴于下面所形容的情况,各位大佬有没有什么举荐的优化计划? A1:能够从以下形式动手: 首先图片和图集缩小Draw Call没问题,图集也应该做分类,把能组合的类型调配并归类。图集不是谋求少就好,应该是动静拆散,还有按我的项目分类。做到图集数最优,这个就要联合本人的项目分析了。而后合批的问题要解决。重写一个Shader,挂载到SpriteRenderer上,扭转这个材质上的属性能够防止导致无奈合批。格子布局应该防止元素重叠,这个在设计就要防止的。粒子特效尽量用2D成果来做体现,粒子的发射数量与粒子数量也要做衡量。感激廖武兴@UWA问答社区提供了答复 A2:倡议动静图集,动态图集在这种状况下,根本是负优化。感激uwa菜鸡奶泡泡.@UWA问答社区提供了答复 A3:这个问题,其实挺好解决。<br/>1.背包的物品组件做一个循环动静列表性能,这样同屏加载不会很多。2.物品的同一个组件进行拆分,比方bg一个图集, icon一个图集,数字图片一个图集,特效纹理一个图集。<br/>这样下来DrawCall个别在三四个能够搞定。感激郑佳宇joe@UWA问答社区提供了答复 AtlasQ:UGUI图集切换后,图集中的图片名称不变,只是扭转该图片为其余图片,然而为什么在加载UIPrefab的AssetBundle之后,UI上对应批改的图片会呈现白图?会发现SpriteAtlas的CanBindTo返回false。 A:替换图片时,不批改原GUID则能够防止这个问题。感激题主Austin@UWA问答社区提供了答复 UGUIQ:iOS平台通过Profile定位性能,偶现某一帧UI开销异样高,通过Timeline看到是Render引起的,然而不晓得后续应该如何定位。 这里能够看到这一阵Render开销达到了12.35ms,其余帧只有不到2ms。 A:EmitWorldScreenspaceCameraGeometry(图中紫色)这个函数是UGUI的Canvas网格重建生成UI Draw Call的开销,次要工作在Native子线程进行,主线程体现为该函数的期待开销,倡议排查该时刻是否有较为简单的UIPanel创立(联合Profile的UI模式)。感激羽飞@UWA问答社区提供了答复 iOSQ:在线上FireBase收集到不少的iOS Crash。Crash的栈有很多种,但共同点是通过Il2CppInvokerTable.cpp的第4336936768行(一个不合理的行号)指到了某个函数,之后可能会调用本身若干次,再跳转到一个不确定的地位Crash掉。咱们尝试过给该函数做过爱护修复,但公布后还s会Crash,调用又全副换成了另一个函数。所以狐疑并不是某个函数自身的问题。 大部分是后盾触发,但也有前台触发的。大部分零碎残余内存不多(<100MB),但也有残余超过1GB的。零碎版本次要是iOS 15,咱们有接入一些iOS原生的SDK。 版本信息:Unity 2018.4.30IL2CPP只有iOS 狐疑有某个函数指针的指向谬误导致,但如何持续定位问题呢? A1:FireBase上面对IL2CPP局部的堆栈还原是有Bug的,根本看不出来是哪个堆栈,能够尝试下通过增加自定义事件和Log查看大略在哪解体的,而后再尝试重现和修复。 这个从Unity的堆栈下面来看,是挂在某个线程了。<br/>我年前给FireBase团队提的Bug,对应的issue在这里:https://github.com/firebase/q... 感激梅辰@UWA问答社区提供了答复 A2:倡议增加一下Unity的符号表。感激郑佳宇joe@UWA问答社区提供了答复 封面图来源于:Simple inventory system for unityUnity3D的背包零碎。 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

March 7, 2022 · 1 min · jiezi

关于rendering:如何给带透明的Sprite生成深度图

1)如何给带通明的Sprite生成深度图2)SpriteAtlas中Include in Build的作用3)multi_compile的Keyword是不是须要被动退出到SVC外面去4)Shader里4个float和float4的差异 这是第282篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:如下图:场景是用Sprite拼的,需要是应用ShadowMap给精灵增加实时暗影,做法是用一个摄像机对精灵进行拍摄以渲染Depth数据到Render Texture上生成ShadowMap,而后在地板Shader里对ShadowMap进行采样绘制出暗影。 教程链接:https://blog.csdn.net/l364244... 当初遇到的问题是:拍摄精灵时Shader的RenderType只能是Opaque,不能应用Transparent和TransparentCutout,导致的问题是半透明边缘无奈失常投影,请帮忙看一下如何解决。 上图中,两头的胶囊失常暗影,左侧为投影成果(疏忽渲染不失常),右侧为原图,右下角是生成的ShadowMap。 A:能够参考一下这个教程:https://catlikecoding.com/uni...感激羽飞@UWA问答社区提供了答复 AssetBundleQ:SpriteAtlas中Include in Build的作用是什么? A:专门做了一些测试,具体如下: 以下表白中Sprite对应的是Sprite类型的对象,Texture2D对应的是Texture2D的对象,这和Sprite对象是齐全不同的货色,sactx示意生成的图集纹理。 测试状况包含2个变量: SpriteAtlas对象是否被动打包AssetBundleSpriteAtlas对象上是否勾选Include in Build第一种状况,SpriteAtlas打包AssetBundle: 那这里要思考的是SpriteAtlas援用的Sprite是否会独自打包,如果这些小Sprite不被动打包,是会被动进这个SpriteAtlas的AssetBundle外面的,如果其余的UI Prefab中,比方有个Image应用了一个小Sprite,那么这个小Sprite就冗余了。 这里勾不勾选Include in Build的区别在于:加载Image的时候,这个Image会不会主动显示,勾选了Include in Build,会主动显示图片,不勾选,则须要脚本增加回调来被动加载SpriteAtlas,并callback(spriteatlas)。 第二种状况,SpriteAtlas不退出AssetBundle打包: 不勾选Include in Build假如小的Sprite打包AssetBundle,在这个AssetBundle外面不会有sactx,这个sactx的Texture2D的纹理变成“隐没”的状态,没有任何货色能够援用到这个sactx纹理,而且因为在工程外面有SpriteAtlas的存在,所以在小的Sprite的AssetBundle外面也不能让其自身对应的小的Texture2D纹理进AssetBundle包,所以图像就永远显示不进去了。勾选Include in Build所有的小的Sprite所在的AssetBundle外面都会被动蕴含sactx的图,且会蕴含所有没有被动打包的小的Sprite。 如Sprite1和Sprite2是SpriteAtlas外面的两个小的Sprite。Sprite1被动打包,Sprite2不被动打包,那么Sprite1的AssetBundle外面是会有Sprite1和Sprite2以及sactx纹理。 总结: 如果有Sprite退出了某个SpriteAtlas,那么任何真正应用到这个Sprite的资源都不会有对Sprite对应的小的Texture2D纹理的援用,而是对sactx图集纹理的援用。如果SpriteAtlas不打包,必须勾选Include in Build,否则sactx纹理就“隐没”了,在勾选Include in Build的前提下,而且SpriteAtlas中的所有小的sprite必须打包到同一个AssetBundle外面,否则sactx会冗余。如果SpriteAtlas打包了AssetBundle,sactx永远不会冗余了(这里的冗余是指打包AssetBundle造成的冗余)。SpriteAtlas外面的小的Sprite也最好打包AssetBundle,不然这些小的Sprite就会冗余。勾选或者不勾选Include in Build都不影响各种依赖关系,惟一的区别是是否会被动显示图片,勾选了就会被动显示图片,不勾选就须要脚本管制来显示图片。感激Xuan@UWA问答社区提供了答复 AssetBundleQ:multi_compile是不是须要被动退出到SVC外面去? A:对于一个Shader资源来说,在我的项目进行打包构建时,multi_compile定义的关键字会把Shader中含有该关键字但理论未应用的变体也进行构建,而shader_feature定义的关键字则不会。 但当咱们我的项目中应用SVC收集变体时,并不是所有multi_compile定义的变体都须要被动退出到SVC中,只有咱们理论用到的须要收集。 进行试验如下:试验构建场景,通过SVC收集变体、打成AssetBundle包。在场景中提前加载并Warmup,再实例化一个用到相干Shader中变体“FOG_EXP2”的预制体。(变体“FOG_EXP2”是multi_compile关键字定义的。) 状况一:SVC中没有蕴含变体“FOG_EXP2”。此时会在实例化时触发Shader.CreateGPUProgram(相当于回到该SVC所援用的Shader中去加载了),不满足咱们收集变体并预热、从而升高游戏过程中Shader加载耗时的需要。 状况二:SVC中收集了变体“FOG_EXP2”。实例化时没有触发Shader.CreateGPUProgram,阐明该变体被失常Warmup了。 论断是,对于包体构建是没有区别的,SVC打包时会依赖对应的Shader,multi_compile定义的关键字天然都会参加构建;对于变体预热,只有是须要用到的变体,必须收集到SVC中并Warmup后,才不会在实例化渲染时触发Shader.CreateGPUProgram。 感激Faust@UWA问答社区提供了答复 RenderingQ:明天看URP代码,发现URP里会把一些原本是float的数据平铺到4个float中,再用一些Mask之类的操作取出数据。 用float4与用4个float的区别是什么?看起来是有一些性能上的差异之类,URP里才会这样用。 A1:Float4能够利用SIMD指令减速。感激时雨苍炎@UWA问答社区提供了答复 A2:ES3.0的vertex shader中的attribute,float会依照float4进行计算。感激Tsai@UWA问答社区提供了答复 A3:应该是CBuffer的内存对齐float4更好组织数据,不容易呈现Bug。 HLSL CBuffer Packing规定能够参考:https://docs.microsoft.com/en... 感激羽飞@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

January 17, 2022 · 1 min · jiezi

关于rendering:子线程GC导致主线程函数耗时较高的问题

1)子线程GC导致主线程函数耗时较高的问题2)降级Unity大版本后,Text色彩批改问题3)革除增量式GC导致的Mono堆内存透露问题4)多Pass合批优化问题 这是第274篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:在主线程中有十分多的卡顿,从UWA的报告中看到很多异样的高耗时,请问可能是什么起因造成的? A:像下面这样的频繁卡顿,且卡顿函数品种十分多的状况,应该是子线程调配了十分多的堆内存,导致子线程GC,从而卡住了主线程。当GC的时候,主线程可能会处于各种阶段,因而对应阶段的函数耗时就会包含期待GC的耗时。能够从UWA的Mono报告中查看是否有子线程调配了大量的堆内存,通常是由这种(Thread)打头的子线程函数的调配导致的。感激han@UWA问答社区提供了答复 UGUIQ:从Unity 4.6.9f1降级到Unity 2020.3.2.f1c1。首次Unity降级之后UI的Text色彩批改是失常。当运行一次之后,所有的Text色彩都无奈批改了。就算新创建一个新的Text也无奈批改。 A:会有多余的UI-Default和UI-DefaultFont这两个Shader,删除它们,而后重启Unity就好了。感激芝麻青豆角@UWA问答社区提供了答复 MonoQ:最近在钻研Mono堆内存时,发现一帧内调配屡次较大内存,会导致内存无奈被回收。 过程如下: 在同一帧内调用三次调配100MB内存的办法,分配内存的变量都是在各自的作用域,在这之后调用GC.Collect()。发现有较大几率呈现100MB或者200MB无奈被回收的Mono堆内存。通过排查之后发现勾销勾选Incremental GC之后,内存就能齐全被发出。 我揣测是每次申请内存的时候会执行一次GC,革除上一次调配的内存,然而因为应用增量GC,无奈在本帧实现回收工作。再下一次GC的时候,第二次GC的回收内容被重置了,导致第二次的GC须要被回收的内存就透露了。 不晓得我这么了解是不是对的,心愿大佬们解惑。同时心愿大佬告知有没有方法革除这部分内存。 测试环境:Unity 2019.4.15c1Unity 2020.4.15f2 测试平台:安卓 Mono 以下为测试代码: using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Profiling;public class TestMonoMemory : MonoBehaviour{ void Do() { CallBack01(); CallBack02(); CallBack03(); } public void CallBack01() { List<int> i = new List<int>(1024 * 1024 * 100 / 4); //CallBack02(); } public void CallBack02() { List<int> i = new List<int>(1024 * 1024 * 100 / 4); //CallBack03(); } public void CallBack03() { List<int> i = new List<int>(1024 * 1024 * 100 / 4); } public string text; private void OnGUI() { GUILayout.Label("Allocated Mono heap size :" + Profiler.GetMonoHeapSizeLong() / (1024 * 1024) + "MB"); GUILayout.Label("Mono used size :" + Profiler.GetMonoUsedSizeLong() / (1024 * 1024) + "MB"); GUILayout.Label("Total Reserved memory by Unity: " + Profiler.GetTotalReservedMemoryLong() / (1024 * 1024) + "MB"); GUILayout.Label("- Allocated memory by Unity: " + Profiler.GetTotalAllocatedMemoryLong() / (1024 * 1024) + "MB"); GUILayout.Label("- Reserved but not allocated: " + Profiler.GetTotalUnusedReservedMemoryLong() / (1024 * 1024) + "MB"); if (GUILayout.Button("DO")) { Do(); } if (GUILayout.Button("DO1")) { CallBack01(); } if (GUILayout.Button("DO2")) { CallBack02(); } if (GUILayout.Button("DO3")) { CallBack03(); } if (GUILayout.Button("GC")) { System.GC.Collect(); } }}A:通过题主的办法,我也复现了该问题。我还是比拟同意你的了解的。 ...

November 10, 2021 · 2 min · jiezi

关于rendering:如何动态使用烘焙出来的ReflectionProbe0exr信息

1)如何动静应用烘焙进去的ReflectionProbe-0.exr信息2)相机拉远后,SpriteRenderer图有显著的锐利3)Unity版本升级后Text的色彩批改有效4)Shader中UNITY_REVERSED_Z的含意 这是第273篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:筹备动静应用烘焙信息。Lightmap-0_comp_dir和Lightmap-0_comp_light都应用LightmapData进行失效。那ReflectionProbe-0.exr该怎么应用?如果不应用,物体都会偏灰一些。 A1:做一下搬运工,举荐参考:https://catlikecoding.com/uni...https://blog.csdn.net/puppet_...感激Xuan@UWA问答社区提供了答复 RenderingQ:相机拉远后,SpriteRenderer图有显著的锐利,想问下如何解决呢?FilterMode是选的Bilinear成果不大。MipMap试过,成果是好用,惋惜内存减少。想问下有没有其它好的形式解决呢? A:能够改贴图导入器的这两个选项:一个是开启MipMap,依据间隔远近选用不同的Mip等级;二是过滤模式,双线性会依据四周像素做含糊,也能够改善。 内存能够配合TextureStreaming,缩小运行时内存。 感激范世青@UWA问答社区提供了答复 RenderingQ:从Unity 4.6.9f1降级到Unity 2020.3.2.f1c1。首次Unity降级之后UI的Text色彩批改是失常。当运行一次之后,所有的Text色彩都无奈批改了,就算新创建一个新的Text也无奈批改。 A:咱们发现我的项目中有多余的两个Shader:UI-Default和UI-DefaultFont。这两个Shader在Assets目录下,不确定是不是Unity降级主动保留下来的,删除这个多余的Shader后重新启动Unity就能够了,这时候就能正确援用2020版本的内置的UI Shader了。感激题主小ben@UWA问答社区提供了答复 RenderingQ:想问一下Shader中UNITY_REVERSED_Z这个宏的含意是什么? A:DX,PS等平台定义了UNITY_REVERSED_Z,ZBufer的值[1,0],OpenGL中ZBuffer对应的是[-1,1]。 同时还有一个相干的宏UNITY_NEAR_CLIP_VALUE,近裁剪面NDC空间的Z值,DX下为1,OpenGL为-1。 对于UNITY_REVERSED_Z是能够使ZBuffer的浮点数值散布更加平均: Reversed_Z: 感激羽飞@UWA问答社区提供了答复 20211101更多精彩问题等你答复~ Unity增量打包AssetBundle没变动的资源也会被从新打包在模型有UV2的状况下开启Generate Lightmap UVs如何实现AAB包的增量更新封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

November 8, 2021 · 1 min · jiezi

关于rendering:Shader打AssetBundle包变体丢失问题

1)Shader打AssetBundle包变体失落问题2)Unity降级后在iOS平台的贴图导入问题3)字体文件AssetBundle包解体4)给主相机设置RT的注意事项5)FBX的导入WeldVertices的设置问题 这是第271篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) AssetBundleQ:Unity官网后处理PostProcessing,进行AssetBundle打包时,变体太多(4000+),批改了uber.shader,屏蔽了我的项目中不可能应用的关键字(前期要应用也能够通过热更批改)。 AssetBundle打包后,发现变体没齐全打包,Editor下查看Shader变体数量是300+,打包后应用AssetStudio查看AssetBundle,发现只打了100+的变体,大部分失落。运行通过断点调试也验证了所有Key均设置,FrameDebug中也失落了一些关键字。 uber.shader下所有关键字均是multi_compile 定义,实践上multi_compile定义的关键字都会全编译所有组合,然而打包后呈现失落。 A:在进行单元测试中,在一个空我的项目中打包uber.shader,发现打包后,变体正确。然而开发我的项目和打包我的项目仍旧生成不正确。狐疑是Unity缓存起因。于是删除Library目录下shaderCache,再次打包,还是不正确。再次删除已生成的AssetBundle资源,齐全从新生成,终于正确。 所以multi_compile定义的关键字打包呈现问题,须要删除缓存和已生成的AssetBundle能力最终正确生成新的AssetBundle。 感激题主1 9 7 3-311135@UWA问答社区提供了答复 AssetQ:咱们始终用贴图后处理脚本对贴图进行导入,在iOS平台应用ASTC_6x6格局。然而降级到Unity 2019,关上iOS工程,经同步缓存和导入实现后,大部分贴图的预览界面上并没有显示压缩格局和压缩后的尺寸,而是显示no yet compressed,仿佛导入操作没有实现。Android平台并没出问题。 这样的贴图会显示含糊,并且打出的Bundle还会更大。手动Reimport能够解决。然而如果另外建设一份工程拷贝,则又会呈现同样的问题。求问有什么解决办法? A1:经查,是我这边的纹理资源导入后处理脚本(iOS)有问题,然而其在Unity 2018下不会体现进去,然而在Unity 2019中会间接让某些贴图的导入工作无奈实现。因为应用了 Unity Accelerator(也就是Asset Pipeline v2对应的缓存服务器),从新导入也不会生成新的缓存,只能让进行从新导入的我的项目部分失常。 咱们的导入后处理脚本中在iOS下,对JPG独自应用了不带通明通道的ATSC压缩。在Unity 2019中,ATSC压缩不再辨别是否带通明通道。批改脚本+删除Unity Accelerator缓存+从新导入某个Working copy(同时也重建了缓存)可解决。 留神:上述无奈导入实现的状况,打出包来会有两个显著的问题:包体变大、图片含糊。 感激题主加菲教主@UWA问答社区提供了答复 AssetBundleQ:AssetBundle打包参数BuildAssetBundleOptions.DisableWriteTypeTree。会极大缩减AssetBundle包大小,同时也带来运行时SerializaFile雷同数量级下内存占用缩减一半左右,并进步加载速度。 官网阐明比较简单:如果开启DisableWriteTypeTree选项,则可能造成AssetBundle对Unity版本的兼容问题。基于其带来的运行时劣势,还是决定应用该选项。 导出测试包所有运行失常,热更新也运行失常,原本认为该优化就完结。然而起初发现雷同的AssetBundle资源,在编辑器下AssetBundle运行会解体(必然呈现),导出的测试包(所有平台)一切正常。(该问题必须要解决,因为游戏公布后线上的问题能够在本地调试复现,如果本地不能运行AssetBundle包或者运行不同的AssetBundle包原则上不容许。) A:开始排查问题:首先定位到解体的资源,是TMPTextPro相干的字体资源包(复合包,蕴含了多个资源内容)。 验证BuildAssetBundleOptions.DisableWriteTypeTree的影响,屏蔽BuildAssetBundleOptions.DisableWriteTypeTree打包参数。打包后编辑器运行不解体,必定了该参数造成的问题。(这里过后猜想是Unity外部代码的某个宏导致的,导致了在Editor下和公布时走了不同的解析代码,然而又没有源代码,无奈具体验证。) 开始排除问题:首先排除Unity的编辑器缓存造成的该问题,重置后仍旧解体。 开始拆解问题包,将所有资源内容单个打包(一个资源对应一个包)。最初精确定位到是TMPTextPro的字体FontAsset资源包调用AssetBundle.LoadAsset()办法时解体。 剖析问题:设置DisableWriteTypeTree参数将不在AssetBundle中蕴含相干的文件TypeTree信息,是因为没有该信息后导致的反序列化不正确,为什么其它资源能失常解析,就单单FontAsset会呈现问题?关上TMP_FontAsset.cs源码,查看发现这么一段代码。 #if UNITY_EDITOR////// Persistent reference to the source font file maintained in the editor.///[SerializeField]internal Font m_SourceFontFile_EditorRef;#endif发现它竟然在可序列化类中退出了条件编译,造成导出运行和编辑器运行该类的实现不一样。 这就是为什么导出包运行正确,编辑器解体的起因。因为AssetBundle打包时的UNITY_EDITOR是不成立的,会设置对应平台的宏。所以打包时FontAsset资源的数据是不蕴含m_SourceFontFile_EditorRef该属性的序列化信息,未开启DisableWriteTypeTree时,因为有TypeTree信息,编辑下运行程序能通过TypeTree信息正确反序列化,当设置DisableWriteTypeTree时,反序列化失败,间接解体。 解决:给属性m_SourceFontFile_EditorRef增加标签[NonSerialized],再对应批改一些Editor代码,让性能在Editor下也正确。 感激题主1 9 7 3-311135@UWA问答社区提供了答复 RenderingQ:用setTargetBuffers办法将一张低分辨率RT设置给主相机。在屏幕分辨率不变的状况下,对场景相机做了降级。而后呈现了一个问题是:所有的后处理都生效了,查看后发现所有OnRenderImage办法的Source都为null(我了解为没有设置Rendertarget,默认为屏幕)。我将下面那张FrameBuffer强行代替Source传入后处理,查看FramedeBugger,后处理几个Draw Call能失常渲染,然而仍旧不能对最终成果失效,也就说没有写入到下面的FrameBuffer。 我之前的解决办法是魔改所有OnRenderImage,传入FrameBuffer代替Source,输入到另外一张FinalBuffer,最初再绑定到屏幕上,上面是测试代码。 但我的项目中后处理比拟多,且ImageBuffer仍存在后处理中,无端减少了RenderTexture的开销。 当初的解决办法是间接设置TargetTexture,但逻辑操作上会绕一层。想问下引起下面的起因,或者说有什么更好的解决办法? 环境是2019.4.3f + built-in + OpengES3.0,而后再用CommandBuffer将低分辨率适配到高分辨率。 ...

October 25, 2021 · 1 min · jiezi

关于rendering:URP管线下如何查看Overdraw

1)URP管线下如何查看Overdraw2)Lua部分函数调用回收机制3)AssetBundle如何应用二次压缩算法缩减包体4)URP的三角形面片数统计不精确 这是第262篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:Unity内置管线里自带了Overdraw模式,然而在URP外面看不到Overdraw模式,请问有什么不便的形式来实现吗? 非URP如下图: A:举荐参考这个做法:https://github.com/ina-amagam...感激Xuan@UWA问答社区提供了答复</font> LuaQ:在用插件LuaProfiler检测时发现,每次调用这个函数,其内存都会减少,不会缩小。是我测试的问题吗?还是部分函数申请的作用域不会像局部变量一样随着函数调用完结而回收? 比方这样一个函数: function MainWindow:RefreshAll()local function func()endendA:Lua应用GC形式是增量标记法,并不会间接回收内存。回收的机会和collectgarbage(“setpause”)、collectgarbage(“setstepmul”)这2个参数无关。 满足这2个参数的时候才会触发Stop the world而后进行GC,当然也能够间接运行collectgarbage(“collect”)来进行强制GC。 感激萧小俊@UWA问答社区提供了答复</font> AssetBundleQ:AssetBundle太大,缩减包体应用什么二次压缩算法比拟好?C#版7-Zip LZMA会不会冲高托管内存,请做过的大佬帮忙解答下,谢谢。 A1:二次压缩的做法并不常见,因为一个自身就是压缩文件的二次压缩,所能带来的体积放大性价比并不高。同时,还要再搭上一次解压的工夫,如果你是在C#中进行解压,很有可能会带来较高的堆内存调配,所以这种做法,绝大部分场景下都是得失相当的。该答复由UWA提供 A2:不是很举荐去做解压,工夫老本和空间老本都比拟高。倡议检查一下资源的依赖关系 ,能够用UWA的在线AssetBundle检测服务剖析一下资源有没有冗余,去掉冗余资源应该会小很多。而后图片的压缩格局肯定要选“压缩率越高”,最初图片打包AssetBundle的时候就会越小。感激萧小俊@UWA问答社区提供了答复 EditorQ:大家有没有遇到过URP下Editor外面Statistics面板的三角形统计不精确的状况? A:这个是Unity的Bug,测试了Unity 2019.4.10下的URP,Editor下的Statistics外面的统计是不对的,须要把Graphics API从Direct3D 11切换到其余的平台,如Vulkan、OpenGLCore或者DirectD12,这样统计的三角形数量是精确的,同时也在Unity 2020.3.3f1版本中做了测试,Direct3D 11平台下也能精确统计三角形面片了。感激羽飞@UWA问答社区提供了答复 20210809更多精彩问题等你答复~ 1.Vulkan与OpenGL的抉择是否会对内存大小产生影响2.Unity层通明Render over native UI3.如何实现AAB包的增量更新 封面图来源于:URP Geometry Shader ExampleURP中的几何着色器的示例。 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

August 11, 2021 · 1 min · jiezi

关于rendering:Unity如何直接获取深度缓冲

1)Unity如何间接获取深度缓冲2)Unity Editor下SpriteAtlas加载的问题3)无奈将GameObject从Project窗口拖拽到SceneView窗口4)UGUI的事件响应问题5)iOS设置Texture2D的mipMapBias有效 这是第247篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:查阅了一些材料,发现Unity获取深度纹理如同都要对每个物体再渲染一次,有什么方法能间接获取到深度缓冲省去这一轮渲染吗?或者间接复制深度缓冲。 A:能够,次要步骤如下:1.将相机的色彩和深度Buffer通过Camera.SetTargetBuffers从新指向新的RT上(ColorBufferRT、DepthBufferRT); 2.通过CommandBuffer加一个AfterForwardOpaque的事件,将ColorBufferRT、DepthBufferRT Blit渲染到两张新的RT上(前面渲染能够间接应用); 3.通过CommandBuffer加一个AfterEverything的事件,BlitColorBufferRT到CameraTarget上(保障屏幕正确)。 具体细节可参考:https://blog.csdn.net/linjf52... 感激范世青@UWA问答社区提供了答复 TextureQ:应用的版本是Unity 2018.3.6f1下,Unity Editor模式下编辑Prefab,图片会加载到内存中。导致一开始运行游戏的时候会触发相干图集SpriteAtlasManager.atlasRequested的提前调用,导致图集加载谬误。 上图是过早的图集加载,失败时检测到内存中加载的图片。有没有方法在运行游戏的时候革除编辑预制体时内存中的图片图集?或者相似的方法? 补充:在不运行游戏的状况下调用内存查看的接口,发现内存中依然有很多图片被加载: A:这个问题实质是,当援用到Atlas的Sprite加载时,如果内存中没有Atlas,就会触发加载图集的“申请”(atlasRequested)。Editor下编辑Prefab,会生成这个申请,在游戏运行的第一帧,这个申请函数会被调用,而这个申请是由Native层收回的([RequiredByNativeCode]),所以咱们没有方法管制,跟卸载内存中的资源是没有关系的。 这个申请也只会在运行时的第一帧进行调用,所以,不要在第一帧注册atlasRequested事件,在第一帧之后,或者在须要加载相应Prefab时注册该函数,就能够防止在启动游戏时调用该函数。 感激Prin@UWA问答社区提供了答复 EditorQ:最近发现Unity在关上公司的我的项目中,无奈实现Project窗口拖拽GameObject到SceneView窗口,然而新建一个洁净的工程是能够拖拽过来的。猜想是不是因为某个工具或者插件引起的,然而插件和工具太多,一一排查会比拟浪费时间,想问问大佬们有没有遇见过相似的问题?应用的Unity版本是2019.4。 失常的我的项目从Project窗口拖拽GameObject到SceneView窗口,图标是这样的: 出问题的是这样的:目前曾经正文掉内部工具或者插件的SceneView.duringSceneGui 、DragAndDrop相干代码,问题仍然存在。 A:呈现问题的起因是:咱们重写了GameObject的Editor,没有实现OnSceneDrag函数,不实现这个函数就会导致无奈将物体从ProjectWindow拖拽到SceneView。感激题主马三小伙儿@UWA问答社区提供了答复 UGUIQ:UGUI RayCast的无绘制点击在PC上没有问题,然而到安卓手机上就穿透了,没有点击响应的问题。之前用通明通道为0的Image就都没问题。 脚本如下: A:能够把Image的半透明度设置为0,勾选Canvas Renderer上的Cull Transparent Mesh,这样就能够不进行绘制也能响应点击事件的。(另外,测试了了题主的代码,在小米9上没有呈现问题。)感激Xuan@UWA问答社区提供了答复 TextureQ:应用TextureMipmapStreaming,在iOS真机上,设置Texture2D的mipMapBias有效,这个Texture是从Material中拿到的mainTexture,在Editor下反而失效(图片会变含糊和清晰)。 版本是Unity2018.4.13,有人遇到同样的问题吗?相干设置见下图: A:这个要开启Texture.streamingTextureDiscardUnusedMips = true,不然在内存估算足够的状况下,是不会抛弃高精度的贴图的。感激梅辰@UWA问答社区提供了答复 封面图起源:Multipass Translucencyhttps://lab.uwa4d.com/lab/5b5... 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

April 21, 2021 · 1 min · jiezi

关于editor:Texture-Streaming的使用疑问

1)Texture Streaming的应用疑难2)Unity 3D场景UI被打断合批的起因3)Asset Provider和Asset Bundle Provider的意义4)Addressables更新资源时只加载最初始资源5)描边算法显示问题 这是第246篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) EditorQ:Unity 2019.2 Texture Streaming在Editor下不失效吗?依照Unity官网介绍,能够在SceneView外面Debug Texture Streaming。然而实际上切换过来会变成浅蓝色/深蓝色,并没有其余任何变动。有人遇到雷同的状况吗? A:1.须要测试脚本能力晓得节俭了多少内存,场景是看不出来的。 using System;using UnityEditor;using UnityEngine;public class ShowTextureStreamingSummary : MonoBehaviour{ public float X = 10; public float Y = 20; public int MemoryBudgetPercentThreshold = 80; public int TextureStreamingPercentThreshold = 50; private ulong HighestDesiredTextureMemory; private Rect TextRect; public void Start() { HighestDesiredTextureMemory = 0; Texture.streamingTextureDiscardUnusedMips = false; QualitySettings.masterTextureLimit = 2;//强制等级为2,为了配合上面的测试脚本 } public string HumanReadableSize(ulong size) { return string.Format("{0:0.0}M", (float)size / (float)(1024 * 1024)); } void ShowText(string text) { float yInc = GUI.skin.font.lineHeight; GUI.Label(TextRect, text); TextRect.y += yInc; } public void OnGUI() { TextRect = new Rect(X, Y, Screen.width - X, Screen.height - Y); GUI.color = Color.red; if (!SystemInfo.supportsMipStreaming) ShowText("Texture streaming unsupported"); if (!QualitySettings.streamingMipmapsActive) ShowText("Texture streaming disabled"); else if (QualitySettings.streamingMipmapsMemoryBudget == 0) ShowText("No texture streaming budget"); else if (Texture.totalTextureMemory == 0) ShowText("No texture memory needed"); else { // Reduced highest memory usage if (Texture.desiredTextureMemory > HighestDesiredTextureMemory) HighestDesiredTextureMemory = Texture.desiredTextureMemory; // Show stats ulong budget = (ulong)(1024 * 1024 * QualitySettings.streamingMipmapsMemoryBudget); float percentUsed = (float)(100 * Texture.desiredTextureMemory) / (float)budget; ShowText(string.Format("Memory budget utilisation {0:0.0}% of {1} texture budget", percentUsed, HumanReadableSize(budget))); if (HighestDesiredTextureMemory > budget) { ulong memoryExcess = HighestDesiredTextureMemory - budget; ShowText(string.Format("Memory exceeds budget by {0}", HumanReadableSize(memoryExcess))); } else { ulong memorySaving = Texture.totalTextureMemory - HighestDesiredTextureMemory; float percentReduction = (float)(100 * HighestDesiredTextureMemory) / (float)Texture.totalTextureMemory; ShowText(string.Format("Memory saving at least {0} with streaming enabled ( at {1:0.0}% of original {2}) - ignoring caching", HumanReadableSize(memorySaving), percentReduction, HumanReadableSize(Texture.totalTextureMemory))); } // Advice section#if UNITY_EDITOR ShowText("Run in standalone app for accurate figures. When run in Play Mode the stats are biased by editor textures");#endif if (percentUsed < (float)MemoryBudgetPercentThreshold) ShowText(string.Format("Reduce the Memory Budget closer to {0}", HumanReadableSize(Texture.desiredTextureMemory))); else if (Texture.desiredTextureMemory > budget) ShowText(string.Format("Raise Memory Budget above {0}", HumanReadableSize(Texture.desiredTextureMemory))); float percentStreaming = (float)(100 * (Texture.totalTextureMemory - Texture.nonStreamingTextureMemory)) / (float)Texture.totalTextureMemory; if (percentStreaming < (float)TextureStreamingPercentThreshold) ShowText(string.Format("Mark more textures streaming to improve savings ({0:0.0}% texture memory marked as streaming)", percentStreaming)); if (!Texture.streamingTextureDiscardUnusedMips) ShowText("Consider turning on Texture.streamingTextureDiscardUnusedMips to analyse without cached textures"); ShowText(string.Format("desiredTextureMemory {0}", HumanReadableSize(Texture.desiredTextureMemory))); ShowText(string.Format("nonStreamingTextureMemory {0}", HumanReadableSize(Texture.nonStreamingTextureMemory))); ShowText(string.Format("totalTextureMemory {0}", HumanReadableSize(Texture.totalTextureMemory))); } }}2.Game窗口下,查看哪位纹理应用了Streaming。显示绿的是应用了Streaming;蓝色的是未开启Streaming;红色的是还没应用Streaming。 ...

April 14, 2021 · 10 min · jiezi

关于shader:Addressable资源热更新疑问

1)Addressable资源热更新疑难2)如何解决远处网格线会花的问题3)对于着色器中某些非凡图片的用处4)Lightmap在内存中有反复加载5)Unity Job System问题 这是第243篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) AddressableQ:Addressable资源热更新,提醒CRC Mismatch,将须要热更新的资源曾经上传至CDN对应目录,启动游戏时报错: A:咱们的我的项目之前也遇到了同样的问题,具体表现是打包增量后Bundle的Hash没有扭转,然而CRC扭转了,导致加载出错。 目前咱们这里有两种解决计划,仅供参考: 就是依照Unity官网说的,在Schema上禁用掉CRCCheck;然而这种形式在校验Bundle下载的完整性和正确性上可能会有些问题。热更新流程上退出Hash和CRC的双重检测,检测到其中任一值有变动就认定该Bundle须要更新,并重载最新的Catalog文件;同样这样做的问题是有可能会平白减少很多Bundle下载,即使这个Bundle的内容并无更新。感激Hybrid_8974@UWA问答社区提供了答复 TextureQ:想要实现网格线的成果,然而远处的线会花,是什么起因?这是一个正方形的Mesh,而后应用UV的缩放铺满n个小格子,图片设置成了Repeat,并且敞开了Mipmap。然而还是会呈现远处的线花了,有什么解决方案吗? A1:把Texture的Aniso Level值调高试试。 Aniso Level就是用于低角度看高空的。另外把Filter Mode设置成Trilinear,就不会呈现一段一段的成果了,就是开销比拟大。 感激Prin@UWA问答社区提供了答复 A2:按下图调整后,问题解决了:感激题主halm@UWA问答社区提供了答复 ShaderQ:如下图所示,因为资源是从其它中央下载的,没有具体阐明,想晓得这种图在TA方面来说,是用来做什么的?T_M_Body_Msa_b.png、T_M_Body_Msa_g.png和T_M_Body_Msa_Mtl.png 别离代表哪一块着色器中用到的,给个关键字提醒下,谢谢。 A:别离为b(Bump)、g(Glossness)和Mtl(Metallic)。感激jim@UWA问答社区提供了答复 RenderingQ:如下图,为什么Lightmap在Profile里会显示有反复的呢?我看每一个都是40MB,有什么方法优化吗?而且对应的援用脚本里,没有发现对Lightmap的援用。 A:看起来每张Lightmap都加载了两份。题主有没有写本人治理Lightmap的机制呢?是一次就加载两份还是在切换场景或者更换Lightmap的时候没有卸载掉?加载场景时有没有应用LoadSceneMode.Additive,导致场景累加式加载,不卸载之前的资源?Lightmap的援用数很高,看看是被哪些脚本索引住了,相应的组件是不是始终驻留。在该卸载的时候要把索引置空。 这个窗口把GameObject和Monobehaviour相互援用关系都显示进去了,不是间接的援用,的确比较复杂不好找。能够用Unity给的专门的MemoryProfiler试试,绝对分明一点。 感激Prin@UWA问答社区提供了答复 ScriptQ1:Unity 2020.2.1+Hub下载的SDK、NDK、JDK和BuildTools打包谬误。 相干谬误提醒中没有一条提到有价值的信息。 通过验证:streammingAssets文件有680(蕴含)个限度,超过就打不出包了,带不带后缀名都没关系。不分明是不是个人版的限度? A1:应该是不会的,上万文件都测试过,没问题。感激郑骁@UWA问答社区提供了答复 A2:你能够勾选Custom Gradle properties template,在文件中把unityStreamingAssets=.unity3d*STREAMING_ASSETS*改为unityStreamingAssets=.unity3d,就能够了。 如果须要非凡文件类型不压缩,自行添加,以逗号“, ”隔开。如unityStreamingAssets=.unity3d, .bundle。 U3D从2020.2.3开始批改了aaptOptions 的打包参数,aaptOptions的数组最大是255。 aaptOptions { noCompress = [’.ress’, ‘.resource’, ‘.obb’] + unityStreamingAssets.tokenize(’, ') ignoreAssetsPattern = “!.svn:!.git:!.ds_store:!.scc:.:!CVS:!thumbs.db:!picasa.ini:!*~”}*PACKAGING_OPTIONS* 感激刘冉@UWA问答社区提供了答复 Q2:求教下如果心愿streamingAssets下的都不压缩,文件又都没后缀,要怎么写呢? A:因为U3D 2020.2必须应用unityStreamingAssets变量,所以须要你把工程导出,而后批改aaptOptions,让全副文件不压缩。参考:https://developer.android.google.cn/reference/tools/gradle-api/4.1/com/android/build/api/dsl/AaptOptions 感激刘冉@UWA问答社区提供了答复 封面图起源:Unity Interactive Grass可用在Unity我的项目的可交互的草,会在进入场景时将Unity原生的草替换成本人生成的Mesh。https://lab.uwa4d.com/lab/5b590fe1d7f10a201fe10467 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

March 24, 2021 · 1 min · jiezi

关于rendering:如何定位Unity死循环导致的完全卡死

1)如何定位Unity死循环导致的齐全卡死2)如何设定Unity AssetBundle单个包大小3)MaterialPropertyBlock批改Stencil相干参数4)线性空间中动作文件管制材质球色彩失真问题5)DrawMeshInstancedIndirect在华为手机上生效 这是第240篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:运行游戏时,在某些特定的状况下,Unity会忽然卡死,看工作控制器里的Unity过程内存会继续飙升到很高的值。 因为目前游戏工程曾经很大了,并且脚本泛滥(Lua+C#),呈现这种状况时又没有异样日志,断点也断不到地位,也不晓得是哪里呈现的死循环异样了,这个问题卡了很久,没思路了,求解。 A1:经网友真木提醒了这篇文章:https://www.cnblogs.com/lijiajia/p/10817407.html通过debug.sethook这个函数来注册一个Hook的Handler,把每一行或者每个函数的调用都打印进去,就能晓得死循环的地位了。这种办法可用于找Lua的死循环,如果是C#的死循环,须要其它办法。 感激题主loy_liu@UWA问答社区提供了答复 A2:如果是C#的死循环,能够应用VS附加Unity调试,暂停整个游戏,而后切换到主线程,看看主线程以后运行到了哪一句。感激西元前的史莱姆@UWA问答社区提供了答复 AssetBundleQ:Unity AssetBundle单个包大小多少比拟适合? A1:以前LZMA格局时,是倡议小于1MB的,当初曾经没有这个束缚了。因为LoadFromFile+LZ4的加载速度曾经十分快了。所以,文件大小更倡议从热更新的角度登程,尽可能不要给热更新产生大麻烦即可。该问答由UWA提供 A2:楼上说得对,读取速度曾经不是问题,不要太小也不必太大,集体感觉1-10MB间差不多都能够,我集体是以应用的汇集性把每个包管制在几MB左右。感激徐军@UWA问答社区提供了答复 MaterialQ:我在原生的Sprite-default Shader中退出了Stencil的相干设置,在编辑器状态下用MaterialPropertyBlock批改Stencil的Comp和Ref,在Inspector面板中该值曾经被批改,然而在Frame Debugger中并未失效批改值,还是未修改前的设置,是不能用MaterialPropertyBlock改Stencil的相干参数吗? A:可参考以下信息:感激羽飞@UWA问答社区提供了答复 RenderingQ:线性空间中动作文件管制材质球色彩失真问题。以下是间接设置材质球的色彩显示: 以下是通过Animator动作文件设置材质球的色彩显示: 为什么不同呢?材质球是[HDR] Color有问题。(版本:Unity 2019.4.9f) A:在线性空间中,写入到MaterialPropertyBlock的渲染色彩参数,在渲染时会转换到Gamma空间,即变成2.2次幂。用动画批改材质的色彩,其实是向MaterialPropertyBlock中配置参数。所以在应用K材质球设计动画时,须要把色彩值的0.4545次幂写入到曲线中。 感激张首峰@UWA问答社区提供了答复 RenderingQ:Unity 2018.4.24的DrawMeshInstancedIndirect在华为手机上生效是为什么?我应用Testin的华为手机进行测试DrawMeshInstancedIndirect接口,试过的都是不行的,然而我用其余的手机就都能够。有遇到同样问题吗? A1:贴上具体日志看看,而后把华为手机的设施信息贴上,最初问下是不是带麒麟CPU的华为机。感激Robot.Huang@UWA问答社区提供了答复 A2:因为驱动程序问题,对于仅具备OpenGL ES 3.0的Adreno GPU的Android设施禁用了GPU实例反对。Graphics: GPU Instancing: Added support for Android with OpenGL ES 3.0 or newer. Note however that GPU instancing support is disabled for Android devices that have the Adreno GPU with only OpenGL ES 3.0, because of driver issues. ...

March 4, 2021 · 1 min · jiezi

关于rendering:GPU-Skinning旋转指定骨骼

1)GPU Skinning旋转指定骨骼2)对于UGUI画布重建以及动静拆散3)如何设定游戏内存的峰值来保障不闪退4)应用UsePass遇到Keyword失落的问题5)Unity Shader Built-in外面宏的定义 这是第237篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:应用GPU Skinning的物体,相似头须要面对角色,如何旋转指定骨骼呢?当初的想法是传入一个Matrix和骨骼编号,Shader里再解决,然而算进去都是0点地位。反编译了同样实现的我的项目,传入的是个骨骼地位float3和骨骼旋转float4的变量(看命名是这个意思)。 A:实现思路就是在骨骼矩阵计算时将LookAt的旋转利用到Neck Bone及其Child Bone上(若骨骼矩阵计算也是在Shader中实现的,而不是离线预计算好的,则不思考Child Bone)。不晓得题主的GPU Skinning是如何实现的,以chengkehan/GPU Skinning的开源库为例做了个简略的测试。 将小球的旋转矩阵传入Shader: 采样预计算骨骼矩阵时将旋转利用到Neck骨骼以下(boneindex > 21)所有骨骼节点计算(PS:子骨骼节点的计算是有问题的,因为矩阵没有交换律,请自行处理。) 成果如下图: 感激羽飞@UWA问答社区提供了答复 UGUIQ:对于UGUI画布重建以及动静拆散,教训证UI元素的大小地位变动并不会引起画布网格重建的问题? 看到很多UWA答复说UI元素的大小地位变动会引起重构,然而通过UGUI钻研发现并不会。UGUI引起重绘元素汇合是CanvasUpdateRegistry类中的,如下图: 通过反射将网格重绘列表打印进去之后发现地位、大小和旋转都不会进入重建列表,而Anchors、Pivot还有组件的Color和宽高扭转才会引起网格重构,请问怎么回事? A1:能够看看OnRectTransformDimensionsChange函数、VertexHelper类的代码、地位和Rect大小等,这些的扭转都会SetDirty的。VertexHelper里的几个List,其实是对应的材质属性和顶点地位属性;按理说这些扭转都是会Setdirty的,然而从RectTransform的一些属性来看,Unity可能只在Pivot、SizeDelta、AnchorMin和AnchorMax这四个属性更改时才会Setdirty。 感激李星@UWA问答社区提供了答复 A2:能够依照李星的说法做个验证,写一个MyImage继承自Image,而后Override外面的OnRectTransformDimensionsChange,如下图: 在场景中应用MyImage,就能够验证更改Anchor的地位或者Rect的宽高会触发OnRectTransformDimensionsChange(这个音讯是从Native层发回来的),触发这个是会触发SetVerticesDirty的。批改Position和Scale这些是不会触发SetVerticesDirty的,批改色彩是会触发SetMaterialDirty。这两种SetDirty都会将对应的元素退出到GraphicRebuildQueue外面,最终的耗时都会统计到Canvas.SendWillRenderCanvases外面。这部分的“重构”并不是指网格重构,这个“重构”能够了解为UI元素自身的更新。 另外一种网格重构,是指UI变动导致了Canvas重建,就是会在Native层进行网格拼合,也就是会触发调用Canvas.BuildBatch。能够参考:https://answer.uwa4d.com/question/59af579c6a071c595e8994b2#59af5d466a071c595e8994b4 感激Xuan@UWA问答社区提供了答复 A3:网格重建(Canvas.BuildBatch)是在Native层做的,用Rider看不到外面内容。批改Position会触发重建,是Unity官网文档里明确写进去的。这是我之前对各种文章做的一些总结《UGUI优化 - 知识点》,能够参考:https://www.jianshu.com/p/5c44eb589751 感激Walker@UWA问答社区提供了答复 MemoryQ:不同内存的安卓与苹果机型上(1G、2G、3G、4G…),游戏内存的峰值个别最高多少能保障不闪退? A1:这里有人会继续更新iOS上的内存峰值,帖子上面还有人发了一个测试峰值的工具:https://stackoverflow.com/questions/5887248/ios-app-maximum-memory-budget感激dra@UWA问答社区提供了答复 A2:做一个搬运工,感激Jasper的测试数据提供,我将其放到这里,不便大家间接查看:device: (crash amount/total amount/percentage of total)iPad1: 127MB/256MB/49%iPad2: 275MB/512MB/53%iPad3: 645MB/1024MB/62%iPad4: 585MB/1024MB/57% (iOS 8.1)iPad Mini 1st Generation: 297MB/512MB/58%iPad Mini retina: 696MB/1024MB/68% (iOS 7.1)iPad Air: 697MB/1024MB/68%iPad Air 2: 1383MB/2048MB/68% (iOS 10.2.1)iPad Pro 9.7": 1395MB/1971MB/71% (iOS 10.0.2 (14A456))iPad Pro 10.5”: 3057/4000/76% (iOS 11 beta4)iPad Pro 12.9” (2015): 3058/3999/76% (iOS 11.2.1)iPad Pro 12.9” (2017): 3057/3974/77% (iOS 11 beta4)iPad Pro 11.0” (2018): 2858/3769/76% (iOS 12.1)iPad Pro 12.9” (2018, 1TB): 4598/5650/81% (iOS 12.1)iPad 10.2: 1844/2998/62% (iOS 13.2.3)iPod touch 4th gen: 130MB/256MB/51% (iOS 6.1.1)iPod touch 5th gen: 286MB/512MB/56% (iOS 7.0)iPhone4: 325MB/512MB/63%iPhone4s: 286MB/512MB/56%iPhone5: 645MB/1024MB/62%iPhone5s: 646MB/1024MB/63%iPhone6: 645MB/1024MB/62% (iOS 8.x)iPhone6+: 645MB/1024MB/62% (iOS 8.x)iPhone6s: 1396MB/2048MB/68% (iOS 9.2)iPhone6s+: 1392MB/2048MB/68% (iOS 10.2.1)iPhoneSE: 1395MB/2048MB/69% (iOS 9.3)iPhone7: 1395/2048MB/68% (iOS 10.2)iPhone7+: 2040MB/3072MB/66% (iOS 10.2.1)iPhone8: 1364/1990MB/70% (iOS 12.1)iPhone X: 1392/2785/50% (iOS 11.2.1)iPhone XS: 2040/3754/54% (iOS 12.1)iPhone XS Max: 2039/3735/55% (iOS 12.1)iPhone XR: 1792/2813/63% (iOS 12.1)iPhone 11: 2068/3844/54% (iOS 13.1.3)iPhone 11 Pro Max: 2067/3740/55% (iOS 13.2.3) ...

February 7, 2021 · 2 min · jiezi

关于rendering:URP下与Builtin的Light-Color不一致

1)URP下与Built-in的Light Color不统一2)开启MSAA的RenderTarget会对没开启MSAA的RenderTarget造成影响3)角色Mesh合并的长处与毛病4)NGUI渲染层级的原理5)Unity上App图标装置到设施上图标含糊,设置上的留神点 这是第234篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:发现Light的Intensity在不为1的状况下,光照的色彩在URP下滑Built-in管线下不统一。附件里有2个工程,应用Unity 2019.4.11f1,别离是URP和Built-in管线的(都是线性空间)。(附件可戳原问答下载) 再现办法:1. 关上2边工程的Scene1,这个场景的方向光Intensity值设置为1。察看2个工程里球的光照色彩,是统一的,通过FrameDebugger也能够确认这一点。 2. 关上2边工程的Scene2,这个场景的方向光Intensity值设置为0.65。察看2个工程里球的光照色彩,Built-in管线的更暗,通过FrameDebugger也能够看到Built-in管线的工程光照色彩数值小一点。 URP色彩: Built-in色彩: URP FrameDebugger: Built-in FrameDebugger: A:用楼主Demo外面的Light的色彩做了一下计算,在Light设置项外面,Light Color为(0,202,255),202.0/255 = 0.792。SRP:Green通道:Mathf.GammaToLinearSpace(0.792) 0.65=0.5906189 0.65= 0.383902285 Blue通道:Mathf.GammaToLinearSpace(1) 0.65=1 0.65=0.65 Built-in:Green通道:Mathf.GammaToLinearSpace(0.792*0.65)=0.2280943 Blue通道:Mathf.GammaToLinearSpace(0.65)=0.3800563 应该是上面两段数值的计算区别:GammaToLinearSpace(m_ColorFilter * m_Intensity);GammaToLinearSpace(m_ColorFilter) * m_Intensity; 查问发现是因为GraphicsSettings.lightsUseLinearIntensity这个数值不一样导致的。在SRP外面这个数值是True,在Built-in外面是False。 感激Xuan@UWA问答社区提供了答复 RenderingQ:在同一帧中,我有用于渲染的RenderTarget开启了MSAA,和用于热扭曲成果的扭曲Buff,是一张没有开启MSAA的RenderTarget,在后处理中这张扭曲Buff会用来偏移UV,以实现扭曲成果。在PC上和iOS上一切正常,然而在Android真机上出现异常。在高通GPU上,这张扭曲Buff会导致屏幕呈现网格状的景象,在Mali GPU上会呈现各种细碎的小黑方块,应该是一个未知起因导致扭曲Buff上的数据被解决成我不冀望的状态。 如果我把其余的RenderTarget的MSAA敞开,这种景象就会隐没,也就说开启MSAA的RenderTarget会对没开启MSAA的RenderTarget造成影响,且仅仅是在Android真机上呈现,不同的GPU体现还不一样。有遇到相似问题的吗?求解。 A:该问题曾经解决了。我所遇到的问题的最终状况,不是开启MSAA的RenderTarget会对没开启MSAA的RenderTarget造成影响。在开启MSAA后,主相机的RenderTexture(MSAA)绑定到Shader上,会有相似如下操作: texture(_Main_Tex, UV + Offset) 不晓得是Unity的Bug还是其余起因,导致在Android真机上,绑定到Shader上的RenderTexture肯定不是通过无效ResolveAA的版本,所以在如上操作的时候就出现异常体现,相似细碎方块或者网格等等景象,如果Offset是0,不会有异样体现,这些应该和Mobile GPU上的TBR有关系。 那么我须要在Android真机上传入一张通过无效ResolveAA的RenderTexture即可。通过验证,应用如下形式能够解决: RenderTexture.Blit(Rt_msaa, Rt_no_msaa); 这样我就失去一张通过无效ResolveAA的Rt。 感激题主yangkang@UWA问答社区提供了答复 RenderingQ:为了让身材各部件合并,所有部件都要开启Readable/Writable属性,合并也创立新的Mesh来合并,多个部件合并成一个Mesh有什么益处吗? 游戏类型是MMOARPG,比方能够换头发、脸、衣服等,资源量很大,如果不合并,走挂点的形式与合并成一个Mesh会怎么样呢? A:第一个问题的益处应该就是不便合批,害处除了你说的几点,还有贴图的合并,这些点都会造成内存的额定开销。是否利用还是应该看具体的我的项目类型。第二个问题其实就是内存换Draw Call,看你们我的项目这两块哪一部分是瓶颈了。另外还须要留神材质,如果各部位材质差异很大也是无奈合批的。 感激范君@UWA问答社区提供了答复 NGUIQ:Unity Shader判断层级关系的唯一标准是否是深度测试?我看NGUI的Shader并没有ZTest配置并且敞开了深度写入,那应该是依据渲染的先后顺序来管制层级?也就是说sortOrder sortLayerName renderQ camera depth都只是Unity在管制不同组件进入渲染流水线的程序吗? A:深度测试在传统的渲染管线里,是产生在Fragment Shader之后(不思考Early Z等优化技术),用来剔除那些被遮挡的像素。自身和Draw Call提交的程序没有关系。Unity引擎中,有很多参数能决定渲染程序,也就是Draw Call提交程序。 首先最高优先级的是Camera,引擎中的渲染是由Camera发动的,在Built-in管线中,次要依附Camera的Depth来决定哪个Camera看到的物体先渲染。最常见的构造,比方Depth=0的相机画场景,另一个Depth=1的相机画UI。然而,当初URP里的相机的Camera Stack也是相似的构造,用来管制Camera的渲染先后顺序。 ...

February 4, 2021 · 1 min · jiezi

关于rendering:Blender教程在Blender中制作森系少女上

你好!我是来自孟加拉国的Omar Faruq Tawsif,是机械工程系的一名本科生。 我小时候在Google上搜寻收费绘画软件时偶尔发现Blender。惋惜!一个星期后我放弃了。大概2-3年前,我再次持续了Blender的旅程。我在YouTube和在线文档上花了很多工夫来学习Blender中的3D办法。因为我在业余时间做业余爱好,因而没有进行任何正式培训。诸如Blender Guru,YansSculpts,CG Geek,FlyCat之类的YouTuber博主足以帮忙我把握基础知识。通过浏览Blender手册以及解决每个我的项目中呈现的问题,我也学到了很多货色。 灵感我喜爱在Pinterest,ArtStation和其余一些无关角色概念艺术的网站上到处逛逛,以找到乏味且简略的艺术品。这次,我被平野美穗的作品所吸引。我特地喜爱她与大自然纠缠在一起的形式。我的指标不是用3D重建她的作品。实际上,我的作品经常与原始概念艺术相去甚远。我只尝试重建他们的情绪。例如,我的角色比平野的年老得多。 参考对于任何我的项目,我的第一步都是在PureRef中创立参考图集,PureRef是Blender之外的我的另一个好搭档。 模型这是我有史以来最快的我的项目。因为我的指标是疾速实现工作,因而我没有进行深刻的建模。我迅速屏蔽了总体形态,并以最小的模式雕刻了面部特色。我尝试给它一个风格化的外观,只管自从我最终对它进行某种程度的理论纹理化解决后,它仿佛变得不太显著。 我划分了工作区以确保雕刻朝正确的方向进行。 只管我在最终渲染中简直没有应用雕刻过的头发,但我还是更喜爱编写带有雕刻过的头发的版本,因为它能够帮忙我更好地形象化最终目标。 对于衣服,我做了一些简略的网格建模。 而后,我应用多分辨率修改器在衣服上增加了更多细节,例如折痕。我感觉这种办法很不便,因为它使我的烘焙过程更轻松。我应用以前我的项目中的眼睛省了很多事。另外,我尝试用相似于肉质区域的货色(称为“ unc”)填充眼角。 而后,我应用Danny Mac的3D作品中的指南从新拓扑了头部。顺便说一句,我真的很喜爱它整洁的工作流程。我在retopo设置中应用了贴紧脸部和膨胀包装修改器的性能。另外,我在雕刻模式下不断调整了面部,同时启用了叠加中的线框。 在这里,我用Ivy Gen制作植被。我在编辑模式下平滑了束,而后将叶子和花朵的图像作为立体导入,而后应用粒子系统搁置它们。我须要对其进行一些调整,以便它们在粒子系统中呈现并正确定向。蝴蝶是用相似的办法制成的。

January 29, 2021 · 1 min · jiezi

关于rendering:如何更快地渲染深入了解3D渲染性能的指南6

内部因素:优化场景之外的所有内容优化外部设置和3D场景的复杂性只是方程式的一部分。 有时,您的场景曾经进行了充沛的优化,或者您根本无法对场景进行任何更改,因为您只负责渲染,也能够不冒险对场景进行深刻的更改而没有进行任何更改被批准。 您能够做很多事件来放慢渲染速度,这些事件能够在3D场景之外进行管制,只管有时以下选项的确须要在场景中进行一些小筹备,而后能力施展其全副后劲: 渲染通道和合成让咱们从渲染通道开始。咱们都在某种程度上应用了它们,咱们在本文的AOV局部中很快介绍了它们,因为它们的确有时会升高性能。 然而,通常,应用renderpass能够节俭更多工夫(如果应用正确)。 渲染通道不仅仅用于输入一些额定的图像信息,例如深度或对象或拼图遮罩。 正确应用时,能够将它们与comp组合应用。 Render Engine的Beauty Pass是默认输入的规范最终RGBA图像,它是外部由多个Renderpass组成的图像,例如Diffuse Pass,GI Pass,Light Pass,Shadow Pass,AO Pass,反射,折射…… 能够将这些通行证相加或相乘,以重制最终的通行证。 您可能曾经猜到了:将其与一些Puzzle或Crypto-Mattes联合应用能够抉择您的单个对象,并且您领有一个十分弱小的工具来更改comp的场景,而无需在其中从新渲染另一帧。您拍摄的3D软件。 这是一个示例:您实现了以4k,60FPS的速度对一辆商用汽车进行最终渲染,该卡车具备丑陋的红色皮卡车。您花了几天工夫能力实现此工作,但当初客户要求卡车为蓝色。 首先想到的是:“太好了,再从新渲染整个商业广告还有5天”。 然而,因为咱们都晓得客户和老板始终在扭转什么,因而咱们能够预见到这一点,并应用从头开始构建美容通道所需的所有AOV来渲染整个广告。 当初您须要做的就是在漫反射中增加色相更改,而后实现。无需从新渲染!(当然,除了弥补) 合成(在前期修复!)是如此弱小的工具,可能性是有限的。任何物有所值的3D艺术家都能够至多进行一些合成。 这使咱们进入下一部分: 贴图过程中的噪点是的,即便在3D渲染引擎中,也存在应用去噪器的办法。有些具备内置的插件,例如Altus De-noise或OptiX De-noise技术,然而我不倡议将其用于生产或最终渲染。 相同,请在您最喜爱的合成应用程序中应用渲染过程和去噪插件。 大多数时候,您的很多通行证都很好,简直没有噪点。例如,您的弥散通行证通常干净利落。GI或Shadow Pass尽管会很吵。 因而,咱们要做的就是在帖子中应用降噪插件对这两个通道进行降噪(例如AE中的Neat Video De-noiser)。 如果您没有工夫设置渲染通道或心愿缩小现有渲染通道的噪点,通常还能够对美容通道利用去噪。 它能够很好地工作,但通常会使某些区域的纹理变得凌乱,因为消噪器实际上不晓得什么是噪点,什么是纹理细节,而无需查看其余通道。 前期降噪通常能够使您更快地设置3D渲染,因为您能够将噪点阈值设置得更高。 晓得何时在3D中做某事以及何时在邮政中做某事是咱们所有人都必须学习的技能——去噪是在贴图中卓有成效的一件事。 充分利用帖图/合成很多时候,您能够在合成过程中做一些事件,而这须要很长时间能力在3D场景中进行设置,并且晓得什么时候这是更无效的办法,这是优良3D艺术家的标记。 尤其是当您实现对帧的最终渲染后再进行更改时,增加补丁或进行一些遮罩工作以解决较小的问题能够节俭大量工夫,而这些工夫本能够用于从新渲染整个镜头。 一些示例:如果您看到小的渲染故障,例如在框架上进行景深抵触的对象,地板上的腐蚀性故障,甚至只是色彩谬误的对象,那么大多数时候您都能够遮罩并打补丁没有任何人留神到。 当然,最好是没有谬误的洁净渲染,然而咱们都能够疏忽一些小的事件,这些事件在最终渲染实现后会引起留神。 晓得在合成渲染序列中能够做什么,即便在高调工作上,也能够让您释怀。 在After Effects中学习一些遮罩、旋转笼罩和跟踪,以解决较小的渲染问题。 当然,您能够在comp上做更多的事件,而不仅仅是修复在渲染阶段弄乱的货色。 应用适当的渲染层、对象遮罩、深度遮罩、甚至法线贴图和UV遮罩,您能够在前期进行很多操作,从而节俭通常在渲染上破费的工夫。 利用3D摄像机从3d场景中导出的图像来设置动态背景或前景图层,从而节俭了渲染基本不扭转的背景和前景的工夫。 即便在实现渲染后,也能够应用Motion Blur插件、景深插件以及其余合成工具来更好地管制镜头的外观,而无需将这些成果永恒烘焙到渲染的图像中。 应用Rendermanager对于任何庄重的3D艺术家或Creative-Agency而言,应用渲染管理器都是合乎逻辑的步骤,因为它带来了很多益处。 其中的一些益处包含能够更好地管制要渲染的作业,而不用仅进行3D渲染作业。 大多数古代的Rendermanager,例如Thinkbox Deadline(最多2个节点都是收费的,因而请对其进行测试驱动),反对运行各种作业,从通过视频渲染的3D渲染,粒子缓存,文件转换,图像处理到批量解决。 Rendermanager能够缩小您通常用于设置和查看渲染的工夫,并且借助渲染自动化,您甚至能够设置渲染管道的整个过程。 一个简略的例子:您必须渲染一些3D场景,之后,您在合成中刷新这些3D场景并制作图像序列进行编辑。在“编辑”中,您能够刷新这些图像序列并为老板或客户渲染预览。 好吧,借助Rendermanager,您能够自动化整个过程。只需创立一个3D场景渲染实现后主动启动的comp作业即可。创立一个Editing作业,一旦这些comp-jobs实现,它将从新渲染预览。 当您早上回来时,整个事件都将在您开始工作之前实现。 然而,Rendermanagers还有另一件事可用于:进步渲染性能。 您会看到,渲染引擎的工作原理都十分类似。按下“渲染”按钮后,渲染过程通常包含三个阶段: 1、筹备要渲染的场景,以便渲染引擎能够最佳利用它2、渲染场景(以存储桶或渐进模式) 3、将实现的渲染器和AOV保留到存储 通常,第二阶段(理论的渲染阶段)占用最多的工夫。在进行最终渲染并试图取得须要大量样本的无噪点图像时,尤其如此。 理论渲染阶段的益处在于,它非常容易并行化,这意味着渲染引擎能够充分利用您的所有资源,CPU内核或GPU内核来运行此阶段。 在第一阶段,尽管,在筹备阶段,无奈充分利用你的硬件,因为它是十分依赖于你的CPU的单核性能,最在这个阶段的计算只能在运行单核(或极少数外围)。 这意味着您的PC的其余性能只是静静地期待着,直到该阶段实现为止,而后它能力逐步发挥作用并充分利用其资源的全副后劲。 这是在V-Ray CPU渲染器上渲染中等简单的3D场景时CPU利用率的屏幕截图: ...

January 28, 2021 · 1 min · jiezi

关于rendering:如何更快地渲染深入了解3D渲染性能的指南5

上文《如何更快地渲染?深刻理解3D渲染性能的指南!(4)》咱们介绍了从场景外部灯光、用料、反射、材质等方面的优化,晋升场景渲染的速度。本文Renderbus云渲染农场将持续从渲染设置、全局照明、渲染区域等方面介绍如何晋升渲染速度。 渲染设置调整渲染设置是放慢渲染速度的最无效办法之一。 然而,与平常一样,咱们不仅要升高品质,还心愿尽可能地靠近所需的品质,但依然心愿进步渲染性能。 以下是一些能够改善渲染性能的最重要因素: 自适应采样器对于大多数古代渲染引擎而言,最重要的一件事件就是将它们设置为应用自适应采样器。 要害是:古代渲染引擎极其简单,并具备确定本身的办法,确定高质量渲染所需的样本数量。 您首先要看的设置是自适应采样器的采样限度。每个引擎在此局部的名称略有不同,然而在Redshift中是这样的: 和Vray: 跨不同渲染引擎的所有这些自适应采样器都具备以下共同点: 最小样本最大样本数(噪声/谬误)阈值它的工作原理很简略:“采样器”会通过每个像素拍摄起码数量的样本,以便对像素具备的色彩进行均匀察看。 而后,将其与旁边的像素进行比拟,并查看差别(例如,照明)是否太大/太吵。如果差别/噪声/误差大于阈值,则它将通过场景拍摄更多样本,直到其降落到误差阈值以下(为不便起见而简化)。 就那么简略。 因而,即便将“最大采样数”设置为10000,采样器也只会应用其须要降至误差阈值以下的数量。 因而,从技术上讲,您须要在此处进行预览渲染的所有更改就是将阈值减少到0.1,而后将最终渲染减少到0.01。 与平常一样,您将必须进行一些测试,以找到最现实的地位以及您违心忍耐的噪声量。 自适应采样器的性能可确保它仅应用革除图像所需的采样数量。这意味着在光线短缺的区域,它仅应用大量样本,例如,在光线较暗的区域,它能够应用更多的样本来打消噪声。 确保应用自适应采样器的性能永远不会应用超出相对须要数量的样本。 极限射线反弹(跟踪深度)和截止阈值在“材质”局部,咱们曾经理解了如何在反射和折射中限度描迹深度,然而在大多数渲染引擎中,您能够全局设置此深度。 这是Redshift的样子: 这背地的想法很简略:咱们心愿阻止特定的光线反射太屡次。通常,咱们能够为反射,折射和透明度设置反弹限度。 设置的值越低,容许的反弹越少,场景渲染的速度就越快。这是放慢渲染速度的次要因素之一。 然而,当然,如果将此值设置得太低,则会看到一些黑洞或货色从反射,折射和通明区域隐没。 对您的每个场景进行一些试验以找到最佳地位。 在下面的图像中,在最大走线深度以下,咱们看到了截止阈值,这也能够放慢渲染速度。 基本上,这是通知渲染器仅思考会在全局场景级别上使像素外观变动超过定义阈值的光线。 设置得越高,将越早疏忽或勾销光线,从而放慢渲染速度。 当然,这里也实用:如果将这些值设置得太高,您将开始在着色器和照明中看到彩色像素或毛糙边缘,因而也能够在此处找到最佳地位。 钳制您的最大射线强度应用此性能不仅能够放慢渲染速度,而且通常还能够打消整个场景中的随机高光像素。 在Redshift(C4D)中: 在Vray(C4D)中: 默认状况下,大多数渲染引擎将容许射线和样本比监视器通常显示的亮度高很多。毕竟,通常光源通常是十分亮堂的,这是有情理的。 然而,在大多数状况下,您不会看到强度为2或10的反射光之间没有区别。这两种反射光看起来都是100%红色(或100%亮度)。 当然,如果您产生的反射或折射会排汇90%的入射光,您会看到不同。 然而,在大多数状况下,将射线强度限度为靠近1会进步渲染性能,清理随机的亮堂像素,而不会太大地扭转场景的外观。 去尝试一下,找到你的最佳抉择。 视场任意输入变量,Multi-Pass图像,Render Pass或它们带有的其余名称是与Beauty Render一起创立的图像,通常用于合成和其余后期制作形式。 我很长一段时间都不晓得这一点,然而,是的,AOV减慢了理论的渲染阶段。 我的印象是,在渲染过程完结时,AOV仅须要很短的工夫存储在我的美容通行证旁边。然而,它们会减慢整个渲染速度。 当然,只有几个渲染通道不会引起留神,然而有10个或更多的拼图遮罩、深度遮罩、对象缓冲区?在许多渲染引擎中,能够将增加到最终渲染中的每个AOV的渲染工夫显着减少。 确保确保仅出现您相对须要的AOV。 全局照明设置有很多技巧能够使您的GI更快地出现且无闪烁,但这是齐全离开的文章的内容。 让咱们看一下简直所有渲染引擎中能够应用的一些货色,如果正确应用它们很可能会显着影响渲染性能: 首先,仅当要渲染动画并且看到帧之间有很多闪动时才应用蛮力/QMC GI。暴力破解GI是应用GI的最慢办法。 没错,它简直每次都像吊饰一样工作,然而渲染须要大量工夫。 许多不太简单或细节很小的场景都能够通过“光缓存”或“光子贴图”来解决,这通常渲染起来要快得多。 特地是如果您仅渲染静止图像,其中一些渺小的帧差别不重要,则在第二个甚至第一个GI Bounce上应用光缓存能够节俭生命。 通常,您能够并且应该限度您的GI反弹。将您的GI反弹设置为1、2、3或更高,进行几次测试渲染,看看差别是否的确显著或须要。跳动越小,渲染速度就越快。 某些场景甚至可能基本没有天文标记。我对于每个新场景都只关上GI,这是我的习惯,然而很多时候您不须要它。 以室外场景为例。带有天空纹理和日光的圆顶灯的渲染速度可能比试图通过天空GI反弹来遮挡暗影的速度要快得多,并且在大多数状况下看起来十分类似。 如果应用光缓存能够很好地渲染整个场景,然而角色的头发只是弄乱了所有,并在整个帧中引发了闪动,只需渲染两次即可。 将角色暗影设置为应用光缓存来渲染背景场景,并仅将角色设置为应用蛮力GI渲染另一遍。 咱们都晓得如何在前期进行合并。不要试图一遍又一遍地做所有事件。 更简略:某些渲染引擎可让您通常通过渲染标签/合成标签设置每个对象的GI办法。 通常,您显然能够应用较低的GI品质设置(例如较低的GI样本)更快地渲染,并且将其与comp中的降噪联合应用是一个弱小的工具。然而在“前期降噪”局部中有更多介绍。 渲染可见性并蕴含/排除场景和对象关系默认状况下,光线只会在整个场景中反弹,而不论它们通过多远,或者该光线对于图像的整体外观是否重要。 某些光线,物体,资料或灯光可能只是在吞噬您的表演而没有做很多其余事件。 某些对象可能很重要,要用相机看清,然而您无奈真正在所有这些含糊的反射中看到它们,因而只需敞开该对象对反射射线的可见性即可。就那么简略。 ...

January 28, 2021 · 1 min · jiezi

关于rendering:如何更快地渲染深入了解3D渲染性能的指南4

上文《如何更快地渲染?深刻理解3D渲染性能的指南!(3)》中,咱们介绍了如何疾速渲染中对场景中多边形数量的优化,从而减速场景的渲染速度。本文Renderbus云渲染农场将持续带您从场景外部灯光、用料、反射、材质等方面的优化,晋升场景渲染的速度。 灯光每个发光器,无论是发光材质的物体还是理论的发光物体,都会向场景增加更多必须在渲染时进行追踪的光线。 尤其是在您可能会在大多数场景中应用的“全局照明”中,每种光线都会产生在场景四周反弹几次的光线–而这些光线中的每一种都必须由GPU或CPU计算。 当初,这是货色: 在某些状况下,增加光源能够放慢渲染速度:如果您应用的是GI,并且图像中有很多暗区域,而这些区域都不容易直射光线,那么增加另一个(十分暗)的光能够使这些区域变亮。疾速革除那些嘈杂的像素。 增加灯光以便间接照亮您的主体,能够使渲染速度十分快。只有在必须几次左右反射能力达到目标时,或者如果它们自身具备更简单的性质时,灯光才会真正变慢。 例如,区域光在计算上是低廉的,因为光线跟踪器必须采样很多光线能力笼罩区域光的整个区域,所以还要确保生成的暗影很柔和。 与点光源相比,面光源是次要的减速器——尤其是大面积照明时。 尽可能尝试应用门禁灯,尤其是在照亮通过窗户照亮的室内场景时。门户照明比区域照明更高效,并且渲染速度更快。 尽可能应用聚光灯和非光线跟踪的暗影贴图,柔和暗影。应用这些能够更快地计算出软暗影,并且能够在不扭转场景外观的状况下极大地放慢渲染工夫。 应用HDRI或天体在室外照明中渲染场景,因为您从一个残缺(或一半)的圆顶取得平均的照明,因而Sun的速度通常十分快,这意味着您的光线不用为了反射所有而进行大量反射。 如果您的3D软件和渲染引擎具备限度灯光反弹和灯光范畴的性能,请这样做。让您的场景主体受到十分远的光线的影响,或者被其余光线阻挡/很难达到的光线是没有意义的。 必须屡次反射能力达到场景主体的光线所收回的光线,或者曾经衰减到简直不可见的光线可能会在渲染中引入大量噪点。 有时,您能够只应用“渲染”或“我的项目标签”来限度灯光应照亮的程度以革除乐音,来排除任何不必要的内容。 用料有很多“材质特色”能够减慢渲染速度,毕竟,“材质”形成了场景的整个“外表”区域。 照明能够与场景材质进行交互的三种根本形式。光能够是: 反射(例如镀铬)折射(例如玻璃)局部被排汇,扩散和反射(例如皮肤)还记得咱们所说的放弃场景中尽可能少的光线和光线反弹以更快地渲染吗?资料是成倍增加必须计算的射线数量的次要因素。 任何Material属性会减少场景中的光线数量或须要革除许多样本,这会使渲染速度变慢。 让咱们看一些次要的罪魁祸首: 光面反射和折射让光线从铬球反射(硬反射)是您在3D中最简略的操作。 这是一个带有硬反射的Chrome Ball并排显示,并且须要调配样本来革除图像中的噪点(红色=更多样本,光明=更少样本): 拿这个镀铬的球并使反射变柔和(有光泽),您将创立大量必须计算的新射线。当初,依据反射的柔和度,入射光线会在各个方向上平均散射。 渲染引擎必须计算的采样和光线越多,实现渲染所需的工夫就越长。 这同样实用于光泽折射。润滑的反射和润滑的折射的联合将进一步减少渲染工夫。 当初,我并不是说不要应用润滑的折射或反射-它们是大多数资料的组成部分,然而当您应用它们时,请确保尽可能优化它们。 以下是优化折射和反射的办法: 限度其射线反弹(跟踪深度)应用截止阈值进行优化当您的反射或折射是润滑的(含糊的)时,您实际上无奈在反射或折射中分别出细节,咱们能够利用它来施展咱们的劣势。 因为材质中的反射/折射场景十分含糊,因而咱们无奈判断反射/折射场景是否100%精确,这意味着咱们能够升高折射/反射场景的复杂性,而无需任何人留神。 通过限度走线深度,咱们通知特定的光泽资料仅反射或折射其余对象,而不反射那些对象本人的反射或折射(达到肯定数量的深度/反射)。 这意味着咱们能够节俭很多射线,因为咱们人为地限度了跟踪深度。咱们能够在大多数渲染引擎中执行此操作,或者间接在材质设置中执行此操作,或者有时您须要将渲染标签利用于某些对象能力应用此性能。 这是Redshift渲染引擎中的外观: 咱们在上图中看到的另一个优化是“截止阈值”-基本上,这是通知渲染器仅思考会扭转像素外观的光线,而不是定义的阈值。 看起来合乎逻辑,不是吗? 它仅应在对渲染产生显著影响的货色上应用计算资源。 问题是,默认状况下,这些阈值是如此之低,以至于它们基本不会影响您的渲染工夫。您必须减少阈值能力充分利用它。试一试,看看有什么区别。应用这些能够放慢光泽反射和折射。 当然,您也能够在硬反射或折射上应用它们,然而因为在硬反射中所有都十分清晰,因而您可能会留神到截止点产生得更快。 材质凹凸/法线贴图/位移贴图还记得光泽反射如何减少资料产生的射线数量以及革除噪声所需的样本数量吗? 在这方面,应用凹凸贴图,法线贴图或位移贴图十分类似。因为这些贴图试图伪造网格细节,因而入射光线也被它们散射。 细节越精密,产生的光线越多。即便您的网格只有几个多边形(即一个多维数据集),如果您在其顶部有一个简单的凹凸贴图,该凹凸贴图会将光线散射到整个地位,则渲染速度将大大降低。 材质纹理/位图如果不应用一些杰出的位图/纹理,简直无奈创立3D场景。它们会为您的网格物体增加细节,以至于大多数状况下要进行建模会破费太多工夫。 确保您的纹理分辨率不会适度应用它。在整个场景中领有一堆8k纹理,即便2k或1k纹理就足够了(思考到对象的屏幕尺寸),渲染引擎也很难在整个场景中工作。 未完待续...

January 28, 2021 · 1 min · jiezi

关于rendering:用于视频编辑和渲染的最佳GPU是什么

购买新的图形卡(GPU)可能很艰难,尤其是如果波及您所不相熟的所有技术问题。 显卡市场上的大多数消费者只须要理解显卡在本人喜爱的游戏中的性能,并确定购买决定即可。然而,如果您想购买GPU进行视频编辑或3D渲染,则查找相干信息要艰难得多。 特地是对于3D渲染,如果您尽可能快地进行渲染,则会节俭大量工夫和金钱。 怎么辨别渲染GPU与编辑GPU?尤其是如果您不相熟图形技术,那么您就有很多问题须要答复。 咱们将在这里假如根本相熟水平,即,您晓得GPU代表图形处理单元 ,而图形卡是蕴含一个或多个GPU的扩展卡。 图像起源:Nvidia 有什么不同?业余GPU与消费者GPU现在,消费者GPU和业余GPU看起来比以往任何时候都更类似。 一些GPU甚至略微含糊了界线,例如AMD的Radeon VII或Nvidia的Titan系列。 毕竟,这些卡具备超高的价格标签和空幻的VRAM数量。 明天,让咱们看一下Nvidia RTX GPU。面向消费者的GeForce RTX卡与面向业余的Quadro RTX卡之间有什么区别? 图片起源:PNY 它们都应用雷同的硬件体系结构,有时甚至能够指定为解决内核和VRAM,然而Quadro的价格要高出好几倍……这仅仅是骗局吗? 让咱们来看看: 业余GPU消费类GPU与业余GPU之间的最大区别在于软件。 Nvidia的Quadro卡和AMD的FirePro卡通过优化,专门针对高端生产力应用程序,与业界当先的应用程序具备极其彻底的兼容性。 此外,它们失去了多年的反对,并且被视为长期投资,而消费类图形卡则不被视为长期投资。 Pro GPU已通过行业应用程序进行了测试,并且对驱动程序进行了优化,以使其施展最佳性能。许多高级行业应用程序(例如风行的CAD应用程序Solidworks)具备非凡性能(例如Solidworks中的RealView),只有在领有业余GPU的状况下才受反对。 例如,下图显示了Solidworks官网反对的Nvidia GPU: 图像起源:Solidworks 如果您应用的是业余GPU,则某些软件供应商仅反对您,并提供售后保护。 对于大型公司而言,这是至关重要的,在大型公司中,服务器或工作站的失常运行工夫对于放弃其低廉的员工始终在功能性PC上工作至关重要。 这的确是有情理的。有足够资金的公司购买Quadro GPU。软件开发人员以足够的资金反对公司。这些公司通常还领有专门的IT人员,具备足够的专业知识。 怎么让麻烦更少,更无效: 1、Solidworks反对人员与公司的IT专家交谈,而后能够解决公司所有PC上的某些Solidworks故障 2、许多Solidworks反对人员与数百名不理解PC / Tech / IT的个人用户交谈 购买Pro-GPU时,您购买的是Pro-Support。(除了一些硬件性能) 消费类GPU消费类GPU将非常适合游戏和消费类应用程序。 它们还能够十分擅长于照片和视频编辑,而功能强大的消费类GPU(例如Nvidia RTX 2080Ti)通常被夸张了。 消费类GPU也非常适合GPU渲染,因为GPU渲染引擎通常不具备只能在业余GPU上运行的性能。 业余GPU,不过,通常会...不太善于的游戏,但高超的编辑,渲染和简直任何其它专业级的工作,然而,雷同的性能下,业余GPU会价格更高。 因而,如果您晓得抉择的软件没有应用须要业余GPU的性能,并且您不须要业余GPU中的大量VRAM,那么消费类GPU简直总是更好的抉择,尤其是在性价比方面。 然而,让咱们深入探讨一些细节。 CUDA内核,或者为什么在这里Nvidia受到青眼CUDA内核是指Nvidia GPU内发现的非凡解决内核,这是Nvidia专有的。 CUDA代表Compute Unified Device Architecture,而Nvidia GPU外部的这些外围实质上是充当原始计算能力,而不是原始图形能力。 这就是为什么它们被用来在受反对的字幕(例如Nvidia HairWorks)中加强计算密集型成果的起因,仅GPU不足以实现这项工作。 对于编辑和渲染,CUDA外围是执行给定工作所需的额定计算能力的必不可少的起源。 大多数编辑和渲染应用程序都以某种形式进行了优化,以利用CUDA内核,因而在零碎中增加更多功能将使您可能更好,更快地渲染模型、视频等。 一些风行的GPU渲染引擎(例如Octane和Redshift)是基于Nvidia的CUDA构建的,这意味着只有领有Nvidia GPU能力应用它们。在此类渲染引擎中,渲染性能简直与GPU具备的CUDA Cores数量成线性比例关系。 某些应用程序(例如Adobe的After Effects或Premiere Pro)带来了对Nvidia和AMD GPU的反对,但通常在Nvidia GPU上运行得更快。 ...

January 27, 2021 · 2 min · jiezi

关于rendering:如何更快地渲染深入了解3D渲染性能的指南3

如何更快地渲染外部因素:优化场景实践足够多,让咱们更快地渲染。 咱们当初将介绍的一些优化办法中的很大一部分将波及升高场景的复杂性,因而咱们能够缩小样本数量,同时依然取得无噪声的最终图像。 还记得缩小渲染工夫的两个步骤吗?第一步是找出导致加速的真正起因。 首先找到瓶颈–排除准则查找导致加速的起因的最简略办法是利用排除原理。 举个例子:如果场景中有一百个对象,而其中一个对象导致渲染速度变慢,则找到该单个对象的最快办法是通过排除原理。 当初,我一次只能删除一个对象,最终,在最坏的状况下,通过一百次尝试,我才找到罪魁祸首,然而有一种更快的办法。 始终删除(或禁用)一半的对象并测试后果(从新渲染)。为什么?因为通过删除一半的对象,您曾经能够将查找罪魁祸首所需的对象数量缩小50%! 所以当初咱们有50个对象。它仍会迟缓渲染吗?是?再次删除残余的50个对象中的一半。 它仍会迟缓渲染吗?没有?大!当初,咱们晓得罪魁祸首在咱们最初删除的那25个对象中。 因而,当初咱们只需两步,就能够将一百个对象缩小到25个。 继续执行此操作,直到找到对象。 (显然,这只是用于查找和测试问题所在的地位,请勿保留/笼罩场景。) 排除原理能够利用于任何事物。要命名网格、材质、灯光、关键帧。 始终尽可能放大问题范畴。尽可能地凑近罪魁祸首,您经常会发现解决办法比您设想的要容易得多。 您认为以下哪个论坛申请会容许其他人更好地帮忙您? 1、“请帮忙:我的场景渲染迟缓” 2、“请帮忙:为什么我场景中的树木渲染速度比其余场景(Redshift)慢得多?” 我能够保障,如果您失去第一个答案,那就是:“请先放大问题起源”。 不过,第二个可能会立刻失去答案:“大多数3D树上的叶子上通常都带有通明的资料。尝试限度透明度跟踪深度,看看渲染工夫是否变好,或者渲染引擎是否具备在高透明度深度下更好地工作的着色器。” Redshift的模板垫即便在高通明深度下也不会升高速度。尝试应用它。” 当初,第二个听起来如同能够立刻解决您的问题。因为您曾经晓得导致加速的起因是什么,所以其他人能够更快地为您提供帮忙。 通过排除事物,您能够将它们排除在等式之外。 排除场景对象?渲染依然很慢吗?您的场景自身很可能会很好。 缩小了渲染设置?渲染依然很慢吗?您的渲染设置很可能很好。 替换您的CPU或GPU?渲染依然很慢吗?CPU或GPU很可能与渲染速度升高无关。 你明确了。那样简略。 当然,问题始终可能是不同畛域的联合,然而稍后咱们会解决。 记住,要缩小导致加速的起因。 而后咱们能够进行修复。 在本文中,我将介绍一些典型的区域,这些区域通常被认为是导致渲染速度变慢的起因,您兴许能够应用这些办法来解决您的问题。 不过,它们并不总是无效,因而,请尝试学习剖析和分析场景的技巧,这样就永远不须要内部帮忙。 人们会来找您,因为您是专家。它所须要的只是对3D世界中解决问题的一些见解(不仅仅是渲染)。 首先找到瓶颈–查看样品简直每个古代的Render Engine都能够可视化每个像素采集的样本数量。这是Redshift的样子: 深色像素代表较少的样本,亮堂像素代表大量的样本。 可能渲染图像并高深莫测地看到哪些区域须要最多的样本,能够告诉您很多无关场景以及从何处进行优化的信息。 样本分布可视化会告诉您渲染设置是否配置谬误,或者是否存在某些场景对象,材质或照明仅须要太多样原本革除。 首先找到瓶颈–查看视口很多时候,您所须要做的就是在“线条模式”下查看视口,以便它在视口中显示所有多边形轮廓。 以上面这个场景为例。高深莫测,哪些对象具备许多多边形,应该具备缩小的后劲: 视口屏幕截图设置为(暗藏)线视图 首先找到瓶颈–查看场景和对象信息每个3D应用程序都能够显示整个场景或所选对象的多边形数量。这是在Cinema 4D中的外观: 还记得以前的排除准则吗?首先查看整个场景的多边形数。如果看起来很高,请抉择一半的对象,而后再次查看。 缩小对象抉择的数量,直到找到多边形计数过高的对象并进行优化。 如果您具备一个构造良好的场景,其中蕴含几个次要的对象组,则也能够单步执行这些操作并逐渐遍历层次结构,这可能会更快。 缩小多边形数量渲染性能的一个重要因素是场景中多边形的数量。依据教训,能够说,对于大多数场景,多边形越少,渲染它的速度就越快。 以下是大部分工夫来自大量多边形的列表: 原始网格物体曾经带有很多多边形。例如,导入的CAD数据或造型能够细分网格物体的修改器,每个细分的多边形数量减少四倍(例如Cinema 4D中的HyperNurbs,Blender中的细分曲面等)克隆通过组合/拉伸曲线生成的任何类型的NURB对象细分过多的参数对象微位移当初,您不能就解脱这些,对吗?它们是必不可少的,但咱们的确心愿尽可能地对其进行优化。 该过程很简略:缩小多边形的数量,直到开始看到渲染中的视觉差别为止。 让我解释一下:您是否须要在每一侧都具备100个细分的参数立方体?如果每边只有一个多边形,看起来会有所不同吗?不会的! 让咱们疾速看一下其中的每个: 原始网格多边形太多的原始网格物体很快就会成为渲染迟缓的起因。 原始网格物体的问题是,它们可能很难优化。 除了向其中增加一些折减修改器(通常会节约大量的UV布局和多边形流动)之外,除了手动折减和retopo之外,您实际上无能为力。 当然,如果您具备这些Raw网格的源文件,它们的原始文件,就能够保留! 您的客户是否向您发送了要转换为多边形能力在3D场景中应用的STEP或其余CAD数据?指定要从中生成多少个多边形很容易。尝试一下。 您的场景中是否具备雕刻的角色,其中蕴含数百万个多边形?兴许您能够获取源文件并应用细分修饰符,而不是将疯狂的分辨率间接烘焙到网格中。这样,您能够将细分级别调整为适宜您的角色的屏幕大小。 基准是这样的:仅应用网格的屏幕尺寸所需的尽可能多的多边形或细节。 如果您的角色在背景中,那么与拍摄特写镜头相比,您应该可能缩小多边形的数量。 (让咱们疏忽一个事实,即为高多边形的原始网格进行拆卸和设置动画是我永远都不想做的……) 记住,我并不是说您应该低调并扭转场景的外观。您应该具备实现场景外观所需的起码数量的多边形。 ...

January 27, 2021 · 1 min · jiezi

关于rendering:本地资源检测特效检测中Overdraw相关问题

1)本地资源检测,特效检测中Overdraw相干问题2)Android上如何减速断定Bundle文件是否存在3)xLua pcall异样捕捉4)Mipmap和带宽5)Timeline卡顿重大时,Clip被齐全跳过没有执行 这是第230篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:咱们这个特效资源检测Overdraw和理论检测差距有点大。是不是统计峰值比拟好一些?有可能一个特效播放工夫特地长,然而峰值就很短的工夫,这样一均匀Overdraw就很低了。 A:首先要谈谈Overdraw的定义问题: Overdraw是一个形容像素反复绘制次数的概念。单个像素的反复绘制次数很容易了解,然而对于一个特效的Overdraw,笔者还没有找到什么公认的“规范”的计算公式,也不存在什么“官网”的定义。对于一帧来说,Overdraw值能够定义为该帧总体绘制像素的次数 / 屏幕上理论绘制的像素数。而这个值也不能简略了解为“绘制的层数”。(试想如果总共在屏幕上绘制了1000个像素,其中只有一个像素绘制了10层,那这个反复绘制的像素对Overdraw值得奉献也是能够疏忽的,计算结果为:1009/1000=1.009)。而对于整个特效播放过程中的Overdraw,具体公式如何定义,又是一个问题。 sunbrando的开源库的计算方法:整个播放过程中, 分子是对每一帧绘制像素的次数求和,分母是对每一帧屏幕上理论显示的像素数求和。 这个公式的确能够从整体上掂量一个特效播放过程中的Overdraw。然而这种计算存在这样一个问题:有些帧特效占屏幕的比例很大,有些帧特效占屏幕的比例很小,而运算后果受屏幕占比大的帧影响比拟大。比方第一帧绘制了1000个像素,只绘制了1层,而第二帧绘制了2个像素,绘制了10层,那么计算出的值为:(1000x1 + 2x10) / (1000 + 2) = 1.018 。 UWA本地资源检测对特效Overdraw的计算与上述开源库计算公式是雷同的,不同的是特效播放的逻辑与相机对准的形式。 影响两个工具计算结果不同的因素有: 相机的对准形式不同。UWA的工具有一套相机主动对准的逻辑,相机的摆放不同,会造成Overdraw不同。播放的机会不同。UWA的工具会创立好场景后,主动加载并实例化特效,进行播放。而开源库ParticleEffectProfiler的计划是先把特效放到场景中,启动场景后再执行相干的逻辑,进行检测。楼主的案例中,除了相机对准形式不同导致两个工具计算结果不同之外,很大水平上受到了获取的特效播放机会的影响。 应用开源库工具进行检测,发现抓取相机的Overdraw数据前,曾经进行了三次Update,如下图所示。也就是说,特效的Overdraw是从第4帧开始统计的。这与该工具的代码逻辑无关,就不对起因进行剖析了。 而前三帧恰好又是在数值上奉献最大的帧,如下图所示,前三帧特效中有一个面片占了很大的屏幕空间。 而第四帧开始,特效的像素占比就小了很多。 这是两个工具即便应用雷同的对准形式,Overdraw计算结果也不雷同的起因。 另外,UWA的特效检测还存在一个问题:相机视锥体的Size是一直调整的,那么不同的帧特效的屏幕占比会因而而扭转,像素的绘制量也不同,对上述Overdraw值计算公式的奉献也就不一样。也就是说,相机的Size越小的帧,特效屏幕占比越大,对后果的影响越大。 这里有两套解决方案: 换公式,每帧都计算出OverdrawRate,再求均匀。用户自定义相机,相机的视锥体放弃固定,这样就是放弃主动对准,使相机的设置更靠近用户的理论应用环境。UWA的工具会一直迭代,依据需要尽可能找到一套最佳策略来帮忙开发者对我的项目进行标准。 如果在优化中要应用工具进行检测,并掂量优化的后果,倡议应用一套工具即可。应用同一套规范至多能够对资源的性能进行一个排名,据此来抉择优化的优先级,并应用同一套规范评估优化后果。 感激Prin@UWA问答社区提供了答复 AssetBundleQ:咱们在Android平台上打包时,把Bundle放到Streaming Assets中,Patch文件放到长久化目录中。在启动时判断:Patch目录有Bundle就用Patch目录的,没有就看Streaming Assets目录有没有。 问题是:Android判断Streaming Assets下是否有文件,要用www或UnityWebRequest。这两种都是异步读文件,期待异步操作完结须要几毫秒以上,导致判断逻辑耗时很长(Bundle 较多)。 想求教下大家是怎么解决 Android上的文件断定问题呢? A1:Streaming里放个资源字典文件,用这个判断。感激lanyt@UWA问答社区提供了答复 A2:能够这样来解决:有一个全局的Bundle资源的配置文件,外面记录了所有Bundle的信息,这外面会蕴含其相对路径。只有从包外面读这个文件是须要异步的,如果从Patch目录读这个文件也是同步的(例如应用FileStream)。失去了所有Bundle的相对路径后,在理论须要加载某Bundle时,先应用File.Exist或者直接判断AssetBundle.LoadFromFile的返回值是否为null来判断Patch目录是否有该Bundle,如果没有的话再应用包内门路从新调用AssetBundle.LoadFromFile即可。经测无效,把文件判断扩散开,Patch目录能够间接用File,不存在就认为是在Streaming Assets目录,最初利用Load的后果来更新,看是否存在的记录。感激范君@UWA问答社区提供了答复 A3:有一个不错的开源库,可能同步读取StreamingAssets下的文件:《BetterStreamingAssets》感激张迪@UWA问答社区提供了答复 LUAQ:想请问下在xLua中应用pcall/xpcall实现C#中的Try Catch性能的时候,在iOS/Android/模拟器等平台上,有什么须要留神的中央。 因为对Lua底层不是很理解,想确认下,线上我的项目应用是否可行。还有这个的性能耗费有多少,Update里能够用吗? 我的项目应用的是xLua,版本是2.1.14,Unity版本是2019.4。 A:大范畴的应用中,pcall和xpcall自身必定有肯定的性能影响,不过咱们倒是没有做过很齐备的性能测试比照。印象中之前做过一些检索,没有找到特地明确的答案。Lua中源码的实现比照能够参考这里:https://stackoverflow.com/questions/16642073/whats-the-difference-behind-normal-function-call-and-pcall/16642612能够看到pcall确实比惯例的call多做了一些事件,只是这是Lua做异样捕捉的惟一形式,当你不想游戏逻辑被错误信息打断的时候,只能应用它。pcall/xpcall在各种平台和模拟器上除了稍微的性能影响之外没有任何问题,因为它是Lua原生的形式,如果应用LuaJIT,留神一下Lua和LuaJIT下的区别封装即可。感激贾伟昊@UWA问答社区提供了答复 RenderingQ1:请问,Mipmap到底能不能升高带宽,如果不能升高,是否具体通知一下起因,谢谢。 A1:能够升高!Mipmap是为了解决Texel和Pixel没有1:1对应的一种解决形式。一般来说如果解决远处物体的渲染,仍然应用失常的纹理采样,那么其实1个Pixel就个别须要采样到多个不相邻的Texel[1:n的关系],那么不相邻这就可能波及到一个Cache Miss的问题。而Cache Miss必然须要从显存中从新采样纹理数据,这天然就会耗费带宽。感激会丢锅的Coder@UWA问答社区提供了答复 A2:是能够升高带宽开销的。次要是因为在渲染相邻Pixel的时候,采样的Texel可能是在内存中不间断的,而GPU的Texture Cache是很小的。如果没有Mipmap,在渲染远处物体时,GPU可能须要不停的在贮存Texture的各段Memory不停的拜访,Cache Miss很重大。而应用了Mipmap后,相当于离线将每个Texel笼罩的Texture的面积变大,这样能够晋升Texture Cache的命中率,从而缩小间接从内存读取数据的次数,从而节俭了带宽的开销。感激范君@UWA问答社区提供了答复 Q2:请问上文中:1. “而应用了Mipmap后,相当于离线将每个Texel笼罩的Texture的面积变大”,这里是Pixel还是Texel?2. 还有就是Memeory是指内存是吧?不是曾经把一张图提交给了GPU显存了吗? ...

December 29, 2020 · 1 min · jiezi

关于rendering:关于CameraactiveTexture和CameratargetTexture的疑问

1)对于Camera.activeTexture和Camera.targetTexture的疑难2)如何升高动画文件的浮点数精度3)应用EasyMovieTexture在Android播放视频失败4)模型顶点色(Color)如何去除5)多层3D场景寻路计划探讨 这是第227篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:始终有个纳闷,Camera.activeTexture和Camera.targetTexture在Get的时候,Get到的是一个RenderTexture吗? 我晓得这两个的区别是一个只能取得以后所正在渲染的RenderTexture,一个是既能够取得也能够设置渲染指标,但这样activeTexture有什么必要性呢? 是我对这两个的了解有谬误吗?还有大家平时说的Backbuffer,在我渲染指标始终是屏幕的时候,这两个办法取得的都是Backbuffer吗? A:第一个问题:Camera.targetTexture必须在相机指定Render Target才会非null,Camera.activeTexture获取到的值和调用的机会有关系。官网文档中写着能够在OnPostRender中获取到,比方应用了后处理,在OnPostRender中能够获取到后处理申请的RenderTexture,在Update中获取就是null。如果给相机设置了RenderTexture,那么targetTexture就是设置的RenderTexture。如果没有开启HDR,在OnPostRender中activeTexture获取到的也是这个RenderTexture。如果开启了HDR,则是一个另外申请的RenderTexture。第二个问题:举荐应用RenderDoc查看渲染状态,分为两种状况,在安卓平台上开启了Always Blit和没开启会不一样。开启了Always Blit,会在最初多一个Present的过程,在Present之前,会将所有的渲染渲染到一个叫tex的RenderTexture上(这里不思考后处理以及HDR导致生成了额定的RenderTexture),在Present的时候将tex Copy到Backbuffer外面。如果没有开启AlwaysBlit,比方Blit Type是Never,那么所有的渲染都是间接渲染到Backbuffer的(这里同样不思考RenderTexture的状况),Blit Type为Auto的时候没有遇到呈现Present的状况,在线性空间也没呈现Present 。Backbuffer和那个用来Present的tex这两个对象都能够了解为零碎提供的,从C#脚本中是没法获取到的,而且从Profiler外面也是看不到这两个对象的大小的。 总结起来就是:大部分状况下Camera.targetTexture都是为null的,除非相机设置了RenderTarget。 对于Camera.activeTexture,这个须要看调用机会,在OnPostRender中调用,如果有应用后处理或者HDR,则能够获取到申请到的RenderTexture,在Update外面获取是null的,其余的函数阶段没有具体测试过。 对于Backbuffer,这个零碎是提供的,C#脚本是获取不到的。而且不肯定是间接绘制到Backbuffer,就算没有应用后处理或者HDR,如果开启了Always Blit,也是会多一个中间层,在最初阶段中间层会Copy到Backbuffer。 感激Xuan@UWA问答社区提供了答复 AnimationQ:动画文件后处理能够做两件事,精度压缩,Scale曲线剔除。比起用工具批改原始FBX文件,这样比拟灵便。 理论测试,在开启Optimal压缩的状况下,加上这个后处理,能再节俭40%左右。 示例代码和测试后果见知乎专栏:https://zhuanlan.zhihu.com/p/27378492 void OnPostprocessModel(GameObject g) { // for skeleton animations. List<AnimationClip> animationClipList = new List<AnimationClip>(AnimationUtility.GetAnimationClips(g)); if (animationClipList.Count == 0) { AnimationClip[] objectList = UnityEngine.Object.FindObjectsOfType (typeof(AnimationClip)) as AnimationClip[]; animationClipList.AddRange(objectList); } foreach (AnimationClip theAnimation in animationClipList) { try { //去除scale曲线 foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation)) { string name = theCurveBinding.propertyName.ToLower(); if (name.Contains("scale")) { AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null); } } //浮点数精度压缩到f3 AnimationClipCurveData[] curves = null; curves = AnimationUtility.GetAllCurves(theAnimation); Keyframe key; Keyframe[] keyFrames; for (int ii = 0; ii < curves.Length; ++ii) { AnimationClipCurveData curveDate = curves[ii]; if (curveDate.curve == null || curveDate.curve.keys == null) { //Debug.LogWarning(string.Format("AnimationClipCurveData {0} don't have curve; Animation name {1} ", curveDate, animationPath)); continue; } keyFrames = curveDate.curve.keys; for (int i = 0; i < keyFrames.Length; i++) { key = keyFrames[i]; key.value = float.Parse(key.value.ToString("f3")); key.inTangent = float.Parse(key.inTangent.ToString("f3")); key.outTangent = float.Parse(key.outTangent.ToString("f3")); keyFrames[i] = key; } curveDate.curve.keys = keyFrames; theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve); } } catch (System.Exception e) { Debug.LogError(string.Format("CompressAnimationClip Failed !!! animationPath : {0} error: {1}", assetPath, e)); } }} A1:压的是文本文件的大小,只是编辑器下更快,不论怎么解决,内存还是一个Float。感激海的滋味@UWA问答社区提供了答复 ...

November 20, 2020 · 2 min · jiezi

关于rendering:关于CameraDepthTexture的疑惑

1)对于_CameraDepthTexture的纳闷2)贴图Alpha通道对图片大小的影响3)URP要怎么实现GrabPass的成果4)如何获取AssetDatabase加载失败的Asset的Instance ID5)如何判断Bundle文件加载进内存的机会 这是第226篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:一个对于_CameraDepthTexture的疑难。 如果开启_CameraDepthTexture,Camera就须要渲染一遍场景内所有带有ShadowCaster的可见物体的Pass来实现深度图。 然而场景中的物体在开启ZWrite的时候就把深度写进了Depth Buffer中了,间接取得这个Depth Buffer是不是比近乎DrawCall翻倍的形式更有效率呢?还是Unity在这方面有什么思考? 另外,问一个更理论的问题:咱们的我的项目须要渲染场景的中湖水的深度成果,所有不通明的场景物体的材质都是关联同样一个Shader,这个Shader是带有ShadowCaster的。然而只有个别插入水中的物体须要去渲染ShadowCaster的Pass,有没有办法在不减少Shader的状况下,让没有插入水里的物体不渲染Shadow Caster Pass呢?咱们用的是Built-in的渲染管线。 A:第一个问题,能够参考这个问题中Unity官网人员的回复。外面讲了两个起因,第一是对于非全屏渲染的状况,原本是想拿对应相机渲染的深度,然而Depth Buffer是全屏的。第二个起因是因为很多平台不反对间接拿Depth Buffer的数据。参考网页:https://forum.unity.com/threads/poor-performance-of-updatedepthtexture-why-is-it-even-needed.197455/ 另外查FrameBufferFetch相干问题的时候看到Unity论坛上另外一个贴子外面的答复。外面说到Unity反对了FrameBufferFetch,然而不反对DepthBuffer的获取。 参考网页:https://forum.unity.com/threads/pixel-local-storage-and-frame-buffer-fetch-on-mobile-devices.604186/ 第二个问题,如果不减少Shader,目前没想到其余好的办法。如果能够减少Shader,能够将原来的Shader复制一份,只在ShadowCaster的局部加一个“NeedDepth”这样的Tag,将水下的物体的材质球换成这个Shader,另外做一个只有ShadowCaster并带有“NeedDepth”这个Tag的Shader,这个Shader用来做Replace操作。 额定减少一个Camera,这个Camera追随主相机,或者作为主相机的子节点,创立一个RT,让这个Camera渲染到这个RT,在Update外面应用ReplaceShader去画一下,那么只有有那个Tag的ShadowCaster会进行深度渲染,后续能够对这个RT进行编码等操作,这个RT记录的就是水下物体的深度。整个过程看上去没有特地多的额定工作,感觉能够一试(我没有做过测试,但实践上是可行的)。 感激Xuan@UWA问答社区提供了答复 TextureQ:在UWA的《纹理优化:不仅仅是一张图片那么简略》这篇文章中,形容了图片含有Alpha通道会对内存有影响。 通过以下的测试资源配置: Tga_Alpha - 含有Alpha通道Tga_NoAlpha - 不含有Alpha通道Png_Trans - 含有通明的图片进入到Unity中的Format,全副代码设置为TextureImporterFormat.ASTC_6x6测试后果: 三张图片Unity全副Format为下图格局三张图片显示的内存大小全副一样Texture Importer的Alpha Source设置为None,对测试后果无影响 问题:图片是否含有Alpha通道,对于同一个Format格局,内存大小都是一样的吗?Tex.7z A:原文中的优化倡议是去除无意义的Alpha通道(原文中的定义为Alpha值全副为1的贴图),这个的确是对内存优化有帮忙的。题主的测试用例中,无论是png格局还是tga格局,进入引擎后,都会被引擎转为外部的格局(RGBA、ETC、ASTC等)。构想一下,以ETC2为例,如果没有Alpha通道,在压缩品质能够承受的状况下,就能够选用RGB_Compressed_ETC2_4bits,而如果增加了这个无意义的Alpha通道,那么咱们在批量导入设置时,都会主动抉择RGBA_Compressed_ETC2_8bits。这样内存就相差了一倍。 而问题中对于ASTC的状况,在Unity编辑器源码中的Texture导入格局的定义有这样一句正文:// ASTC uses 128bit block of varying sizes (we use only square blocks). It does not distinguish RGB/RGBA,即与是否蕴含Alpha通道无关。对于ASTC格局的介绍,这里举荐你浏览一下Github上的ASTC Format Overview。 而对于你楼上回复中提到的Unity新版本的问题,能够看下Unity论坛上的这个问题。 可能有人感觉对于我的项目的贴图格局都是ASTC来说,去除Alpha的意义不是很大,其实不能一概而论,尽管大小雷同,但依据(https://zhuanlan.zhihu.com/p/158740249)中的测试,是否有Alpha通道会肯定水平上影响压缩品质。所以还是要在我的项目中正当应用。 感激范君@UWA问答社区提供了答复 A2:游戏运行时Texture的Alpha通道要看导入后的状况,不能看源文件的状况。UWA本地资源检测对于Texture的Alpha通道检测的就是导入后的后果。图片源文件的格局,图形硬件是不反对的,Unity也不间接接管。导入图片后,会依照Import Settings中的设置对图片进行解决,将图片导入成硬件反对的格局(在引擎中的格局),而在运行中应用的资源也是导入后的。 题主将Alpha Source设置为None,那么导入时就不对源文件的Alpha通道进行导入,而压缩格局为ASTC_6x6,这个格局是蕴含Alpha通道的。这样导入后三个资源都会默认生成一个全为1的Alpha通道。占用内存大小天然一样。 感激Prin@UWA问答社区提供了答复 ...

November 10, 2020 · 1 min · jiezi

关于rendering:厚积薄发关于Addressables做启动热更资源的路径问题

1)对于Addressables做启动热更资源的门路问题2)Unity 2018 Android平台Blit Type设置为Never时画面会变暗3)视频压缩计划4)对于AssetBundle中的资源冗余的问题5)Addressable如何让加载的时候不比照服务器 这是第221篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) AddressableQ:对于Addressables做启动热更资源的门路问题,将局部资源在可寻址零碎里打入了StreamAssets,并将资源设置Cannot Release。打出程序后批改资源,做热更流程,而后运行程序也失常检测热更并下载,然而下载的更新AssetBundle包并不在PersistentDataPath门路下。如果是在同一机器下,热更包会在Unity编辑器的Temp门路下找到,可是我将程序拿到什么都没装的新电脑下,程序还是能检测热更下载,但PersistentDataPath依然看不到热更AssetBundle,求解。 A1:Addressable下载更新用的是缓存的形式,所以不会在PersistentDataPath外面,会在利用的默认缓存目录外面,如下图: 如果须要批改缓存的门路,这个能够试下: 最初拉进去AddressableAssetSettings的Initialization Object列表里就行。 感激Toushirou@UWA问答社区提供了答复 A2:感谢您的帮忙,该形式的确能够重写缓存门路。值得注意的是Cache Directory Override并不能齐全像Addressables Profiles里门路一样配置可变门路,只反对了带“{}”的形式,如{UnityEngine.Application.persistentDataPath},带“[]”则不反对配置。再次感激层主的帮忙!另外,下层Cache Directory Override最终调用的源码,可依据本人的需要拓展,如下图: 感激题主兮风@UWA问答社区提供了答复 A3:在安卓手机上安装一个apk,并且运行之后,假如这个apk的包名叫com.x.y,会在安卓手机上多3个目录:目录1:sdcard/Android/data/com.x.y,这个目录下有一个cache目录。目录2:data/app/com.x.y-1,这个目录下有目录lib和目录oat,还有一个base.apk。目录3:data/data/com.x.y,这个目录下有有5个目录,files,shared_prefs,cache,code_cache,lib。下面的目录1的sdcard和目录2的data是同级的。目录2和目录3须要root能力看到,没有root的手机应该是只能看到sdcard上面的文件。当我运行Addressable进行近程加载资源后,在目录1外面多了一个与cache同级的files目录,这个files目录应该就是Application.persistentDataPath。在这个files目录外面会多两个目录,别离是com.unity.addressables,这外面放的是catalog.hash和catalog.json,另外一个是UnityCache目录,外面有两个目录,Shared和Temp,Temp是空的,Shared外面放的是下载的AssetBundle。 Addressable应用的是Caching机制,所以是能够通过相似于Caching.currentCacheForWriting = Caching.AddCache(“D:/Shalou/UnityCaching/”);这样的操作在PC上更改缓存目录的,在Android平台上应该也是能够的,这个就和安卓的权限有关系了,没有做进一步的测试。猜想是,如果没有开启External的Write Permission,只能在目录1上面的files目录外面进行目录替换了,也就是只能在Application.persistentDataPath前面增加子目录来更改缓存目录。 在PC上,题主说的默认的缓存和persistentDataPath的确是两个门路,如下图: 感激Xuan@UWA问答社区提供了答复 RenderingQ:有看到说Blit Type设置为Always会多出一次Blit操作,在2018下在真机测试了下呈现相似对比度变大,画面变暗的成果。改回Always就失常。色调空间为线性空间。这项设置有什么考究? A:AndroidBlitType.Never不提供sRGB后备缓冲区。线性渲染须要一个执行sRGB读/写转换的帧缓冲区(请参阅RenderTexture.sRGB),否则生成的图像通常显得太暗。因而,在应用线性渲染时,不倡议应用AndroidBlitType.Never。如果想应用AndroidBlitType.Never进行线性渲染,只管有这些信息,您依然必须设置本人的sRGB渲染指标并解决针对后备缓冲区的Blit操作。能够参考一下网址: https://docs.unity.cn/cn/current/ScriptReference/AndroidBlitType.htmlhttps://docs.unity3d.com/ScriptReference/AndroidBlitType.html 感激小埃拉@UWA问答社区提供了答复 VideoQ:求教一下,对于视频来讲有什么比拟适合的压缩计划?目前咱们原始视频有近60MB,筹备压缩后放入StreamingAssets下,读取解压后播放。除了对VideoClip自身做解决外,还有其余计划么?心愿Android和iOS平台都通用。 A1:能够试试压缩成H.264或者H.265编码的MP4格局视频。感激马三小伙儿@UWA问答社区提供了答复 A2:H.264兼容各平台在Unity 2018上。感激Eureka@UWA问答社区提供了答复 AssetbundleQ:用UWA检测AssetBundle资源冗余时,发现有17个资源冗余,然而通过比照查问Bundle的Manifest文件,发现这些冗余的资源都会独自打包成一个AssetBundle,并且没有存在于本人预设资源中,然而UWA给的论断是这份冗余的资源存在于他所在的各个预设当中,请问是怎么解? A:我也是当初遇到的问题,Manifest没有这个冗余,AssetBundle加载进来,内存里你也没有发现这个冗余,调用GetAllAssetNames也看不到这个冗余的名字,然而如果调用LoadAllAssets,就呈现了这个冗余,十分神奇,藏的很隐秘。 起因:Rawimage挂的Texture,ParticleSystem援用UI资源。冗余的危害我就不说了。 解决方案:如果说尽量保障Rawimage的图和Prefab等资源打到一个AssetBundle,这个有点难,也很累,排查起来比拟艰难。 我的解决方案: 除了Background,禁止Rawimage挂Texture,而说实话,我的Background都做了RGBA拆散,所以Rawimage挂的是Material,而Rawiamge不挂Texture是因为咱们我的项目都是异步加载了的,尽量保障Prefab先进去,前面不重要的异步进去。禁止粒子特效挂在到UI的Prefab上,并且写工具,禁止粒子特效的Prefab援用UI资源,因为粒子特效ParticleSystem形容文件缺失大,如果挂在UI上,还会造成Prefab可能上M数量级,影响加载速度,同时粒子特效和UIPrefab拆散,也不会造成冗余。感激夏霖锐@UWA问答社区提供了答复 AddressableQ:想做传统的那种,在进入游戏的时候对立加载更新,而不是目前这种,读取某个界面,就去服务器判断。当初的问题是怎么让每一次加载的时候不去判断服务器,而在进入的时候判断全副更新。 A:能够在游戏启动的时候在一个专门的更新界面做更新,具体做法是先初始化,而后调用GetDownloadSizeAsync和Addressables.DownloadDependenciesAsync进行AssetBundle更新(Addressable是以AssetBundle为最小更新单元的),这样就会将所有须要更新的AssetBundle缓存到本地了,下次用到这些资源就不必近程下载了。大抵代码如下: IEnumerator Start() { //只有打包的时候不要将Disable Catalog Update on Startup勾选上就行,这样初始化的时候会自动更新Catalog到最新 yield return Addressables.InitializeAsync(); IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators; List<object> keys = new List<object>(); //暴力遍历所有的key foreach (var locator in locators) { foreach(var key in locator.Keys) { keys.Add(key); } } var handle = Addressables.GetDownloadSizeAsync(keys); yield return handle; long downloadSize = handle.Result; if (downloadSize > 0) { yield return Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, true); } } 在游戏过程中,Addressable初始化当前,只有不调用Addressables.CheckForCatalogUpdates和Addressables.UpdateCatalogs,内存中常驻的Catalog生成的映射表对象是不会产生扭转的,就算把服务器的Catalog和资源更新了也不会影响客户端的运行。感激Xuan@UWA问答社区提供了答复 ...

September 30, 2020 · 1 min · jiezi

关于rendering:运用Post-Processing导致帧率明显下降

1)使用Post Processing导致帧率显著降落2)RectMask2D是不是会频繁触发SendWillRenderCanvases3)Unity3D Sence为何始终处于已批改状态4)Sprite Atlas打Bundle的冗余问题5)IL2CPP在Xcode下增量编译问题 这是第220篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:我的项目中使用了Post Processing后,帧率降落微小。测试场景,模型面数2w,一般的Diffuse材质 ,没有物理,没有特效。没开后处理时,低端机30帧。开启后处理,帧率抖动,最低达到15帧。前面只用到Bloom和Color Grading。 A:如果Bloom用的不好,GPU性能耗时高是较为失常的事件。Bloom的高低采样次数、Filter滤波的Sample点个数、屏幕的分辨率等都是影响Bloom性能的重要因素。倡议题主能够思考浏览《Unity引擎景深实现原理分析与优化》这篇技术课程,外面优化DOF的办法仍然能够用到Bloom上。 同时,也能够应用GOT Online中的Overview模式,间接查看我的项目在真机上(最好是高通芯片)的GPU耗时,看看GPU的具体超标状况: 该答复由UWA提供 UGUIQ:RectMask2D是不是会频繁触发SendWillRenderCanvases? A:是的,Rect Mask 2D会继续每帧计算子节点的裁剪区域。所以Rect Mask 2D上面的元素如果比拟多,耗时还是挺高的,这种状况能够换成Mask组件,尽管Mask的Overdraw会高一些。一个省GPU,一个省CPU,两个是须要衡量的。感激Xuan@UWA问答社区提供了答复 EditorQ:Unity 3D Sence始终处于已批改状态。刚切换过去也间接提醒已批改。切换Sence并未作出任何批改,如下图: 尽管没什么难题,但切换别的场景或者退出的时候就要提醒让保留了。 之前发现的一个起因是因为UI中存在套用的Layout组件呈正告状态。批改后Sence就恢复正常了。各位有遇到过这种问题吗? A:所以说还是嵌套了Layout组件。这个会导致Sence始终处于批改状态。 感激刘旭杰@UWA问答社区提供了答复 AssetBundleQ:游戏中UI用Sprite Atlas做合图,打Bundle貌似碰到了一个冗余问题:(Unity 2019.4.1 lts版本)。 Victory目录有四张散图,以及一个Sprite Atlas文件做合图。Bundle时把整个Victory为一个Bundle。最终进去的Bundle构造如下: 也在网上搜了一些信息,尝试去掉Sprite Atlas的Include in build选项(成果未验证,纯正验证Bundle),Bundle中少了一份冗余的Texture 2D,但仍旧有几个Sprite类型的散图。 疑难:我了解是,Bundle中曾经有一个sactx-1024x2048的合图了,为什么还有Sprite类型的散图?这是否算冗余呢? 用去掉Include in build的形式,游戏中应用UI Prefab时,是否都须要用Late Binding能力应用图片(感觉很麻烦,UI拼每个界面,都要程序写配套代码)? A1:最开始形容的问题中(依据第一张截图)并未看到冗余的存在,也并非图集模式的打包后果。答复如下:对于图集自身的Bundle必定是不算的,须要有各个散图的信息能力从整图中获取散图,不然就不晓得你要的那个图在哪里。 不勾选Include in build,Bundle中就不会存在显式的图集依赖,必须应用提早绑定传递信息(该图片从哪个图集中获取)给申请图片资源的对象。 感激Welkin_Totoro@UWA问答社区提供了答复 A2:形容下我的思路:勾选了Include in build,Bundle中就会有一份冗余:既蕴含合图,又蕴含散图。但这种状况下,程序不须要做非凡逻辑,界面就能体现失常(具体Runtime是否合图,未抓帧验证)。 不勾选Include in build(正确做法):Bundle就会只蕴含Atlas,以及散图信息(不是残缺的散图)。游戏内应用Atlas Request Manager来确保图片能失常显示,否则会错乱。如果本人实现了资源加载的话,可能还要本人找机会做Atlas资源卸载。 ...

September 30, 2020 · 1 min · jiezi