用分布式压缩贴图加快 Unity3D 的打包过程
来源:互联网 发布:昆山启航cnc编程培训 编辑:程序博客网 时间:2024/06/04 20:00
U3D 的打包流程,谁用谁知道。
由于输出 ios 包必须在 xcode 环境,跑在 Mac 系统上,所以为了定期版本打包,我们采购了配置比较高的垃圾桶来做。一台大约要三万 RMB 左右。
但我觉得这个方案的性价比太低了。
经过简单的考察,我发现,打包流程中最慢的环节是贴图压缩。在不同的平台,需要把原始贴图文件压缩成对应平台的压缩贴图格式: ios 平台对应的是 PVR 压缩格式;Android 平台对应的是 ETC 压缩格式,等等。
u3d 自己也意识到压缩贴图太慢,所以官方给出了一个 CacheServer 方案。
本质上 CacheServer 只是一个文件 cache 服务器,它记录了用贴图原文件和转换参数(u3d 的 meta 文件)以及转换器版本等信息构成的串的 md5 值作为文件的索引。
第一个做转换的人,在本地压缩完毕后,会将结果上传到 CacheServer ,然后后面的人需要做相同的压缩时,去 CacheServer 查找是否之前有人做过同样的工作,避免重复操作。
当源文件相同、转换参数也完全一样时,结果会被缓存。由于日常几乎所有贴图都被人压缩过,这样极大的减少了定期打包的时间。
CacheServer 的设计虽然简单,却不能最好的解决问题。实际打包时,还是需要很长的时间。这是因为,定期打包需要输出各个平台的包,而日常开发只会稳定在一个平台上。比如日常工作使用的都是 Android 平台的话,等打 ios 包时,依旧需要压缩 pvr 贴图。
CacheServer 只做结果缓存,所以不可能在 Server 那里针对源图自动做多个版本的压缩格式;而且它保存的是转换参数的 hash 值,丢失了参数信息。btw,它的实现也是非常粗糙的。
U3D 转换图片的另一个问题是,导入贴图时会在本地机器上进行大量的贴图压缩工作,这个工作是极耗 CPU 的,把工作机卡上几秒不能动弹是常用的事,非常影响工作心情。
综上,我想实现一个远程压缩贴图的方案。
U3D 调用的是一个叫作 PVRTexTool 的命令行工具压缩贴图的。这是 PowerVR 公司提供的官方工具,幸运的是,它有 Linux 版本。这样我们就可以有办法用廉价的 linux 服务器来做这件事情,而不必采购昂贵的 Mac 垃圾桶。
最简单的方案是替换掉本地的 PVRTexTool 命令行工具,将源贴图上传到远程服务器,然后远程调用该工具压缩贴图,最后再把结果文件传回来。
做过改造之后,打包流程中最消耗 CPU 的工作就被转移走了。经过简单的测试,配合一个性能并不算强的 8 核服务器辅助压缩贴图,在 Mac Mini 上打包也可以比 4 核的垃圾桶工作站快上 30% 。而实际使用时,可以用采购垃圾桶一半的钱买到性能高几倍的 32 核服务器。
更重要的是,这个远程打包服务,还记录了每次压缩贴图请求的原始图片和压缩参数。我们可以写一个脚本,安排在夜间运行,找出白天提交的压缩请求,把命令行中的 -f 参数换掉(控制生成何种平台的压缩格式),为每个平台的压缩格式都生成一次。这可以解决只用 CacheServer 不能自动生成全平台压缩贴图的问题。
除了打包机外,开发人员的桌面开发机也可以部署这个工具,提高导入图片的使用体验(不再依靠本地工具压缩图片,不会因为导入贴图而卡住工作机)。
- 用分布式压缩贴图加快 Unity3D 的打包过程
- 用分布式压缩贴图加快 Unity3D 的打包过程
- UNITY3D 贴图格式压缩说明
- [转载][Unity3D]关于U3D贴图格式压缩
- [Unity3D]关于U3D贴图格式压缩
- unity3d 代码改变贴图压缩格式
- [Unity3D]关于U3D贴图格式压缩
- Unity3D的坑系列:打包Assetbundle丢失Shader问题(贴图显示不了)
- 用 HTTP 压缩加快 Web 数据的发送
- Unity3D的纹理贴图循环运动
- 关于unity3d纹理贴图的学习总结
- unity3D 法线贴图的制作与使用
- Unity贴图压缩格式的选择
- Unity3d的Assetbundle打包
- unity3d 凹凸贴图、法线贴图、置换贴图
- 文件的压缩打包
- 如何加快Windows的安装过程
- 加快Linux智能手机的起动过程
- mysql 数据库导入\导出(总结备忘)
- Eclipse更改svn地址
- dubbo初步使用[初识]
- 剑指offer经典编程(五)
- Android--资源导致部分机型的兼容性
- 用分布式压缩贴图加快 Unity3D 的打包过程
- android webview点击返回键返回上一个html
- Android对应用自身评分+app分享
- Android-在子线程中显示Toast和Dialog
- 金融相关
- 阿里云配置mysql远程连接
- nodejs开发 express路由与中间件
- spring Bean使用案例 静态方法方式 和工厂模式
- Java怎样快速分出一个数组中相同元素的下标