1)纹理的内部格局对其内存的影响
2)更换 Mac 平台后我的项目中的局部 DLL 生效
3)打 Shader 包的时候是否须要将 cginc 打进去
4)内置 Standard 的代替计划
这是第 264 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Texture
Q:原来一个 Prefab 用到的图是 16MB,4096*4096 像素,而后用 PS 压缩了一下变成 600KB(分辨率不变)。打 AssetBundle 测试,除了 AssetBundle 的大小由 27MB 变成了 20MB,在内存中的 Texture 2D 都是一样的。因为在 Unity 设置的压缩格局是一样的,所以在 Unity 外面看到的内存也是一样大的,难道 Unity 外面的图片大小跟原图大小没关系?原图大小用 PS 压缩 / 不压缩除了 AssetBundle 收益,在不改 Unity 中图片压缩格局的前提下,内存就没收益了吗?
我猜测是不是 Unity 读取的原图,在运行时都是依据原图,而后依据 Unity 外面设置的压缩格局本人在内存中是一份新的图,就跟原图没什么关系了?
A1:图片导入 Unity,就会按设置的格局和压缩变成 Unity 本人的格局,此时的内存大小就和图片原始大小无关了。这时要到 Inspector 里的下方看图片的压缩格局和内存大小。猜测是 Unity 把图片导入时,主动转换了一份本人的格局存储到了 Library 里,所以真正加载显示的就不是原始那张图片了。
感激林健 @UWA 问答社区提供了答复
A2:首先咱们要明确一个概念,咱们在电脑上看到的 png 格局或者 jpg 格局的图片,png / jpg 只是这张图片的容器,它们是通过绝对应的压缩算法将原图每个像素点信息转换为用另一种数据格式示意,以此达到压缩目标,缩小图片文件大小。
当 Unity 将这张图片加载进内存时,这些文件会被转换为特定的格局,调取速度更快,占据内存更少,比方 ASTC_6X6 等。
纹理加载进内存后,大小计算公式如下:
纹理内存大小(字节)= 纹理宽度 x 纹理高度 x 像素字节
像素字节 = 像素通道数(R/G/B/A)x 通道大小(1 字节 / 半字节)
感激马三小伙儿 @UWA 问答社区提供了答复
Editor
Q:我的项目须要开发 Mac OSX 平台利用,换到苹果电脑之后 sqlite3.dll 和 user32.dll 生效了,在网上下了很多替换的都不行,其它的 DLL 都能够,请问如何兼容这两个 DLL 呢?
A:你的 sqlite3.dll 应该是只能利用于 Windows 平台,Mac 上须要对应平台的 Sqlite 库。user32.dll 这个很显著是个 Windows 平台的动态链接库,Mac 上无奈应用。
我又搜寻了一下材料,发现在 iOS、Mac 上如同不须要额定地去导入原生的 Sqlite 库,它们有自带预编译好的 Sqlite 库。你所须要做的是:将 Mono.Data.Sqlite.dll 这个文件从引擎目录拷贝进去,搁置在 Plugins 目录下。
具体能够参考这两篇教程:《Unity 工具—Mono.Data.Sqlite 应用》
集成流程看这个:《Setup Database (SQLite) for Unity》
我依照下面的步骤做了一个 Demo 测试了一下,Windows 和 Mac 上都能够失常的运行。
感激马三小伙儿 @UWA 问答社区提供了答复<
Shader
Q:原本我的项目中用的是内置的 Standard,为了缩小变体的起因,将 Built in 的 Shader 蕴含 cginc 文件的全副放到本地。打 Shader 的时候,须要把援用到的 cginc 文件也打进 Shader 包内吗?看到有说其实 cginc 的代码片段被编译到了 Shader 中,依照这种说法不就应该只有打 Shader 就行,对应的 cginc 是否还须要打进去?
A1:不须要,打包时候 Shader 会编译成对应平台的 Shader,曾经主动将 cginc 的代码合并进来了。
感激范世青 @UWA 问答社区提供了答复
A2:不须要的,举个例子,如下一个简略的 CG,其中定义了 vert 和 frag 函数,及 2 个 uniform 和一个常量:
同时创立一个“Shader1”应用这个 CG 的 vert&frag 实现:
在 Shader 的 Inspector 面板抉择对应平台编译,Shader 的编译相似 C ++ 的编译,#include 能够了解为将文件内容开展,编译完的后果如下,Vertex Program:
Fragment Program:
Shader 打包就是编译的过程,所以不须要把 CG/cginc 等打包。
感激羽飞 @UWA 问答社区提供了答复
Shader
Q:应用内置的 Standard,一方面有变体,另一方面应用一次 7MB 内存,有没有比拟不错的替换计划?也能够本人写一些漫反射、金属、高光等属性,想问一下有没有更好用的?
A1:首先,内置 Shader 在理论我的项目中确实不被举荐应用,因其 Keyword 导致变体十分多,最终 Shader 本身或 ShaderLab 的内存占用会比拟高,这个统计受到 Unity 版本的影响。
该点可参考:《Shader 内存统计与版本关系》
其实本人写 Shader 是最可控的形式了,能够依据本人的我的项目写一些有针对性的成果,如果只须要一些惯例的成果,能够参考 Standard Shader 的源码,用一些 Unity 封装好的基于 PBR 光照模型的办法。
感激翟孟飞 @UWA 问答社区提供了答复
A2:通过本地目录 Editor\Data\CGIncludes 中的 cginc 文件和官网下来的 Built in Shader 把你须要的成果都抽出来缩小 Shader 的变种数量。打包的 Shader 和对应的 cginc 是主动打在一起的。
感激萧小俊 @UWA 问答社区提供了答复
A3:不倡议应用内置 Shader,起因题主也写了。默认的 Shader 更多的是给到一个大而全的抉择,比拟适宜疾速做原型 Demo。
理论我的项目开发中倡议还是依据美术的理论需要本人从头来写,局部性能能够参考内置 Shader 的代码,这样既能满足美术需要,又能满足性能的要求。
感激范君 @UWA 问答社区提供了答复
A4:这个 Standard 就是把以前的一些 Built in 的 Shader 交融在一起了,实现的成果的确是多了,然而也显得很臃肿,还是倡议本人拆分定制不同的 Shader,或者下载 Built in 外面的 Shader。
感激 Lim@UWA 问答社区提供了答复
20210824
更多精彩问题等你答复~
1.Vulkan API 的性能及兼容性
2.Unity TMP 字体计划如何抉择
3. 如何实现 AAB 包的增量更新
封面图来源于:ChromaPack
ChromaPack – Unity 的有损纹理压缩插件。
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)