Clash of Clans,简称为COC,中文名《部落冲突》,是ios平台上一款相当火爆的战斗策略类游戏,开发商是芬兰的supercell,据说日收入上百万美刀,创造了手游史上的一个神话。

不管在画质,玩法,操作体验,玩家交互等上面,COC都做得相当极致,是普通手游开发商所不及的。

好了,废话到此为止,今天主要是给大家分享一下其资源压缩中的秘密:

COC的安装程序总大小不到50M,却能呈现这么好的画质,不管在低端的iphone、ipad设备,还是视网膜屏的设备上,画质依然那么好。这其中到底采用了什么NB的技术呢?

其实,答案很简单,它的资源是使用了修改的LZMA压缩算法进行压缩的,或许,你对LZMA压缩算法不了解,但是应该知道7-zip这款压缩工具,或者linux下新兴的高压缩比的xz压缩工具,事实上,7-zip的压缩默认是采用LZMA压缩算法的,linux下的xz相当于LZMA的升级版。

标准的LZMA压缩文件的文件头由5+8个字节组成,其中前5个字节中存储了压缩方式,字典大小等信息,后8个字节为压缩前的文件大小;COC所使用的修改后的LZMA算法,其文件头由5+4个字节组成,跟标准算法相比,仅仅是将表示压缩前的文件大小那8个字节,改成了4个字节(对于游戏资源,4个字节能表示的文件大小已经足够用了),这样一来,使用标准的LZMA压缩算法的解压工具,都不能正常解压(因为绝大多数情况下取出来的压缩前的文件大小会相当大),这样一来,通过简单的修改,既能较好的压缩游戏资源,又能较好的保护资源不被别人直接解压,真的是很高明。

如果要使用标准LZMA算法的解压工具能正确解压COC中的资源,只要在第9个字节后面插入4个0字节,如loading.sc文件,其前13个字节如下:

0x5D 0x00 0x00 0x04 0x00 0x2F 0xC9 0x42 0x00 0x00 0x07 0xFF 0xFD

在第9个字节后插入4个0字节,得到如下格式:

0x5D 0x00 0x00 0x04 0x00 0x2F 0xC9 0x42 0x00 0x00 0x00 0x00 0x00 0x00 0x07 0xFF 0xFD

保存,便可用7-zip等工具解压了。

压缩后的资源文件总大小约为35.7M, 解压出来的资源文件总大小约为195M,其压缩比达18.3%,把这项技术用于手游项目,无疑会给你的游戏加分!!!

附一段简单PHP的解压代码:

<?php
define('DS', DIRECTORY_SEPARATOR); function fixFile($filename) {
echo "Begin fix {$filename} ... \n";
$dataStr = file_get_contents($filename);
$newDataStr = substr($dataStr, 0, 9) . "\x00\x00\x00\x00" . substr($dataStr, 9);
$newFilename = str_replace('.sc', '.lzma', $filename);
file_put_contents($newFilename, $newDataStr);
echo "Fix {$filename} OK!\n\n";
} // $dir = dirname(__FILE__); // 中文路径取不到?
$dir = substr(__FILE__, 0, -1 * (strlen(basename(__FILE__)) + 1));
$zipFileArr = glob($dir . DS . 'Clash of Clans*.ipa');
foreach ($zipFileArr as $zipFile) {
echo "Begin extract {$zipFile} ...\n";
$zip = new ZipArchive();
if ($zip->open($zipFile) === TRUE) {
$extractPath = str_replace('.ipa', '', $zipFile);
if (!file_exists($extractPath)) {
mkdir($extractPath);
}
$zip->extractTo($extractPath);
$zip->close();
echo "Extract to {$extractPath} OK!\n\n"; $scPath = $extractPath . DS . 'Payload' . DS . 'Clash of Clans.app' . DS . 'res' . DS . 'sc';
$scFileArr = glob($scPath . DS . '*.sc');
foreach ($scFileArr as $scFile) { // 修复
fixFile($scFile);
}
$exePath = 'D:\Program Files (x86)\7-Zip\7z.exe';
if (file_exists($exePath)) {
$cmd = sprintf('"%s" e -y -o"%s" "%s"', $exePath, $scPath, $scPath . DS . '*.lzma');
echo "{$cmd}\n";
passthru($cmd);
}
$cmd = "%SystemRoot%\explorer.exe /e,{$scPath}";
passthru($cmd);
} else {
echo "Extract {$zipFile} fail!\n";
}
}

将COC的ipa安装文件放到脚本所在目录,需要安装7-zip,具体目录参看代码。

