3

TextMeshPro备用字体疑问

 2 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_269.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

TextMeshPro备用字体疑问

1)TextMeshPro备用字体疑问
​2)iOS的部分语言的float分隔符变成了逗号
3)ASTC格式支持与官方文档不符
4)关于音效背景音乐的音频文件的格式设置请教
5)LightProbe的信息位置


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

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

Q:TextMeshPro设置的Fallback “字体B”, 文本字体是“字体A”,如果文本显示的字符都是字体A的,CPU会不会收集字体B的贴图信息数据发送给GPU用来渲染?

不是很理解这个Fallback字体,发现字体A、字体B都在内存中,也就是说其实都是关联上的。是不是所有的后备字体都会在内存中出现?

A:问题一:TMP中所谓Fallback,也就是后备字体,其含义在于当实际使用中出现了当前字体所不支持的字符时,按照:主字体(也就是当前字体)、主字体的后备字体、后备字体的后备字体、通用后备字体、通用后备字体的后备字体、通用默认字体、通用默认字体的后备字体等等的序列遍历所有设置的后备字体,直到找到能够支持的字体为止。

所以,引擎只有在内存中保留Fallback字体资源,才能在当前字体无法显示所有字符时采用Fallback字体。问题中提到的字体B也在内存中是合理的。

当然,如果开发者能确定字体A可以支持项目中出现的所有字体,那么完全可以检查Project Settings中全局的Default Font Asset、全局的Fallback Font Assets List、字体A的Fallback Font Assets,以上三处设置为空,则可以一定程度上节省内存。

问题二:我补充做了实验。对照情况是用某一种主字体显示“New Text”这一串字符,显然足够支持、而内存中也只有该主字体。然后在刚才提到的主字体的后备字体、后备字体的后备字体、通用后备字体、通用后备字体的后备字体、通用默认字体、通用默认字体的后备字体这个序列的每个环节加上不同的字体,显然它们没有被实际用到,但都进入内存了。List里面有几种字体也是一样。

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


Q:最近我们打包的时候发现,在iOS设备上,部分语言的小数的分隔符变成了逗号,比如俄罗斯语。后来发现是因为CurrentCulture变成了设备的语言,Android和之前的iOS设备都是en-US,也就导致了读取配置时用float.TryParse会转换失败。

我们的Unity版本是2018.4.33,目前还没有定位是什么原因导致的,不知道有没有人碰到过?如果在游戏启动时强制把CurrentCulture改成英语不知道可不可行?

A:我们项目踩过这个坑,原因就是一些语言里面小数点分隔符不一样,比如法语里分隔符是逗号,属于文化差异。解决方案是游戏启动时设置CurrentCulture为CultureInfo.InvariantCulture:

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

参考链接:CultureInfo.InvariantCulture

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


Texture

Q:ASTC格式支持与官方文档不符,根据官方文档(https://docs.unity3d.com/Manual/class-TextureImporterOverride.html)。理论上我们的测试机中,红米2是不支持的ASTC格式的。但实际测试中发现,它是支持的。这是怎么一回事?

1.png

A:之前做过相关的测试,红米2(Adren 302)是支持ASTC的,但红米Note2(PowerVR Rogue G6200)是不支持的。并且从Unity 2017.4的Profiler中可以看到纹理的大小是正确的。

这和官方提供的:tvOS (all), iOS (A8), Android (PowerVR 6XT, Mali T600 series, Adreno 400 series, Tegra K1)不符。

从目前的测试来看,可以认为实际支持情况和文档提供的GPU型号并不完全一致。在不支持的机型上会软解成RGBA32或RGB24,实际内存也是一样。

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


Audio

Q:在UWA的报告中看到要用Streaming的方式读取音频。想问一下关于音频格式,有优化角度比较全的建议吗?

2.png

之前项目里的设置大概是这样子的,合适吗?大家常见的做法是怎样的?有没有一个相对合理的经验值,比如10s的音效大小在100KB这样的参考值?

3.png

A:并不推荐使用MP3播放音乐,原因是使用MP3制作素材会无法避免在循环点引入空白音频,参见:https://sound.stackexchange.com/questions/25846/is-it-possible-to-loop-mp3-without-gaps

之前使用过类似于MP3Loop的小工具,但是编码质量也无法控制,最后选择用Ogg(Vorbis)一了百了。

早一些的开发者(1990-2000年前后)会采用MIDI,但MIDI只是记录音乐信息用的格式,实际发声取决于所使用的音源,而音源设计通常会倾向于大而全所以为了有限的MIDI音乐加载完整的音源也会造成资源冗余。

关于PCM或者ADPCM,通常被称为WAV及“三分之一的WAV”,可以根据音效具体内容来决定优化策略,有一个概念需要了解——奈奎斯特采样定理

简单讲,如果一个声音比较低沉,那么可以适当降低采样率来提升PCM或者ADPCM的“压缩比”,这样可以既保留PCM/ADPCM的低功耗和快速响应,又降低资源占用。假设一个声音比较明显的能量都分布在4000hz之下,那么只需要8000hz的采样率就可以非常好的记录及还原这个声音了。

事实上Unity原声音频最理想的音乐格式是Tracker Module,只是国内开发者了解Demo Scene的比较少,音乐创作者为此类格式创作的经验也非常稀少。

这里贴一个Tracker音乐的外网视频连接,大家可以听一下看看会不会唤起一些童年回忆:https://www.youtube.com/watch?v=gHQYYh7J1O4

翻译了Unity官方十一年前的一篇Blog:《.mod in Unity》
文章的中文翻译可以戳原问答查看

几个常用Tracker音乐制作软件的网站链接:OpenMPTMilkyTrackerschismtracker。有兴趣的朋友可以尝试一下用这种古老的格式创作音乐,可以做到既不牺牲音质也不占用多少空间。

关于进一步的音频优化技巧,个人比较推荐刷一遍Wwise的251认证课程内容,免费而且实际上都是些通用的技巧:https://www.audiokinetic.com/zh/courses/wwise251

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


Rendering

Q:场景中的LightProbe信息是保存在lightingData.asset文件中吗?

A1:如果要保存,可以考虑这样存:
AssetDatabase.CreateAsset(Instantiate(LightmapSettings.lightProbes), “Assets/lightProbe.asset”);

感谢萧小俊@UWA问答社区提供了回答

A2:不确定,lightingData.asset中主要存放Lightmap的对应关系,但LightProbe是否也在里面就不确定了。

感谢OCEAN@UWA问答社区提供了回答

A3:对于LightProbes更多的操作可以参考这篇文章:《聊聊LightProbe原理实现以及对LightProbe数据的修改》

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

20210927
更多精彩问题等你回答~

封面图来源于网络


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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK