手机游戏都是几百KB的,上MB的很少,有100MB,可以尽情玩了~推荐几款我认为不错的免费手机游戏:聊斋之七情六欲破解版(RPG) /gameinfo.aspx?id=3 彩虹城堡之七彩宝石篇(RPG) /gameinfo.aspx?id=1诛仙之英雄出世破解版(RPG)/gameinfo.aspx?id=34天剑奇侠传免费版(RPG)/gameinfo.aspx?id=4真三国无双之赵云传破解版(动作) /gameinfo.aspx?id=2 米格西游记2三打百骨精(动作) /gameinfo.aspx?id=20 正版雷电3豪华版(射击) /gameinfo.aspx?id=12机械暴乱(射击)/gameinfo.aspx?id=7四人麻将单机版(棋牌) /gameinfo.aspx?id=13皮皮猪斗地主(棋牌)/gameinfo.aspx?id=513D疯狂过山车(超级有趣的) /gameinfo.aspx?id=8疯狂龙卷风汉化版(趣味)/gameinfo.aspx?id=25三国志吞食天地(动作)/gameinfo.aspx?id=28刀剑风云斩II-至尊格斗(动作)/gameinfo.aspx?id=17周星星功夫台球(运动)/gameinfo.aspx?id=44乐高赛车(运动)/gameinfo.aspx?id=40极品飞车生死卡本谷(运动)/gameinfo.aspx?id=35漆黑惊栗(恐怖)/gameinfo.aspx?id=65火焰之纹章2纹章之谜破解版(策略)/gameinfo.aspx?id=66帝国时代2(策略)/gameinfo.aspx?id=36百鬼商店破解版(策略)/gameinfo.aspx?id=56超级玛利奥兄弟(经典)/gameinfo.aspx?id=69祖玛(休闲)/gameinfo.aspx?id=23
其它2条***
附近的朋友等待您的帮助
包打听移动版游戏发布后大小跟哪些因素有关?(第一部分)
招聘信息:
本文源自社区会员yazi2wuliu的一个提问。
&我的一个游戏,看了这个文件的属性,大小也才100M。但是发布上线后,却多了50多M,不知道是从哪里多出来的?请问谁知道这个问题?
另外如何才能最大化的减小游戏的大小。在处理图片上我用的是zwoptex工具。网上说texturepacker工具更好。但我试了试,它生成的pvr.ccz文件(5.7M)比zwoptex生成的png文件(4.3M)还要大。不知道是不是我哪里设置有问题。还有其他方法能处理图片吗?&
子龙山人的博文很好地解答了这个问题。
如何优化cocos2d程序的内存使用和程序大小:第一部分
在我完成第一个游戏项目的时候,我深切地意识到&使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰&。而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个非常有意义的话题:&&这个问题的***很多,有人讲是&如何加载和保存游戏数据&,有人讲的是&如何实现有限状态机&等等。而最吸引我的则是,有一个人讲到,新手cocos2d程序员或者新手cocoa程序,他们所遇到的80%的问题都与内存相关。
因为有着c/c++背景的我,看到这句话的时候,很是赞同,因此刚开始cocos2d编程的时候格外注意内存方面的问题。即便如此,在我完成自己第一个游戏的过程中,还是遇到了大量的内存问题,它们让我头疼,让我睡不着觉。庆幸的是,我通过社区都找到了***并且解决了我的问题。
我在这篇博文中也讲述过一些内存方面的使用心得。但是,不够具体,我当时想讲的内容有很多。因为有些难以用文字具象化,我也就偷了一回懒了。这次,当我看到Steffen Itterheim写了两篇这么经典的优化cocos2d内存使用和程序大小的文章之后,我有一种&于我心有戚戚焉&的感觉。我迫不及待地想跟大家分享,可惜很多人抱怨说访问不了,被墙了等等。可能也有一些同行,对E文不是很感冒。趁着周末,我花一个下午的时间,给大家翻译一下,与大家共勉。
全文如下:
我目前正完成我的最后一个合约项目。在这个项目的最后阶段,我需要考虑的一件事情就是如何优化游戏的内存使用。
在今天的文章中,我将向大家讲述,我是如何减少25-30MB游戏内存消耗的(现在游戏消耗内存90-95MB,我还通过这个过程,消除了一些由于内存警告而引起的程序崩溃问题)。同时,我还将游戏程序的大小从25MB减少到了20MB以下(如果苹果没有在不久前将蜂窝网下载应用的限制从20MB提高到50MB的话,那么我这个小的优化就太棒了,它可以潜在地给我带来更多的下载量)。
我还会给大家介绍,如何在你加载游戏资源的时候展示一个带有动画的Loading界面,我还会加入一些最佳实践和小技巧。
什么消耗了90%的内存?
大家猜一下:)
在大部分情况下,是纹理(textures)消耗了游戏程序大量的内存。因此,纹理是我们首要考虑优化的对象,特别是当你碰到内存警告的问题的时候。
避免一个接一个地加载PNG和JPG纹理(他们之间至少等待一帧)
cocos2d里面纹理加载分为两个阶段:1.从图片文件中创建一个UIImage对象。2.以这个创建好的UIImage对象来创建CCTexture2D对象。这意味着,当一个纹理被加载的时候,在短时候内,它会消耗两倍于它本身内存占用的内存大小。(译注:为什么只是短时间内呢?因为autoRelease pool和引用计数的关系,临时创建的UIImage对象会被回收。)
当你在一个方法体内,接二连三地加载4个纹理的时候,这个内存问题会变得更加糟糕。因为在这个方法还没结束之前,每一个纹理都会消耗两倍于它本身的内存。
我不是很确定,现在的cocos2d是否仍然如此。或者这种情况是否只适用于手工引用计数管理,或许ARC不会如此呢?我习惯于按顺序加载纹理,但是在加载下一个纹理之前要等待一帧。这将会使得任何纹理加载的消耗对内存的压力降低。因为等待一帧,引用计数会把临时的UIImage对象释放掉,减少内存压力。此外,在后续的文章中,如果你想在背景线程中按序加载纹理的话,也可以采用这种方法。
不要使用JPG图片!
cocos2d-iphone使用JPG纹理的时候有一个问题。因为JPG纹理在加载的时候,会实时地转化为PNG格式的纹理。这意味着cocos2d-iphone加载纹理是非常慢的,而且JPG纹理将消耗三倍于本身内存占用大小的内存。
一个大小的纹理会消耗16M的内存。当你加载它的时候,在短时间内,它将消耗32MB内存。现在,如果这个图片是JPG格式,你会看到这个数字会达到48MB,因为额外的UIImage对象的创建。虽然,最终内存都会降到16M,但是,那一个时刻的内存飙高,足以让os杀死你的游戏进程,造成crash,影响用户体验。
JPG不论在加载速度和内存消耗方面都很差。所以,千万不要使用JPG!
忽视文件图片大小
这种情况,我见到很多。它乍听起来可能觉得有点荒诞,但事实如此,因为它需要关于文件格式的知识,而这些知识并不是每一个程序员都了解的。我经常听到的论断就是&嘿!我的程序不可能有内存警告,我所有的图片资源加起来还不到30MB!&。
怎么说呢,因为图片文件大小和纹理内存占用是两码事。假设他们是帐篷。图片文件就相当于帐篷被装在行李箱。但是,如果你想要使用帐篷的话,它必须被撑起来,被&膨胀&。
图片文件和纹理的关系与此类似。图片文件大多是压缩过的,它们被使用的话必须先解压缩,然后才能会GPU所处理,变成我们熟知的纹理。一个的png图片,采用32位颜色深度编码,那么它在磁盘上占用空间只有2MB。但是,如果变成纹理,它将消耗16MB的内存!
当然,减少纹理占用内存大小是有办法滴。
使用16-bit纹理
最快速地减少纹理内存占用的办法就是把它们作为16位颜色深度的纹理来加载。cocos2d默认的纹理像素格式是32位颜色深度。如果把颜色深度减半,那么内存消耗也就可以减少一半。并且这还会带来渲染效率的提升,大约提高10%。
你可以使用CCTexture2D对象的类方法来更改默认的纹理像素格式,代码如下:
这里有个问题:首先,纹理像素格式的改变会影响后面加载的所有纹理。因此,如果你想后面加载纹理使用不同的像素格式的话,必须再调用此方法,并且重新设置一遍像素格式。
其次,如果你的CCTexture2D设置的像素格式与图片本身的像素格式不匹配的话,就会导致显示严重失真。比如颜色不对,或者透明度不对等等。
有哪些比较有用的纹理像素格式呢?
RGBA8888是默认的格式。对于16位的纹理来说,使用RGB565可以获得最佳颜色质量,因为16位全部用来显示颜色:总共有65536总颜色值。但是,这里有个缺点,除非图片是矩形的,并且没有透明像素。所以RBG565格式比较适合背景图片和一些矩形的用户控件。
RBG5A1格式使用一位颜色来表示alpha通道,因此图片可以拥有透明区域。只是,1位似乎有点不够用,它只能表示32768种可用颜色值。而且图片要么只能全部是透明像素,或者全部是不透明的像素。因为一位的alpha通道的缘故,所以没有中间值。但是你可以使用fadein/out动作来改变纹理的opacity属性。
如果你的图片包含有半透明的区域,那么RBGA4444格式很有用。它允许每一个像素值有127个alpha值,因此透明效率与RGBA8888格式的纹理差别不是很大。但是,由于颜色总量减少至4096,所以,RBGA4444是16位图片格式里面颜色质量最差的。
现在,你可以得到16位纹理的不足之处了:它由于颜色总量的减少,有一些图片显示起来可能会失真,而且可能会产生&梯度&。
使16位纹理看起来更棒
幸运的是,我们有。(后面简称TP)
TP有一个特性叫做&抖动&,它可以使得原本由于颜色数量减少而产生的失真问题得到改善。
特别是在拥有Retina显示的像素密度下,你几乎看不出16位与32位的纹理之间的显示差别。当然,前提是你需要采用&抖动&算法。
cocos2d默认的颜色深度将会把所有的纹理都渲染到16位的color framebuffer里面,然后再显示到你的设备屏幕上面。既然这样,我们为什么不把所有的纹理的格式都弄成16位呢,32位又有什么用呢?反正它本来就会渲染到16位的framebuffer上去的。这个问题有点太底层了,我不想深挖下去,而且我也不适合解释这个问题。(译者:哈哈,知之为知之,不知为不知)
使用NPOT纹理
NOPT是&non power of two&的缩写,译作&不是2的幂&。NPOT stands for &non power of two&. 在cocos2d1.x的时候,你必须在ccConfig.***件中开启对NPOT的支持,但是,cocos2d 2.x就不需要了,它默认是支持NPOT的。所有3代(iphone 3GS)以后的ios设置都支持cocos2d 2.x(因为它们支持OpenGL ES2.0),所以也都能支持NPOT纹理。
如果纹理图集(texture atlas)使用NPOT的纹理,它将有一个具大的优势:它允许TP更好地压缩纹理。因此,我们会更少地浪费纹理图集的空白区域。而且,这样的纹理在加载的时候,会少使用1%到49%左右的内存。而且你可以使用TP强制生成NPOT的纹理。(你只需要勾选&allow free size&即可)
为什么要关心NPOT呢?因为苹果的OpenGL驱动有一个bug,导致如果使用POT的纹理,则会产生。
默认使用PVR格式的纹理
TP让你可以创建PVR格式的纹理。除了PVR纹理支持NPOT外,它们不仅可以不是2的幂,而且还可以不是方形的。
PVR是最灵活的纹理文件格式。除了支持标准的未压缩的RGB图片格式外,不支持有损压缩的pvrtc格式。另外,未压缩的pvr格式的纹理的内存消耗非常地低。不像png图片那样要消耗2倍于本身内存占用大小的内存,pvr格式只需要消耗纹理本身内存大小再加上一点点处理该图片格式的内存大小。
pvr格式的一个缺点就是,你不能在Mac上面打开查看。但是,如果你***了TP的话,就可以使用TP自带的pvr图片浏览器来浏览pvr格式的图片了。(强烈建议大家购买TP,支持TP,不要再盗版了)
使用PVR格式的文件几乎没有缺点。此外,它还可以极大地提高加载速度,后面我会解释到。
使用pvr.ccz文件格式
在三种可选用的pvr文件格式中,优先选择pvr.ccz格式。它是专门为cocos2d和TP设计的。在TP里面,这是它生成的最小的pvr文件。而且pvr.ccz格式比其它任何文件格式的加载速度都要快。
当在cocos2d里面使用pvr格式的纹理时,只使用pvr.ccz格式,不要使用其它格式!因为它加载速度超快,而且加载的时候使用更少的内存!
当视觉察觉不出来的时候,可以考虑使用PVRTC压缩。
PVR纹理支持PVRTC纹理压缩格式。它主要是采用的。如果拿PVRTC图片与JPG图片作对比的话,它只有JPG图片中等质量,但是,最大的好处是可以不用在内存里面解压缩纹理。
这里把32位的png图片(左边)与最佳质量的PVRTC4(4位)图片(点击图片查看完整的大小)作对比:
(注意,在一些高对比度的地方,明显有一些瑕疵。有颜色梯度的地方看起来还好一点。)
PVRTC肯定不是大部分游戏想要采用的纹理格式。但是,它们对于粒子效果来说,非常适用。因为那些小的粒子在不停地移动、旋转、缩放,所以你很难看出一些视觉瑕疵。
PVRTC压缩图片格式
TP提供的PVR格式不仅有上面两种,还包括TC2和TC4这两种没有alpha通道的格式。
这里的alpha和16位纹理的alpha是一样的。没有alpha通道意味着图片里面没有透明像素,但是,更多的颜色位会用来表示颜色,那么颜色质量看起来也会更好一些。
有时候,PVRTC图片格式指的是使用4位或者2位颜色值 ,但是,并不完全是那样。PVRTC图片格式可以编码更多的颜色值。
预先加载所有的纹理
就像标题所说,尽你所能,一定要预先加载所有的纹理。如果你的所有的纹理加起来不超过80MB内存消耗的话(指的是拥有Retina显示的设备,非Retina的减半考虑),你可以在第一个loading场景的时候就全部加载进来。
这样做最大的好处在于,你的游戏体验会表现得非常平滑,而且你不需要再担心资源的加载和卸载问题了。
这样也使得你可以让每一个纹理都使用合适的纹理像素格式,而且可以更方便地找出其它与纹理无关的内存问题。因为如果与纹理有关,那么在第一次加载所有的纹理的时候,这个问题就会暴露出来的。如果所有的纹理都加载完毕,这时候再出现内存问题,那么肯定就与纹理无关了,而是其它的问题了。
如果你知道问题与纹理无关的话,那么你查找剩下的内存问题将会变得更加简单。而且你避免了前面说的这种情况:当的纹理加载的时候,它本来只需要消耗16MB内存,但是短时间会冲到32MB内存。后面会提出一种方法来解决&间歇性内存飙高&(&译者发明滴&)的方法。(译者:希望下次开发者的对话中&间歇性内存飙高&的说法会出现,呵呵)
按照纹理size从大到小的顺序加载纹理
由于加载纹理时额外的内存消耗问题,所以,采用按纹理size从大到小的方式来加载纹理是一个最佳实践。
假设,你有一个占内存16MB的纹理和四个占用内存4MB的纹理。如果你首先加载4MB的纹理,这个程序将会使用16MB的内存,而当它加载第四张纹理的时候,短时间内会飙到20MB。这时,你要加载16MB的那个纹理了,内存会马上飙到48MB(4*4 + 16*2),然后再降到32MB(4*4 + 16)。
但是,反过来,你先加载16MB的纹理,然后短时候内飙到32MB。然后又降到16MB。这时候,你再依次加载剩下的4个4MB的,这时,最多会彪到(4*3 + 4*2 + 16=36)MB。
在这两种情况下,内存的峰值使用相差12MB,要知道,可能就是这12MB会断送你的游戏进程的小命哦!
避免在收到内存警告消息的时候清除缓存
我有时候看到了一种奇怪的&自己开***打自己的脚&的行为:纹理已经全部在Loading场景里面加载完毕了,这时候,内存警告发生了,然后cocos2d就会把没有使用的纹理从缓存中释放掉。
听起来不错,没有使用到的纹理都被释放掉了,但是!。。。
你刚刚把所有的纹理都加载进来,还没有进入任何一个场景中(此时所有的纹理都被当作&unused&),但是马上被全部从texture cache中移除出去。可是,你又需要在其它场景中使用它们。怎么办?你需要接着判断,如果有纹理没有加载,就继续加载。但是,一加载,由于&间歇性内存飙高&,又马上收到了内存警告,再释放,再判断,再加载。。。。 我的天,这是一个死循环啊!这也能解释为什么有些童鞋,在loading场景完了之后进入下一个场景 的时候很卡的原因了。
现在,当我收到内存警告的时候,我的做法是----什么也不做。内存警告仍然在发生,但是,它只是在程序刚开始加载的时候。我知道这是为什么,因为&间歇性内存飙高&嘛,所以,我不去管它。(但是,如果是游戏过程中再收到内存警告,你就要注意了,因为这时候可能你有内存泄漏了!!!)
我有时候会想办法改善一下,通过移除掉一些不使用的纹理和一些只有在很特殊的场景才会使用的图片(比如settings界面,玩家是不经常访问的)。然后,不管什么时候,当我需要某张图片的时候,我会首先检查一下该sprite frame是否在cache中,如果没有就加载。你会在后面看到具体的做法。
理解在什么时候、在哪里去清除缓存。
不要随机清除缓存,也可以心想着释放一些内存而去移除没有使用的纹理。那不是好的代码设计。有时候,它甚至会增加加载次数,并多次引发&间歇内存飙高&。分析你的程序的内存使用,看看内存里面到底有什么,以及什么应该被清除,然后只清除该清除的。
你可以使用方法来观察哪些纹理被缓存了:
这个方法的输出如下:(为了清楚起见,我把那些与-hd后缀有关的信息屏蔽掉了)
上面包含了非常多有用的信息。纹理的大小、颜色深度(bpp)和每一个被缓存的纹理在内存中所占用大小等。这里的&rc&代表纹理的&引用计数&。如果这个引用计数等于1或2的话,那么意味着,这个纹理当前可能不会需要使用了,此时,你可以放心地把它从纹理cache中移除出去。
你只移除你知道在当前场景下不太可能会被使用的纹理(即上面介绍的引用计数为1或2的情况),这是一个明智的做法。另外,只移除那些占用内存大的纹理。如果一个纹理只占几个kb的内存,其它移不移除都没什么太大的影响。(译注:这就和程序优化一样,不要做过多的细节优化,不要过早优化,要找到性能的瓶颈,然后再重点优化,以20%的时间换取80%的效率。过早和过多细节优化对于大多数程序而言,是需要极力避免的)。
SpriteFrames retain textures!
上面提到的例子中,纹理的引用计数可能有点让人看不懂。你会发现,纹理集有很高的retain count,即使你知道这些纹理集中的纹理当前并没有被使用。
你可能忽略了一件事:CCSprteFrame会retain它的纹理。因此,如果你使用了纹理集,你要完全移除它不是那么容易。因为,由这个纹理集产生的sprite frame还是保留在内存中。所以,你必须调用CCSpriteFrameCache的方法,能彻底清除纹理缓存中的纹理集。(译注:记住,不是你调用对象的release方法了,对象的内存就会被释放掉,而是引用计数为0了,内存才会被删除)
你也可以使用,并指定一个纹理集的.plist文件来清除缓存起来的精灵帧(spriteframes).
添加 SpriteFrames 非常耗时, 每次都是!
这样看起来有点无知(innocent):
但是,要注意,CCSpriteFrameCache并不会去检查一个精灵帧是否已经被缓存起来了!这与CCTextureCache的动作方式有所不同,它每次都会去加载spriteframes.
这个过程到底需要耗费多少时间呢,这取决于你提供的.plist文件中精灵帧的数量。我注意到,只有14帧的plist加载与有280帧的plist加载有着很大的区别。所以,对于精灵帧的加载,你也需要谨慎。
所以,你要避免一些不必要的addSpriteFrames*方法调用。因为那边导致场景切换时产生小的卡顿。
原帖地址:
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量16272点击量10875点击量8664点击量8017点击量7488点击量7063点击量6588点击量6497点击量5716
&2016 Chukong Technologies,Inc.
京公网安备89查看: 4390|回复: 8
关于移动硬盘的选择,大家买的是多大内存,什么牌子?
在线时间581 小时
阅读权限50
帖子猥币巴士票
猥言大义 Lv.5, 积分 1413, 距离下一级还需 587 积分
我刚在淘宝看到一些80GB的移动硬盘,才56左右,很便宜,拉游戏很好,破解也好,请问大家买的是多大内存,什么牌子?
在线时间4019 小时
阅读权限70
帖子猥币巴士票
猥然不动 Lv.7, 积分 9945, 距离下一级还需 55 积分
如果只是为了往内置硬盘里面拖游戏的话,你不如去买条网线,五块都用不上,而且不需要二次复制,速度比移动硬盘给力。
真要想用来放游戏的话,买个1t的吧。
在线时间581 小时
阅读权限50
帖子猥币巴士票
猥言大义 Lv.5, 积分 1413, 距离下一级还需 587 积分
& & 网线???请教一下,怎么用的
在线时间4019 小时
阅读权限70
帖子猥币巴士票
猥然不动 Lv.7, 积分 9945, 距离下一级还需 55 积分
就是FTP啊,首先用网线链接电脑和PS3,然后设置好PS3的IP和你电脑的IP,之后再打开MultiMan,具体从哪个版本开始支持我忘了,反正新版的一定行,在电脑上运行FTP软件建立新的站点,IP设置成PS3的,之后连接就可以了。具体的步骤巴士上有教程,你在百度上搜索“PS3 FTP”就可以了,只不过那个教程用的是PS3 FTP Sever这个软件,现在已经可以使用MultiMan直接与PC连了。
我是使用USB无线wifi适配器开启软AP来与PS3连的,速度慢了些不过很方便,免去了插拔网线的麻烦,PS3本身就带wifi的。
在线时间130 小时
阅读权限30
帖子猥币巴士票
猥乎其微 Lv.3, 积分 363, 距离下一级还需 137 积分
日立500G的不错!不用外接电源,小巧,发热量很低,装50个左右游戏,基本够玩了!
在线时间142 小时
阅读权限40
帖子猥币巴士票
猥服出巡 Lv.4, 积分 719, 距离下一级还需 281 积分
希捷500G用的挺好,还是买大容量的好,游戏越来越大
在线时间2611 小时
阅读权限70
帖子猥币巴士票
猥然不动 Lv.7, 积分 7229, 距离下一级还需 2771 积分
我是内置500G日立7K500,外置日立500G的7K500不用接电源,足够用了。
万一内置坏了把外置换进去,哈哈。
每次受到不公平对待或者挑衅的时候低头看一下自己的签名,一切都会归于原点。
在线时间175 小时
阅读权限30
帖子猥币巴士票
猥乎其微 Lv.3, 积分 345, 距离下一级还需 155 积分
西部数据500G和PS3一样吃灰中,打算让它吃到4.00CFW
在线时间548 小时
阅读权限70
帖子猥币巴士票
猥然不动 Lv.7, 积分 6064, 距离下一级还需 3936 积分
内存?手机党?
Powered by