Clash of Clans(COC)资源压缩解密的更多相关文章

  1. Genymotion——PC上也能玩部落冲突 Clash of Clans

    零.前言 部落冲突(Clash of Clans)是手机上一个很不错的联机对战游戏,安卓和iOS平台上都有. 最近玩这个略上瘾,前几天看到部落里有人说用模拟器可以在电脑上玩,就想自己试试. 不想看我啰 ...

  2. FIS常用功能之资源压缩

    fis server start后 资源压缩,只需要使用命令,不需要添加任何配置 fis release --optimize 或: fis release -o 在浏览器访问按F12,观看压缩前后文 ...

  3. Node.js实战--资源压缩与zlib模块

    Blog:<NodeJS模块研究 - zlib> Github:https://github.com/dongyuanxin/blog nodejs 的 zlib 模块提供了资源压缩功能. ...

  4. plain framework 1 pak插件说明(资源压缩加密)

    在互联网的发展中,资源的整理一般成了发布软件应用的迫在眉睫的一件事情,不经打包的资源往往容易暴露而且众多的文件使得拷贝等待时间变长.在这种情况下,一种应用便诞生了,其起源是源自压缩软件,这便是我们今天 ...

  5. Node基础:资源压缩之zlib

    概览 做过web性能优化的同学,对性能优化大杀器gzip应该不陌生.浏览器向服务器发起资源请求,比如下载一个js文件,服务器先对资源进行压缩,再返回给浏览器,以此节省流量,加快访问速度. 浏览器通过H ...

  6. ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤

    务实直接上代码: 1. 重写FilterModule.cs using System; using System.Collections.Generic; using System.Linq; usi ...

  7. 静态资源压缩(GZIP) 专题

    1.开GZIP有什么好处?答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度.Tips:如果网站的用户分布比较分散,并且静态文件过大,可以将 ...

  8. tar命令加密压缩/解密解压

    在tar解压文件时发生下面错误信息 gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not rec ...

  9. NodeJS学习笔记 (1)资源压缩-zlib(ok)

    原文: https://github.com/chyingp/nodejs-learning-guide/blob/master/README.md 自己的跟进学习: 概览 做过web性能优化的同学, ...

随机推荐

  1. Tcp实现简单的大小写转换功能

    有这样一个需求: 客户端给读物段发送文本,服务端会将文本转换为大写再返回客户端 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束. 分析: 既然是操作设备上的数据,那么久可以使用io ...

  2. 深入理解Scala的隐式转换系统

    摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码.   使用方式: 1. ...

  3. Oracle 事务的開始与结束

    事务是用来切割数据库活动的逻辑工作单元,事务即有起点,也有终点: 当下列事件之中的一个发生时,事务就開始了: 连接到数据库上,并运行了第一天 DML 语句: 当前一个事务结束后,又输入了另外一条 DM ...

  4. ThinkPHP实现跨模块调用操作方法概述

    ThinkPHP实现跨模块调用操作方法概述 投稿:shichen2014 字体:[增加 减小] 类型:转载   使用 $this 可以调用当前模块内的方法,但是很多情况下经常会在当前模块中调用其他模块 ...

  5. 国内外移动端web适配屏幕方案

    基础知识点 设备像素:设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点. iPhone5的物理像素是640X1136. PS: ...

  6. 07_DICTIONARY_ACCESSIBILITY

    07_DICTIONARY_ACCESSIBILITY 控制对系统权限的限制: TRUE 有相应系统权限,允许访问SYS下的对象. FALSE 确保拥有可以访问任何对象的系统权限,但不可以访问SYS下 ...

  7. nopCommerce架构分析系列(二)数据Cache

    原文(http://www.cnblogs.com/gusixing/archive/2012/04/12/2443799.html)非常感谢作者顾思行的分享! 序言 在很多访问量较大的系统中,尤其在 ...

  8. 改进的简单Tooltips显示

    使用js简单改进了Tooltips的显示效果,可进一步使用CSS对改进的Tooltips进行美化. 前台布局代码: <asp:Panel ID="Panel1" runat= ...

  9. redhat换yum源

    根据redhat操作系统版本及位数,下载对应centos的版本及位数的这些包: yum-3.2.22-40.el5.centos.noarch.rpm yum-fastestmirror-1.1.16 ...

  10. Cocoapods依赖管理

    对于iOS App的开发,几乎都采用了Cocoapods来管理第三方库,那么对于开发人员来说,这是必备技能,必须要掌握如何使用.这篇文章就是介绍如何安装和使用CocoaPods的. 简单来说,就是专门 ...