Font Texture的内存值异常高

Font Texture的内存值异常高

1)Font Texture的内存值异常高
​2)UWA报告Overdraw的统计以及数据解读疑问
3)URP安卓平台下,高光有马赛克
4)UGUI因为Different Material Instance导致合批被打断
5)Unity地形TerrainData里面的SplatAlpha的压缩疑惑


这是第255篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Font

Q:我们的检测报告中看到一个占用很大的Font Texture,且是从刚进入游戏就一直存在。不过我想不通的是它仅有256*256,为什么会有61MB的占用?

版本:Unity 2019.4.3f1

A:在2018中没有见过这种问题,应该是Unity 2019的Bug,在Unity 2019.4.21中修复了。

参考网址:https://unity3d.com/unity/whats-new/2019.4.21

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60cde4e6e58b4719dd3e2656


Rendering

Q:在UWA的测试报告中,我们游戏的整体Overdraw比较高,我想在内网复测一下Overdraw数据,有几个问题想请教一下:

1. 我使用UnityOverdrawMonitor在Editor中测试整个场景的Overdraw,测试结果要比UWA的小一些,我又测试了几个相同的画面,都是UWA上的结果值更高一些,这个工具的统计值比UWA报告中的总填充数要小一点点,想问一下大家是怎样测试游戏中某个时刻的Overdraw?

2. UWA报告中这几个数据的关系是怎样的?总填充数、平均填充倍数和单像素最大填充数等。

3. 关于其它工具,我把ParticleEffectProfiler拿到内网,它可以统计单个特效的单像素最大填充数,测试了几个单独的特效,Overdraw高的达到了4、5、6,大多数特效都是2,已经整理出Overdraw过高的特效给美术去优化了。

PS:由于公司项目是在内网开发,所以项目在Editor中的数据没法截图,我贴几张UWA上的报告截图:


A:1. 如果UnityOverdrawMonitor是以下这个开源工具:https://github.com/Nordeus/Unite2017/

那么,这里面的统计是不准确的,因为它的底层原理是通过Shader Replacement把Shader换成半透明的Shader来进行渲染,从而计算其Overdraw,这个并没有考虑深度遮挡、剔除等问题,所以计算出来的值是有问题的,有时候甚至会引起不必要的误导。

  1. 这些数值的具体说明可见:《UWA新功能| GPU性能优化,One Step!》

总填充数峰值
项目运行过程中,单帧填充像素的数量峰值。

总填充数均值
项目运行过程中,平均每帧的填充像素数量。

填充倍数峰值
项目运行过程中,单帧中整个屏幕被填充的倍数峰值;倍数越高,则GPU的压力越大。

填充倍数均值
项目运行过程中,平均每帧的填充的倍数均值;倍数越高,则GPU的压力越大。

从截图中看,你们的特效Overdraw压力还是不小的,建议题主特别留意。

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60c97645e58b4719dd3e2524


Rendering

Q:最简单的场景,包含一个Unity默认球体,使用URP Lit Shader。

在编辑器中显示正常:

工程输出到安卓之后,高光部分马赛克非常严重:

材质只设置了颜色:

请问有人遇到过这个问题吗?

Unity版本:2021.1.9f1
URP版本:11.0.0

A:需要修改URP源码。

在Packages/com.unity.render-pipelines.core@11.0.0/ShaderLibrary/Common.hlsl文件中1225行:

// Normalize that account for vectors with zero length

real3 SafeNormalize(float3 inVec)
{
    real dp3 = max(FLT_MIN, dot(inVec, inVec));
    return inVec * rsqrt(dp3);
}

其中real需要修改为float:

// Normalize that account for vectors with zero length

float3 SafeNormalize(float3 inVec)
{
    float dp3 = max(FLT_MIN, dot(inVec, inVec));
    return inVec * rsqrt(dp3);
}

所以最终还是移动平台精度设置有问题。

感谢题主WTF-082699@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60cae88ee58b4719dd3e25a4


UGUI

Q:如下图所示,因为Different Material Instance合批被打断,但是的确是相同材质球,请问什么原因?

A1:会不会是材质名字相同,可以开Debug模式看看Instance ID是否一样。

感谢范世青@UWA问答社区提供了回答

A2:已解决,模板测试导致的。

感谢题主cwf@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60cab06ce58b4719dd3e259a


Rendering

Q:Unity地形TerrainData里面的SplatAlpha为非压缩格式,内存占用特别大,有没有比较好的压缩办法?

A:我不确定在Unity的原生Terrain中这张图是否可以压缩,原理上似乎是可以的(除非这张图是运行时在内存生成的)。

但是这张图存储的并不是颜色信息,因此压缩之后效果可能比较差,比如混合的边缘有马赛克。我们之前用T2M转成Mesh之后,压缩过这张混合贴图,效果很差,最后还是在某些可以接受的地块使用16位来减少一半内存,有问题地块还是使用的32位的原图。

感谢贾伟昊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60c9af08e58b4719dd3e2591

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)