1)SRP Batcher在真机上生效
2)Shader外面对同一张纹理屡次采样会影响效率吗
3)为什么纹理开启了mipmap后,纹理内存反而降落了
4)TMP为什么有屡次Delegate.Combine()的GC
这是第336篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。
UWA社区主页:community.uwa4d.com
UWA QQ群:465082844
Rendering
Q:Shader是Compatible的,在编辑器外面DrawCall也是SRP Batcher合批的,然而在真机上却没有合批胜利,是什么起因造成的?
A:须要排查对应的Shader是否存在在Constant Buffer中却不在Properties中的Uniform变量,这种情况会导致在OpenGLES的真机上SRP Batcher生效,然而这种情况在编辑器外面是SRP Batcher合批且Shader显示是Compatible的。
感激Xuan@UWA问答社区提供了答复
Shader
Q: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问答社区提供了答复
Texture
Q:为什么纹理开启了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问答社区提供了答复
Lua
Q:只有一个界面对一个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.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:465082844