⑴ 【Unity】图片压缩的解决方案
公司做的项目需要拍照生成精灵,流程是客户端先拍照,压缩后上传给服务器,然后由服务器的图像识别算法进行生成裁剪后的精灵与精灵身上的器官坐标点。
问题来了,客户端拍出来的照片太大,普遍是2M-5M,所以客户端拍出来的照片需要经过压缩才能上传给服务器。
在网上寻找图像压缩的解决方案,最终暂定有三种方案:
第一种方案
由于PC端运行时用的是DGI图像接口,不能调用System.Drawing库,所以暂时否定第一种方案
第二种方案
理论
第三种方案由于需要付费,并且服务器稳定性不可控,暂定为优先级最低的方案,目前正在研究第二种方案
⑵ unity图片压缩格式和内存计算
例子2:使用RGB ETC 4bit压缩,占用内存 = 0.5Bytes 512 512 = 128KB
一、2的N次方大小的图片会得到引擎更大的支持,包括压缩比率,内存消耗,打包压缩大小,而且支持的力度非常大。
二、减小图片的占用大小和内存方式有:图片大小变化(Maxsize),色彩位数变化(16位,32位),压缩(PVRC)。
三、U3D对于图片的格式是自己生成的,而并不是你给他什么格式,他就用什么格式,一张1024 1024图在无压缩格式下,它会被U3D以无压缩文件形式存放,也就是说U3D里的Texture Preview里显示的占用大小 *MB不只是内存占用大小,还是空间占用大小
U3D的内部机制为自动生成图片类型来替换我们给的图片,在图片的压缩方式上需要进行谨慎的选择。
压缩格式在U3D的Component Reference里有介绍我就不再详细介绍,只介绍几个重点的:
RGBA32格式为无压缩最保真格式,但也是最浪费内存和空间的格式。Automatic Turecolor和它一个意思。
RGBA16格式为无压缩16位格式,比32位节省一半的空间和内存。Automatic 16bits和它一个意思。
RGBA Compressed PVRTC 4bits格式为PVRTC图片格式,它相当于把图片更改了压缩方式新生成了一个图片来替换原来的我们给的图片格式(比如我们给的是PNG格式)。
注意:U3D所有图片的压缩格式都会以另一种方式来存储,不会以你给的方式来存储,只有你指定了某种格式,它才会转成你要的格式。而且压缩格式在Android里并不一定有效,因为Android的机型多,GPU的渲染方式也不一样,有的是Nvidia,有的是PowerVR,最最好的在安卓机子上启用RGBA16方式,因为这个是适应所有机型的,并且比32位占用量少一半,但也需要因项目而异,只是推荐使用的格式,可以多用,但要权衡内存和显示效果。
⑶ 打ab包时如何打需要更新的内容
AB分配策略:
确定如何将项目的资产划分为AssetBundles并不容易。关键决策是如何将对象分组到AssetBundles中。以下是unity手册提供的主要策略是:
1. 逻辑实体分组(Logical Entity Grouping)
例子
捆绑用户界面屏幕的所有纹理和布局数据
捆绑一个角色/一组角色的所有模型和动画
捆绑跨多个级别共享的场景片段的纹理和模型
最常用的策略:按功能出现需要的资源,将需要的资源捆绑到一个ab里,这样,加载该功能界面的时候,只要加载该ab就可以,如果功能比较复杂,可以视情况拆分粒度 逻辑实体分组是可下载内容(DLC)的理想选择,因为通过这种方式将所有内容分开,您可以更改单个实体,而无需下载其他不变的资产。
使用前提:开发人员必须精确地了解项目将在何时何地使用每种资产。
2. 类型分组(Type Grouping)
预制
音频
热更脚本
类型分组是构建供多个平台使用的AssetBundle的较好策略之一。
3. 并发内容分组(Concurrent Content Grouping)
每个关卡都包含完全独特的角色,纹理,音乐等
基于场景的包,每个场景束应包含大部分或所有场景依赖关系。
这些资产将同时加载和使用。
最后,无论您采用哪种策略,以下都是一些可以全面记住的其他提示:
将经常更新的对象与很少更改的对象分离
把需要同时加载的Asset尽量打包到同一个AB里。例如模型,其纹理和动画。
如果一次经常加载少于50%的捆绑包,请考虑将其拆分
如果您发现多个AssetBundle中的多个对象都依赖于完全不同的AssetBundle中的单个资产,请将依赖关系移至单独的AssetBundle。
根据依赖树进行的最优打包策略,公共资源单独打ab,独立资源打到一起。
如果不太可能同时加载两组对象(例如标准和高清资产),请确保它们位于自己的AssetBundle中。
考虑合并较小(少于5到10个资产)但经常同时加载其内容的AssetBundle
如果一组对象只是同一对象的不同版本,请考虑使用AssetBundle Variants
通常情况下,1M左右的AssetBundle包加载性能最好,冗余也可以接受,但是在Unity 5.3版本之后,对于AB文件的文件大小其实不必再限定于1MB之内。使用LZ4压缩,基于其Chunk的加载特点,AB加载很快,且内存占用要比之前小很多。所以LZ4的AB其实可以考虑更加粗粒度一些。
shader字体等其他细碎并且需要常驻内存的资源打包到一起,启动游戏的时候常驻内存。
根据项目实际需求将需要经常热更新的资源进行单独打包。
————————————————
版权声明:本文为CSDN博主原创
原文链接:https://blog.csdn.net/qq_39329287/article/details/122109028
⑷ Unity如何打包Apk能压缩资源
unity3d开发3d游戏,不可避免的要用到大量的模型、图片和其他资源。通吃一个游戏Apk包才几兆大小,但是资源却又几十兆上百兆,甚至几百兆。可以把apk单独发布,然后资源包单独拷贝到SD卡里面采用文件方式访问。但是这样操作比较麻烦。发布游戏如果采用这种方式,那受众可能接受不了。还有一种方式就是把资源包打包进APK包里面,这样发布的时候,用户只用安装一个Apk包就行了,但是这样带来的问题就是Apk包比较大。
那么怎么样把资源包打包进APK包里面呢?其实很简单,只要在项目文件夹里面新建一个StreamingAssets文件夹,将要打包的各种资源文件放到该目录下面就可以了。这样资源就被打包进Apk包里面的Assets文件夹里面了。这里面的资源通过什么目录访问呢,其实也挺简单 "jar:file://" + Application.dataPath + "!/assets" 就是访问该目录的路径,如果实在IOS平台,路径则是 Application.dataPath +"/Raw",这里面一定要注意文件路径大小写,这里面是区分大小写的,如果不注意这个问题,可能就会资源加载不了的问题。所以项目的命名规范一开始就要做好。
⑸ (转)Unity 图片压缩技巧
转自 移动设备压缩纹理使用技巧
压缩纹理能够节约不少内存空间,因此目前项目中UI全都是用Texture Packer打包出大图之后压缩。Unity导入纹理的默认设置是compress,在符合条件的情况下会优先使用PVR或ETC、否则会降为RGBA4444。从程序的角度来说,当然是1/4大小的压缩纹理更好啦~但是,毕竟是有损压缩,会带来一定的损失,有时候还是挺郁闷的。
第一个常见的问题是渐变颜色区域经过压缩之后会出现色阶,如下图所示。我参考了dither思路,用Photoshop加了一层0.3%的高斯分布杂音;可以看到ETC和PVR都有所改进,但是仔细盯着看依然能看到一些噪声。
另一个很常见的问题就是有杂色(下图绿色部分),本质是在某些block里边界混合了…解决方法就是非常粗暴的放大分辨率,可以看到当放大到2x大小的时候就完全没问题了。这个事情桌子很早也和我提过,压缩纹理的UI部分最好放大一些,当超采样来用…
顺便再提一句就是,新版本的Texture Packer里有了polygon布局,还能扣洞真是excited…
ps. 最早我们使用的是将原始图片拆分成RGB和Alpha Mask两张图的策略,然后替换默认的UI Shader。但是Unity-5.2开始默认将ETC2设为默认(顺便支持了ETC1 Compression for Sprite Atlases),所以我就懒得切图+每个Sprite拖材质球了…直接一张RGBA进行压缩完事儿
⑹ .unitypackage文件如何打开/解压缩
.unitypackage文件是unity项目导出的包文件,包内包含项目的所有文件及文件结构。
如何打开/解压缩?
步骤一、使用unity IDE创建你一个空的3D项目
步骤二、拖动.unitypackage文件到Unity IDE里Project窗口的Assets文件加下,如下图:
步骤三、在弹出的窗口底部点击 import按钮
步骤四、成功打开