Corona中文站

强大、易学的跨平台(iOS/Android)开发框架。QQ群1:74390406(满) 群2:221929599

导航

App应用程序高效压缩的N种方案
方案一:
使用高效的png图片压缩软件,先对所有图片进行一次瘦身。

这里推荐一款Mac下的图片压缩软件--ImageOptim。方便试用,只要简单的把要压缩的文件或者文件夹拖到软件里,它就会自动压缩。
注意:1。不用特意去塞选,因为它会自动识别文件格式,非图片格式的它不会进行处理,所以不用担心,尽管拖!~

2。压缩的时候它会覆盖原文件,所以担心原文件损坏的童鞋,请自己注意备份。不过到目前为止,没有发现它有什么问题。

3。压缩之后的图片可能会出现无法预览的情况,不用担心,照样编译,照样成功!

4。压缩率的问题还要看具体的图片文件而定,一般情况平均压缩率在50%以上,最高的见过94%的。哈~

5。最后提醒一点,可以反复对一系列图片进行多次压缩,以寻求最大压缩率,压到不能再压缩的时候会显示“X”,所以请放心使用!


方案二:
对音乐音效进行降噪处理,还有注意使用的音乐格式!

音乐这块我并不在行,所以不便多评,现在市面上音乐处理软件很多,功能也异常强大。处理建议就是,用尽一切方法让他变小,

只要自己听的不难受就好!


注:我们自己项目中音乐文件本来有20M多。后来经过一系列处理后只有800K!!更重要的是,一般人根本没听出差别!
所以音乐压缩非常有必要!!


方案三:
在以上两点都处理过后,如果还没有达到您的要求。(如,处理后大小21M左右,差一点咯!)可以进行最后一步,也是技术性的压缩。
使用Zip压缩技术,对资源文件中的图片及音乐进行压缩。


首先下载一个zip开源类,网上很多。我用的是--ZipFile-OC。好像也叫minizip。这个开源类是专门针对Obj-C写的。封装的比较好,用法很简单。
(http://linglong117.blog.163.com/blog/static/277145472009101814159283/)转至云水蝉心的日志。该日志介绍了两种zip方法,我使用的是第二种。
文章末尾有附上ZipFile-OC的下载。具体的就不再重复啦。请看原著。~在此也鸣谢云水蝉心。

下面主要说下如何实现压缩资源。


先来看下,Xcode是如何处理Resources中的文件的,只要在工程中找到编译好的app文件,右键显示包内容,就会发现,Xcode在编译的时候会将 Resources里的文件,一个个从各自的文件夹中取出来复制到app中供程序调用。

而我们要做的就是将这些文件事先取出并压缩成zip。然后删除原有的资源,将压缩后的zip文件放入Resources进行编译。注意,不可有文件夹,所有的图片及音乐都必须在同一个目录下被压缩。

这里我们会遇到一个问题,那就是如何在程序读取这些图片的时候,把他们解压出来呢?
注意一个问题,苹果是不运行开发者在程序中修改app文件的。所以必须找一个可修改的文件夹存放解压出来的文件。那就是Document的文件夹(每个应用都有次文件夹)。

只要在程序读取资源之前(这个位置取决于你程序代码如何写,应该不用我多说吧),解压所需的资源文件到Document目录下,然后修改读取资源的地址即可。

为方便新手理解。附上代码。以一个Cocos2d框架的游戏为例。
在以下函数开头加入Zip代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; //前两句为获取Documents在真机中的地址
NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"/某一个资源名"];
//获取某一个资源解压之后的地址,特别注意“/”不可少。 该文件地址将作为判断资源是否压缩过的依据,以免重复解压。

NSData* data = [ NSData dataWithContentsOfFile:imagePath];

if(data == NULL) //如果标志文件不存在,则表面程序第一次运行,则解压所需资源文件,若存在则跳过。
{

NSString *loadImagePath = [[documentsDirectory substringToIndex:documentsDirectory.length-9] stringByAppendingPathComponent:@"项目名(Product Name)/ 压缩文件名(*.zip)"];//获取资源中的压缩文件

ZipArchive *za = [[ZipArchive alloc] init];

if( [za UnzipOpenFile:loadImagePath] ) //解压
{
BOOL ret = [za UnzipFileTo:documentsDirectory overWrite:YES];
if( NO==ret )
{
}
[za UnzipCloseFile];
}

[za release];

}
/*省略其余代码*/
return Yes;
}



大家不用担心这个解压过程会很长,粗略估计20M的压缩文件耗时不到3秒,而且只需程序第一次运行时等待,之后就不会再解压。


剩下要做的就是修改原本的资源路径。这里不知道能否再Xcode中直接修改。


我们采用的是最直接也许最笨的方法,就是直接修改图片及音乐处理的底层类。还是拿cocos2d为例。


在TextureMgr.m类中修改addImage(-(Texture2D*) addImage: (NSString*) path;)方法。只要在前面加上以下三句话。



NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
path = [[documentsDirectory stringByAppendingPathComponent:@"/"] stringByAppendingPathComponent:path];
这三句话的作用就是在一个文件名前面加上Documents文件夹的路径。



注意:1。切勿将icon.png/*.plist/Defalut.png等系统及框架资源放入压缩包。
2。若已使用前两种方案,则此方案可压缩的效率有限。


最后说一种方案。
那就是苹果自带的zip压缩。这可能很多发布过项目的朋友就会知道,在发布前,要将app文件压缩成zip后方可上传。而这一步至少可以剩下6M的空间。


注:在实际操作的时候发现,如果一个项目压缩成zip之后有20M,那么发布之后,会变成21.2M左右。这多出来的1.2M不知是否是苹果在其中放了什么所致呢?
<< iAd测试及代码示例iAP(应用内购买)完全攻略 >>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 Copyright 2011-2015 BuildApp.Net. All Rights Reserved.