2d cocos 图像处理_cocos2d 图像变暗 - CSDN
  • CCTexture2d 封装纹理对象 CCTextureCache 一组纹理对象,通过CCDictionary管理,通过字符key获取 CCRenderTexture 创建动态纹理 CCSprite 实现纹理显示 CCSpriteFrame 是CCSpriteBatchNode包含纹理的部分...

    CCImage 调用libpng libjpg来读取图片像素信息

    CCTexture2d 封装纹理对象

    CCTextureCache 一组纹理对象,通过CCDictionary管理,通过字符key获取

    CCRenderTexture 创建动态纹理

    CCSprite 实现纹理显示

    CCSpriteFrame 是CCSpriteBatchNode包含纹理的部分块对象,可以作为动画的每一帧

    CCSpriteBatchNode 批处理节点纹理

    CCSpriteFrameCache 一组纹理对象,通过CCDictionary管理,通过字符key获取

    CCAnimation  实现一组Sprite播放的Action

    /////////////////////////////////////////////////////////////////////////////////

    CCSpriteFrameCache加载的是一张拼接过的大图,每一个小图只是大图中的一个区域,这些区域信息都在plist文件中保存。用的时候只需要根据小图的名称就可以加载到这个区域。

    CCTextureCache 是普通的图片缓存,我们所有直接加载的图片都会默认放到这个缓存中,以提高调用效率。


    CCTextureCache::sharedTextureCache()->removeAllTextures(); 释放到目前为止所有加载的图片

    CCTextureCache::sharedTextureCache()->removeUnusedTextures(); 将引用计数为1的图片释放掉CCTextureCache::sharedTextureCache()->removeTexture(); 单独释放某个图片

    CCSpriteFrameCache 与 CCTextureCache 释放的方法差不多。

    值得注意的是释放的时机,一般在切换场景的时候释放资源,如果从A场景切换到B场景,调用的函数顺序为B::init()---->A::exit()---->B::onEnter() 可如果使用了切换效果,比如CTransitionJumpZoom::transitionWithDuration这样的函数,则函数的调用顺序变为B::init()---->B::onEnter()---->A::exit() 而且第二种方式会有一瞬间将两个场景的资源叠加在一起,如果不采取过度,很可能会因为内存吃紧而崩溃。

    有时强制释放全部资源时,会使某个正在执行的动画失去引用而弹出异常,可以调用CCActionManager::sharedManager()->removeAllActions();来解决。

    内存优化

    优化的心得就是尽量去拼接图片,使图片边长尽可能的保持2的N次方并且装的很满。但要注意,有逻辑关系的图片尽量打包在一张大图里,另外一点就是打包的时候要考虑到层的分布。因为为了渲染效率可能会用到CCSpriteBatchNode;同一个BatchNode里的图片都是位于一个层级的,因此必须根据各个图片的层级关系,打包到不同的plist里。有时内存和效率不可以兼得,只能尽量平衡了。


    最后附一个各代IOS设备的内存限制情况

    设备                                              建议内存                   最大内存

    iPad2/iPhone4s/iphone4                170-180mb                 512mb

    iPad/iPod touch3,4/iphone3gs          40-80mb                  256mb

    iPod touch1,2/iPhone3g/iPhone1         25mb                    128mb

    上述建议内存只是一些人自己测试的结果,可用的RAM不大于最大内存的一半,如果程序超过最大内存的一半,则可能会挂掉。

    另外在LEAKS里查看模拟器中和真机总的内存,会有较大出入。在模拟器中的结果与实际更接近一些。

     

    以一张1024*1024的图片为例。

    CCSprite *pSprite = CCSprite::spriteWithFile("a.png");

    调用上边这行代码以后,可以在LEAKS工具中看到,增加了大约4M的内存。然后接着调用

    addChild(pSprite);

    这时,内存又增加了4M。也就是,一张图片,如果需要渲染的话,那它所占用的内存将要X2。

    再看看通过plist加载的图片,比如这张大图尺寸为2048*2048。想要加载其中的一张32*32的小图片

    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("b.plist");

    此时内存增加16M (汗)

    CCSprite *pSpriteFrame = CCSprite::spriteWithSpriteFrameName("b1.png");

    b.png 大小为32*32 ,想着也就是增加一点点内存,可实际情况是增加16M内存。也就是只要渲染了其中的一部分,那么整张图片都要一起被加载。

    但是情况不是那么的糟糕,这些已经渲染的图片,如果再次加载的话,内存是不会再继续升高的,比如又增加了100个b.plist的另一个区域,图片内存还是共增加16+16 = 32M,而不会继续上升。




    展开全文
  • Unity和Cocos2D在2D游戏开发上的对比CasualArena团队自从2008年开始就在开发Flash网页游戏。过去的一年里,他们学习不同的技术以及和3D的专业开发 ,拥有了在跨平台的移动游戏和平板游戏上的专业开发经验。这篇文章...
    Unity和Cocos2D在2D游戏开发上的对比

    CasualArena团队自从2008年开始就在开发Flash网页游戏。过去的一年里,他们学习不同的技术以及和3D的专业开发 ,拥有了在跨平台的移动游戏和平板游戏上的专业开发经验。这篇文章强调了这两个平台的不同环境以及它们之间各自不同的特点。大多数的移动游戏和平板游戏开发者都希望他们开发的游戏可以运行在不同的平台上,至少能够在IOS和安卓平台上运行。当然,用原生代码(IOS的Objective-C,安卓的JAVA)总是可以让两个或者更多平行开发得以实现,但是不建议这样做。最有效的做法是使用一个能一次开发就可以发布到多个平台的开发环境。那么问题来:该使用什么技术呢?




    除了别的之外还有各种各样的框架和技术可以使用:Unity3D,Cocos2D,Marmalade SDK以及Adobe Flash。Adobe Flash实际上只能用在你想把开发的网页游戏迅速移植到移动设备上。如果你开发的游戏很简单(如棋盘游戏),那么就可以使用Flash开发,然而,如果你的游戏比较复杂的话(如经营游戏,有大量图形或者动画的游戏等)那么就不适合用Flash做开发。Cocos2D是一个全面的框架,开源并且完全免费。
    这就是大多人使用这个技术的主要原因,胜过不完全免费的Marmalade和Unity.Unity3D仍然是开发3D游戏的主要开发平台。Unity的新版本已经包含了开发2D游戏的功能,在2D游戏开发方面也夯实了坚定的地位,Cocos和Unity是开发2D游戏的首要选择。根据我们的经验,我们推荐选择这两个中的一个来开发2D游戏。但是仍然有一个大问题:



    游戏开发的最好技术是什么:Unity还是Cocos?
    在网上你可以找到很多这两种技术的对比。在我们开发游戏之前,我们要了解相关数据和信息并决定使用那种技术。但是人们对这两种技术的对比大多都比较主观。擅长Cocos的人会偏向于Cocos。而使用Unity的人则偏向于Unity。真的极少有专业开发人员在两个平台上做对比。我们在这两种平台上都学习开发过,也有自己的主观看法:Unity是一个更清晰更好的平台。实际上更精确的回答应该是:除非你能负担的起Unity的费用,否则就选择Cocos。Unity3D比Cocos2D的技术要更为高级,虽然Cocos开源并且免费。考虑到他们的不同。在任何时候谈论Cocos2D(或者简称Cocos),我们都指的是-x,Cocos平台的延伸(最初面向iPone的平台)。



    Cocos2d相对于Unity3D的优势
    Cocos2d免费,开源和无限的使用期限。而Unity比较贵。它有免费许可证,但是专业开发人员使用的话有功能限制。许可证价格在1500美元到4500美元之间,加上税会更多,这对新入开发人员来说是个重大负担。Cocos2D使用 c++编程语言和开明的库,比Unity程序处理上稍微简单些。你可以完全查看Cocos2d的代码,根据自己需求来编辑代码 。如果你擅长 C++而且不想承担Unity的高昂使用费,Cocos2D就是最好的选择。它有很多非常好用的功能,但是和Unity相比没有什么优势。它有很好的物理引擎,并有每个功能特征都有大量实例,有一个庞大的的开发者社区来支持和改善等。但是这些Unity也有。



    Unity3D相对于Cocos2d的优势
    当然我们谈论的是2d,其他的一切,Coco不支持3d软件
    Cocos2D没有集成的环境设计。可视化接口设计要用编程实现,用C++加载和定位图片。但是你可以使用免费的外部图形编辑器CcosStudio,可以帮你在屏幕定位元素和配置某个对象。但是这个编辑器比Unity的功能少太多。Unity的编辑器完全整合在了一起。而Cocos Studio并没有,而且它的操作基于XML文件,依靠Cocos的库生成一系列图像。它存在一些bug,并不能在所有的电脑上工作。Unity图形编辑器通过拖动组件和修改参数可以很轻松的布局和设计Unity场景,加入对象,脚本,灯光特效,图形效果等。因此,它相对于Cocos2D或者Cocos Studio的布局来说大大减少了开发时间。




    编程语言
    Cocos2D使用C++语言编程,Unity3D可以使用C#和Javascript。C#和Javascript都是比C++更为强大的语言,让你的程序开发和算法更简单。同时,对那些不擅长C++的人来说,学起起来不会感到困难乏味。而且你还要担心C++的指针和内存泄漏问题。这些问题在Unity里都不会出现,让你只专注于你的游戏开发,又节省了巨大的时间。此外,代码编辑器,Unity使用MonoDevelop或者VisualStudio,比起Cocos更加稳定,方便和全面。总之,我们可以说C#/Javascript(Unity)比C++更简单,是可以节省你很多时间的高效语言。




    多平台
    两中技术都是跨平台,但是Unity更好。Cocos2D支持开发不同的移动平台包括IOS和安卓。而Unity包含了更多:游戏机平台,桌面和浏览器。如果你想要你的浏览器开发支持Facebook,那么Cocos2D就不足以胜任。但是你可以用Cocos来做浏览器的二次开发,比如用Adobe Flash,通常用来做为手机和网页游戏市场的开发。使用Unity就没有这个必要,能够很方便的导出到浏览器。Unity支持大多数游戏市场所使用的平台:手机和平板(IOS,安卓,Window Phone以及黑莓),浏览器(和 即将到来的HTML5)游戏机平台(Xbox, PlayerStation和Wii)以及桌面(PC,Mac和Linux)。此外,Unity可以特殊定制给不同设备,而Cocos2D就一个最简单的方法(例如,适合开发安卓和IOS平台游戏)。


    文档和学习时间
    Unity有丰富的文档。有清晰的教学视频和文本,有的已经翻译成了西班牙语。支持相对来说快速简洁。然而Cocos的文档很少,并且质量低劣。只有英文和少量的中文。没有支持,论坛全是没人回答的问题,要得到答案很困难。Unity学习起来比Cocos更快:图像编辑器,C#/Javascript和丰富的信息和支持会让你有个愉快的学习体验。相反,Cocos2D相对来说,除非你擅长C和XCode++,十分想学习Cocos2D的库。


    社区和附加产品
    Unity3D已经是一个非常强大的开发工具。很多人通过Aseet Store做出贡献,让Unity更强大。成百上千的开发人员在商店里售卖他们的插件,资源,和改进的东西。这些插件里有很多功能强大,必须要花钱买:3D模型,2D贴图,动画,应用程序,扩展编辑器,脚本,材质都是你能额外购买或者免费在Unity官方商店里下载到的。其中有个Ngui的插件,一款扩展的图形编辑器,为2D游戏的开发提供了巨大的帮助,减少了开发时间。Ngui Unity就像 Javascript的jQuery.而Cococs缺乏这些根本的附加产品。


    结论
    Unity昂贵但值得。大量减少开发时间的比例超过了许可证的售价。许多功能在Cocos2D里是没有的,编译也比Cocos2D更快。因此,Unity3D比Cocos2D更好。
    原文链接:
    https://en.yeeply.com/blog/comparison-between-unity-and-cocos2d-platforms-for-2d-game-developments/
    原文作者:Luis Picurelli
    展开全文
  • CCTexture2d 封装纹理对象 CCTextureCache 一组纹理对象,通过CCDictionary管理,通过字符key获取 CCRenderTexture 创建动态纹理 CCSprite 实现纹理显示 CCSpriteFrame 是CCSpriteBatchNode包含...

    CCImage 调用libpng libjpg来读取图片像素信息

    CCTexture2d 封装纹理对象

    CCTextureCache 一组纹理对象,通过CCDictionary管理,通过字符key获取

    CCRenderTexture 创建动态纹理

    CCSprite 实现纹理显示

    CCSpriteFrame 是CCSpriteBatchNode包含纹理的部分块对象,可以作为动画的每一帧

    CCSpriteBatchNode 批处理节点纹理

    CCSpriteFrameCache 一组纹理对象,通过CCDictionary管理,通过字符key获取

    CCAnimation  实现一组Sprite播放的Action

    /////////////////////////////////////////////////////////////////////////////////

    CCSpriteFrameCache加载的是一张拼接过的大图,每一个小图只是大图中的一个区域,这些区域信息都在plist文件中保存。用的时候只需要根据小图的名称就可以加载到这个区域。

    CCTextureCache 是普通的图片缓存,我们所有直接加载的图片都会默认放到这个缓存中,以提高调用效率。


    CCTextureCache::sharedTextureCache()->removeAllTextures(); 释放到目前为止所有加载的图片

    CCTextureCache::sharedTextureCache()->removeUnusedTextures(); 将引用计数为1的图片释放掉CCTextureCache::sharedTextureCache()->removeTexture(); 单独释放某个图片

    CCSpriteFrameCache 与 CCTextureCache 释放的方法差不多。

    值得注意的是释放的时机,一般在切换场景的时候释放资源,如果从A场景切换到B场景,调用的函数顺序为B::init()---->A::exit()---->B::onEnter() 可如果使用了切换效果,比如CTransitionJumpZoom::transitionWithDuration这样的函数,则函数的调用顺序变为B::init()---->B::onEnter()---->A::exit() 而且第二种方式会有一瞬间将两个场景的资源叠加在一起,如果不采取过度,很可能会因为内存吃紧而崩溃。

    有时强制释放全部资源时,会使某个正在执行的动画失去引用而弹出异常,可以调用CCActionManager::sharedManager()->removeAllActions();来解决。

    内存优化

    优化的心得就是尽量去拼接图片,使图片边长尽可能的保持2的N次方并且装的很满。但要注意,有逻辑关系的图片尽量打包在一张大图里,另外一点就是打包的时候要考虑到层的分布。因为为了渲染效率可能会用到CCSpriteBatchNode;同一个BatchNode里的图片都是位于一个层级的,因此必须根据各个图片的层级关系,打包到不同的plist里。有时内存和效率不可以兼得,只能尽量平衡了。


    最后附一个各代IOS设备的内存限制情况

    设备                                              建议内存                   最大内存

    iPad2/iPhone4s/iphone4                170-180mb                 512mb

    iPad/iPod touch3,4/iphone3gs          40-80mb                  256mb

    iPod touch1,2/iPhone3g/iPhone1         25mb                    128mb

    上述建议内存只是一些人自己测试的结果,可用的RAM不大于最大内存的一半,如果程序超过最大内存的一半,则可能会挂掉。

    另外在LEAKS里查看模拟器中和真机总的内存,会有较大出入。在模拟器中的结果与实际更接近一些。

     

    以一张1024*1024的图片为例。

    CCSprite *pSprite = CCSprite::spriteWithFile("a.png");

    调用上边这行代码以后,可以在LEAKS工具中看到,增加了大约4M的内存。然后接着调用

    addChild(pSprite);

    这时,内存又增加了4M。也就是,一张图片,如果需要渲染的话,那它所占用的内存将要X2。

    再看看通过plist加载的图片,比如这张大图尺寸为2048*2048。想要加载其中的一张32*32的小图片

    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("b.plist");

    此时内存增加16M (汗)

    CCSprite *pSpriteFrame = CCSprite::spriteWithSpriteFrameName("b1.png");

    b.png 大小为32*32 ,想着也就是增加一点点内存,可实际情况是增加16M内存。也就是只要渲染了其中的一部分,那么整张图片都要一起被加载。

    但是情况不是那么的糟糕,这些已经渲染的图片,如果再次加载的话,内存是不会再继续升高的,比如又增加了100个b.plist的另一个区域,图片内存还是共增加16+16 = 32M,而不会继续上升。

    展开全文
  • 欢迎转载!转载时请注明出处:... 如果你还没接触到过这个工具,那你今天运气非常好了... ... 说明:这款软件需要购买的,能够发一百多块买到这么好的工具还是挺值得,可以工具的价钱,肯定他带给的的

    参看资料:

    http://www.cocoachina.com/bbs/read.php?tid=103764

    http://www.cnblogs.com/andyque/archive/2011/03/18/1988097.html  ----建议链接  子龙山人的博客  -

    说明:这款软件需要购买的,能够发一百多块买到这么好的工具还是挺值得,可以工具的价钱,肯定他带给的的好处远不止这个数字..呵呵!

                                                                在一个时间段,竭尽全力只做一件事,你就是最棒的 

    1、为什么要用这个工具呢?有什么好处?

    第一点:内存问题, OpenGL ES  纹理的宽和高都要是2次幂数, 以刚才的例子来说, 假如 start.png 本身是 480x320, 但在载入内存後, 它其实会被变成一张 512x512 的纹理, 而start.png 则由 101x131 变成 128x256, 默认情况下面,当你在cocos2d里面加载一张图片的时候,对于每一个像素点使用4个byte来表示--1个byte(8位)代表red,另外3个byte分别代表green、blue和alpha透明通道。这个就简称RGBA8888。

    因此,如果你使用默认的像素格式来加载图片的话,你可以通过下面的公式来计算出将要消耗多少内存来加载:

      图像宽度(width)×图像高度(height)×每一个像素的位数(bytes per pixel) = 内存大小

      此时,如果你有一张512×512的图片,那么当你使用默认的像素格式去加载它的话,那么将耗费

      512×512×4=1MB(好多啊!)

    第二点:再看看关於渲染速度方面, OpenGL ES 上来说我们应该尽量减少渲染时切换纹理和 glDrawArray 的呼叫, 刚才的例子每画一个图像都会切换一次纹理并呼叫一次 glDrawArray , 我们这里只画3样东西, 所以不会看到有什麽问题, 但如果我们要渲染几十个甚至几百个图像 , 速度上就会被拖慢. 很明显这并不是我们所想要的..

    估计就这两点就说服了你吧~   至少我是了...呵呵!

    2、认识TexturePacker的界面

    我框出来的都是我们常用和一些必须点到的地方

    Data Format:导出什么引擎数据,默认cocos2d,下拉列表中有很多,基本常用的引擎都支持了

    Data File :导出文件位置(后缀名.plist)

    Texture Format:纹理格式,默认png

    Image format:图片像素格式,默认RGBA8888...根据对图片质量的需求导出不同的格式

    Dithering:抖动,默认NearestNeighbour,(如果图像上面有许许多多的“条条”和颜色梯度变化)将其修改成FloydSteinberg+Alpha;

    Scale: 让你可以保存一个比原始图片尺寸要大一点、或者小一点的spritesheet。比如,如果你想在spritesheet中加载“@2x"的图片(也即为Retina-display设备或者ipad创建的)。但是你同时也想为不支持高清显示的iphone和touch制作spritesheet,这时候只需要设置scale为 1.0,同时勾选autoSD就可以了。也就是说,只需要美工提供高清显示的图片,用这个软件可以自己为你生成高清和普清的图片。

    Algorithm TexturePacker:里面目前唯一支持的算法就是MaxRects,即按精灵尺寸大小排列,但是这个算法效果非常好,因此你不用管它。

    Border/shape padding: 即在spritesheet里面,设置精灵与精灵之间的间隔。如果你在你的游戏当中看到精灵的旁边有一些“杂图”的时候,你就可以增加这个精灵之间的间隔。

    Extrude: 精灵边界的重复像素个数. 这个与间隔是相对应的--如果你在你的精灵的边边上看到一些透明的小点点,你就可以通过把这个值设设置大一点。

    Trim: 通过移除精灵四周的透明区域使之更好地放在spritesheet中去。不要担心,这些透明的区域仅仅是为了使spritesheet里面的精灵紧凑一点。--当你从cocos2d里面去读取这些精灵的时候,这些透明区域仍然在寻里。(因为,有些情况下,你可能需要这些信息来确定精灵的位置)

    Shape outlines: 把这个选项打开,那么就能看到精灵的边边。这在调试的时候非常有用。

    AddSprite:添加图片Add Folder:根据文件夹添加图片

    Publish:导出资源文件(.plist和png)

    3、程序中更改资源加载方式

    我就是用的上一个例子,然后将start.png,grossinis.png,grossinis_sister1.png,grossinis_sister2.png打包成一个image.plist和image.png.程序我就不重新全部上传了,就自上传和上一个例子不同的地方,没有的朋友就可以去第一篇文章下载工程,今后我们还会用到的,会用这个工程来开发我们的第一个游戏...游戏暂时保密...呵呵!

    SpriteTestLayer.cpp(就只改了这个这个文件

    1. #include "SpriteTestLayer.h"  
    2.   
    3.   
    4. SpriteTestLayer::SpriteTestLayer(void)  
    5. {  
    6. }  
    7.   
    8. bool SpriteTestLayer::init()  
    9. {  
    10.     CCSize s=CCDirector::sharedDirector()->getWinSize();  
    11.       
    12.     //第一种加载资源方式  
    13.     //CCSprite* sprite=CCSprite::create("start.png");  
    14.     //第二种加载资源方式  
    15.     CCSpriteFrameCache *cache=CCSpriteFrameCache::sharedSpriteFrameCache();  
    16.     cache->addSpriteFramesWithFile("image.plist","image.png");  
    17.     CCTexture2D *texture = CCTextureCache::sharedTextureCache()->textureForKey("image.png");   
    18.     CCSpriteBatchNode *spriteBatch = CCSpriteBatchNode::batchNodeWithTexture(texture);   
    19.     addChild(spriteBatch);   
    20.     CCSprite* sprite=CCSprite::spriteWithSpriteFrameName("start.png");  
    21.     /* 
    22.         加载pvr压缩格式文件方式:注意此种方法不可以像上面打成一个文件,然后根据名字来索引对应的图片 
    23.         如果在AndEngine中使用,然后利用TexturePacker是可以导出三个文件格式的,就是多出来了一个xml文件 
    24.         保存着索引子图片的索引,已经图片位置等信息,cocos2dx的test也没有找到相应的例子,只有单独一个 
    25.         精灵才用到了加载pvr这种格式,可能cocos2dx却没有导出这个xml,也可能是这个原因吧! 
    26.          
    27.         //第一种方式: 
    28.         CCSprite* sprite=CCSprite::create("image.pvr.ccz"); 
    29.         //第二种方式: 
    30.         CCTexture2D *texture; 
    31.         CCTextureCache *cache=CCTextureCache::sharedTextureCache(); 
    32.         texture=cache->addImage("image.pvr.ccz"); 
    33.         CCSprite* sprite=CCSprite::create(texture);*/  
    34.   
    35.     sprite->setAnchorPoint(ccp(0,1));//设置sprite的描点,(0,1)也就是图片的左上角  
    36.     sprite->setPosition(ccp(0,s.height));//设置sprite位置  
    37.     this->addChild(sprite);  
    38.   
    39.     //sprite的一些基本的操作:缩放、旋转、混色  
    40.     m_tamara=CCSprite::spriteWithSpriteFrameName("grossini.png");  
    41.     m_tamara->setScaleX( 2.5f);  
    42.     m_tamara->setScaleY( -1.0f);  
    43.     m_tamara->setPosition(ccp(100,70) );  
    44.     m_tamara->setOpacity( 255);//RGBA值RGB+透明度值  
    45.     this->addChild(m_tamara);  
    46.   
    47.     m_grossini=CCSprite::spriteWithSpriteFrameName("grossinis_sister1.png");  
    48.     m_grossini->setRotation( 120);  
    49.     m_grossini->setPosition( ccp(s.width/2, s.height/2));  
    50.     m_grossini->setColor( ccc3( 255,0,0));  
    51.     this->addChild(m_grossini);  
    52.   
    53.     m_kathia=CCSprite::spriteWithSpriteFrameName("grossinis_sister2.png");  
    54.     m_kathia->setPosition( ccp(s.width-100, s.height/2));  
    55.     m_kathia->setColor( ccBLUE);  
    56.     this->addChild(m_kathia);  
    57.   
    58.     return true;  
    59. }  
    60. SpriteTestLayer::~SpriteTestLayer(void)  
    61. {  
    62. }  

    运行结果:

    哈哈! 效果一样,没问题了,以后就用这种方法加载资源图片吧!

    如果讲述得有误,或者不对的地方,还望各位指出!


    cocos2d和像素格式

     在cocos2d里面,理解像素格式非常重要。因为,像素格式会影响在你的游戏中加载一张图片到底需要多少内存。因为游戏通常要加载大量的图片资源,所以你要尽可能充分利用移动设备上面非常少的可用物理内存。

      默认情况下面,当你在cocos2d里面加载一张图片的时候,对于每一个像素点使用4个byte来表示--1个byte(8位)代表red,另外3个byte分别代表green、blue和alpha透明通道。这个就简称RGBA8888。

      因此,如果你使用默认的像素格式来加载图片的话,你可以通过下面的公式来计算出将要消耗多少内存来加载:

      图像宽度(width)×图像高度(height)×每一个像素的位数(bytes per pixel) = 内存大小

      此时,如果你有一张512×512的图片,那么当你使用默认的像素格式去加载它的话,那么将耗费

      512×512×4=1MB(好多啊!)

      这里,我们以Iphone3G为例。它总共只有128兆内存,但是系统就要占掉一大半,还有其它一些程序也要使用一些内存,实际可用的内存更少。对于单独一张spritesheet来说那确实足够了。可是想像一下你有许许多多的spritesheet,而且游戏里面经常需要大量的spritesheet!

      这里就需要让像素格式来帮忙了。你可以为图片的每个像素点指定更小的字节来保存图片。(比如每个像素点2个字节,即每个像素点16位),这种方式就能够在图片质量和内存消耗之间取得一个很好的平衡点。

      通常,你是在你的游戏看起来还ok的提前下,尽可能少地使用内存。背景图片就非常适用用8位或者16位来存储,而精灵则一般要用16位或者32位。对于更多可选的像素格式和适用的场合,你可以参考Riq(cocos2d的作者)的一篇文章: understanding pixel format guide.(理解像素格式向导)

      顺便说一下,如果你注意看窗口的右下角,你会看到Texture Packer会基于你当前选择的像素格式计算出这张spritesheet所消耗的内存大小,因此你不必手动计算了。:)


    PVRs和压缩

    PVR图像是专门为ios设备上面的PowerVR图形芯片指定的图像容器。它们在ios设备上非常好用,因为可以直接加载到显卡上面,而不需要经过中间的转化。

      PVR图像也可以包含许多种不同像素格式的图像数据。之前,cocos2d仅仅支持一些用  sdk指定的 texturetool app来创建的图片格式,不过后来cocos2d已经扩展了许多格式了。

      而且,最近cocos2d更新到了可以支持压缩了的pvr图像格式pvr.ccz。使用这种图片格式的好处有两点:一、可以使你的应用程序更小,因为图片是压缩过了的。二、你的游戏能够启动地更快。

      总而言之,对于spritesheet来说,你可能通过指定16位的像素格式来减少内存消耗,同时保存为pvr.ccz格式来使程序加载速度更快。最后,点击“Publish”按钮,你的spritesheet和属性列表文件就生成好了。Teture Packer会提示你,一些精灵将会创建成红色(因为你使用的是免费版本)。



    展开全文
  • 近段时间在使用cocos2d-x开发2D手游,技术方案使用的是cocos2d-x+lua,因为游戏使用的是cocos2d-x 2.1.5版本,有些优化方案在最新版的cocos2d-x版本已经实现了。这篇文章主要是总结在使用cocos2d-x2.x版本+lua技术...
  • Cocos2d-android游戏引擎

    2016-11-18 10:44:08
    什么是游戏引擎游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而...
  • 大家知道Cocos2d本身是一个非常强悍的2d游戏引擎,其中自带了很多使用的图像处理功能,但是别忘了Apple自带的Core Graphics里也有很多强大的图像处理功能,比如滤镜 CIFilter.Apple在iOS上提供了近百种不同的滤镜效果,...
  • Cocos2d-x 文字显示

    2019-04-26 16:59:59
    cocos底层使用的是OpenGL进行页面渲染,但OpenGL并支持文字的处理,OpenGL主要是用于图像和3D模型的渲染。为了支持文字的渲染,cocos会将文字转换成要显示的图片,然后通过OpenGL把图片显示出来。 cocos2d-x 3.x...
  • Cocos2d加载图片的方式

    2019-01-08 14:18:56
    分享一个我用cocos2d加载图片的方式,其实很简单,我觉得还挺实用的 首先要提醒一点,ihpone开发中所有的图片最好都是png格式的,虽然png格式的图片比jpg或其他的图片要大,但是png的图片在sdk中是做过优化处理的,是苹果...
  • Cocos2d-x初学者教程

    2017-06-14 10:35:42
    Cocos2d-x是一款快速、强大、易用的开源2D游戏引擎。 它与苹果的Sprit Kit略像,但又有一大优势——跨平台。 这意味着,开发者只需要写一个版本的代码就可以开发出能在iOS、Android、Windows Phone、Mac OS X、...
  • Cocos2d-x 学习之引擎介绍Cocos2d-X是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C + +cocos2d-iPhone项目的版本。cocos2d-X发展的重点是围绕cocos2d跨平台。即其实现一次编码,再各平台分别编译后即可...
  • 纹理(Texture)就是图片,它用来给物体增加细节,cocos2d-x中使用Texture2D处理2D纹理贴图,本篇就从cocos2d-x中的Texture2D类介绍openGL纹理。 首先介绍纹理坐标的概念,2D纹理是一个图像数据的二维数组。用2D...
  • cocos2d-js复制图层图像

    2020-07-17 17:53:07
    游戏开发中,有时候需要复制某个图层的图像,用于图像处理或者其他业务,cocos的精灵提供了复制图像的机制,源码展示了如何把一个复合精灵拷贝到一个图像中,并生成另外一个一模一样的精灵的过程。
  • [Cocos2d-x相关教程来源于红孩儿的...红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议! Cocos2d-x纹理优化的一些方案  在目前
  • cocos2d,缓存简单梳理
  • [Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:...红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x    Cocos2d-x之CCImage深入分析     本节所用Cocos2d-x版本:cocos2d-2.
  • - 3、自定义定时器三种定时器中帧循环的实时性最高,帧循环定时器是在Cocos2d-x程序界面每帧图像显示时运行的定时器。帧循环定时器常常用于游戏中物体的碰撞检测。 一次性定时器比较好理解,就是定时完之后开始计时...
  • Cocos2d_android开发植物大战僵尸,所需要知道的知识。
  • 整理Cocos2d-x 面试题解

    2019-05-16 16:11:57
     昨天听了腾讯2015校招的在线宣讲会,看到了游戏技术大拿Steven,他总结了... 网上关于cocos2d-x的面试题比较少,这里搜集和整理了一写网上关于cocos2d-x游戏开发的面试题。希望对找工作的同学有帮助。如有错误...
1 2 3 4 5 ... 20
收藏数 5,972
精华内容 2,388
关键字:

2d cocos 图像处理