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(原群已满员)