《深入分析Cocos2d-x 2.0中的“纹理”.docx》由会员分享,可在线阅读,更多相关《深入分析Cocos2d-x 2.0中的“纹理”.docx(65页珍藏版)》请在金锄头文库上搜索。
1、 深入分析Cocos2d-x 2.0中的“纹理”另:本章所用Cocos2d-x版本为:cocos2d-2.0-x-2.0.2 Aug 30 2012http:/cn.cocos2d-x.org/download 大家好,最近工作实在是太忙了,公司项目这个月要进行对外测试,大伙都是忙的昏天黑地的,每天很少有时间写新博文,但每天看到博文的回复和排名,心中很是感谢,正是因为各位的支持才能让我保持旺盛的战斗力。当然,在此还要感谢一下亲爱的老婆大人对我的支持,小乖每天闹困时主动的哄小乖安睡,否则咱咋能有时间写这些文字,小乖一岁半了,长得非常可爱,虽然在京仍然漂着,仍然买不起房,仍然只是一个程序员,但是我
2、知道我已经得到了人生中最幸福的东西。 好了,感叹之后,今天我们来学习Cocos2d-x中的“纹理”。之前有几篇文章都是谈及图片方面的,也是我刻意的安排:(1)。如何利用Cocos2d-x开发一款游戏?(2)。游戏开发之图片元素。(3)。Cocos2d-x中图字原理之深入分析。(4)。红孩儿纹理打包器。(5)。CCImage深入分析。(6)。词典类CCDictionary深入分析。 在第一篇里我首先提到了“图元素的管理工具”。这是为什么呢?因为2D游戏画面是由图片构成的。了解好图片从美术绘制到加载到游戏以及使用和释放的整个过程是非常重要的,他关系着游戏的运行效率,内存占用等重要关键问题。有一个好
3、的方案指导工作流程对于项目的成功是一项重要的保证。所以,请各位好好管理你们的图片资源。在第2篇里对于图片拼合的用途和意义做了启蒙。第3篇里我们深入了解了写汉字时Cocos2d-x是怎么使用图片来进行绘制的,它里面CCTextureAtlas和CCSpriteBatchNode 两个类告诉我们图片拼合原理与实现。而第4篇介绍了我开发的一款图片拼合工具。随后我会更新为最新版提供给大家使用。新增了PLIST方式导出和自动进行边缘空白裁剪的功能,免费而更强大!欢迎大家到下载。而后面两篇,其实是为了引出今天的文章而做的铺垫。 本博为什么要花这么多时间在纹理上呢?因为本博一次再一次的看到很多的Cocos2
4、d开发者在说:“为什么我的游戏占内存这么大?”。“为什么我的游戏跑起来效率这么低?”。其实这里面最根本的问题是你思想上没有对资源进行优化的一种流程在里面。在进行游戏开发的过程中,你被美术牵着鼻子跑,你没有自然而然的想到该怎么进行图片的格式,尺寸,拼合,复用方式,以及绘制时的方式。这些因素对游戏产生的具体影响在你的脑子里还没有留下完整的概念。所以,我希望经过对于这些源码的分析,让大家去了解这些因素,从而学会思考如何优化自已的游戏。好了,大家先将今天关于纹理代码的分析博文学习完,下一篇我讲对于这些优化因素做一个具体的讲解。 当一张图片被加载到内存后,它是以纹理的形式存在的。纹理是什么东西呢?纹理就
5、是一块内存,这块内存中存放的是按照指定的像素格式填充的图片像素信息。它被最终作为三角面着色所依据的数据源。 我们来看一下cocos2d-x中的libcocos2d库,其下有许多目录,找到textures展开,可以看到有CCTexture2D,CCTextureAtlas,CCTextureCache,CCTexturePVR四个类。这四个类的功能分别是:CCTexture2D: 纹理,即图片加载入内存后供CPU和GPU操作的贴图对象。 CCTexturePVR:处理PVR文件生成纹理的类,提示:大家可以用它解析愤怒的小鸟中的图片。CCTextureCache:纹理管理器,负责加载图片并对生成的
6、纹理进行管理。通过“字典”来进行快速的查询。 CCTextureAtlas:纹理块管理器,如果图片是由多个小图块组成的,则纹理块管理器用来存储这些小图块的相关信息,以方便绘制相应图块。 为了让大家更好的学习纹理,在讲解纹理的代码之前我已经先给大家分析了本章用到的两个功能类:CCImage和CCDictionary。这两个类分别在纹理模块中担任加载图片和管理纹理指针的作用。希望大家先顶一下这两篇贴子之后再开始下面的代码学习,你一定会感到非常容易。一CCTexture2D:好,咱们现在开始看CCTexture2D:cppview plaincopy1. #ifndef_CCTEXTURE2D_H_
7、2. #define_CCTEXTURE2D_H_3. 4. #include5. #includecocoa/CCObject.h6. #includecocoa/CCGeometry.h7. #includeccTypes.h8. 9. /Cocos2d命名空间10. NS_CC_BEGIN11. /需要用到CCImage,这里声明一下。12. classCCImage;13. 14. /纹理格式:即每个纹理中的像素单位分别是怎么为颜色值进行实际内存分配的。这个非常重要,我们在进行游戏开发的过程中,会常常与各种图片类型打交通。每种图片往往也有各自的像素格式。但当它们一旦加载到游戏中后,就会
8、根据我们的要求变成以下某种类型的纹理。不同的纹理格式所占据的内存大小可能不同,我们要根据实际情况和需求来选择相应的纹理格式。比如我们用RGBA8888纹理格式来创建纹理,它占据的内存容量很大,如果我们要显示的纹理中没有ALPHA值,那就不应该使用带ALPHA通道的纹理格式。我们就可以改成RGB565像素格式。15. 16. typedefenum17. 18. /32位真彩色,最真但最耗内存19. kCCTexture2DPixelFormat_RGBA8888,20. /24位真彩色,去掉了ALPHA通道21. kCCTexture2DPixelFormat_RGB888,22. /16位色
9、,将RGB压缩在一个字中。绿色多了1位,因为人眼对绿色更敏感。23. kCCTexture2DPixelFormat_RGB565,24. /8位色,只存ALPHA值,做遮罩图用25. kCCTexture2DPixelFormat_A8,26. /8位色,只存灰度或者强度值,做灰度图用27. kCCTexture2DPixelFormat_I8,28. /16位色,只存ALPHA值与强度值,双功能29. kCCTexture2DPixelFormat_AI88,30. /16位色,RGBA四通道各占4位。31. kCCTexture2DPixelFormat_RGBA4444,32. /16
10、位色,RGB三通道各占5位,多1位留做ALPHA镂空使用33. kCCTexture2DPixelFormat_RGB5A1,34. /PVR的PVRTC4压缩格式35. kCCTexture2DPixelFormat_PVRTC4,36. /PVRTC的PVRTC2压缩格式37. kCCTexture2DPixelFormat_PVRTC2,38. 39. /默认格式RGBA888840. kCCTexture2DPixelFormat_Default=kCCTexture2DPixelFormat_RGBA8888,41. 42. /为了兼容性而保留的枚举值43. kTexture2DPi
11、xelFormat_RGBA8888=kCCTexture2DPixelFormat_RGBA8888,44. kTexture2DPixelFormat_RGB888=kCCTexture2DPixelFormat_RGB888,45. kTexture2DPixelFormat_RGB565=kCCTexture2DPixelFormat_RGB565,46. kTexture2DPixelFormat_A8=kCCTexture2DPixelFormat_A8,47. kTexture2DPixelFormat_RGBA4444=kCCTexture2DPixelFormat_RGBA4
12、444,48. kTexture2DPixelFormat_RGB5A1=kCCTexture2DPixelFormat_RGB5A1,49. kTexture2DPixelFormat_Default=kCCTexture2DPixelFormat_Default50. 51. CCTexture2DPixelFormat;52. 53. /需要使用Shader代码片段,这里声明一下54. classCCGLProgram;55. 56. /定义了纹理的一些参数57. typedefstruct_ccTexParams58. GLuintminFilter;/纹理过滤器:缩小过滤器59. G
13、LuintmagFilter;/纹理过滤器:放大过滤器60. GLuintwrapS;/横向纹理寻址模式61. GLuintwrapT;/纵向纹理寻址模式62. ccTexParams;63. 64. 65. /CCTexture2D类可以方便的从图片,文本或raw数据文件中创建OpenGL所用贴图,创建的贴图会自动转为2的幂次方大小,所以要注意对于贴图坐标的影响。66. 67. classCC_DLLCCTexture2D:publicCCObject68. 69. public:70. /构造71. CCTexture2D();72. /析构73. virtualCCTexture2D()
14、;74. /取得纹理的描述75. constchar*description(void);76. 77. /释放数据78. voidreleaseData(void*data);79. /保存数据80. void*keepData(void*data,unsignedintlength);81. 82. /由数据指针和指定的像素格式,图片宽高,来生成OpenGL贴图。83. boolinitWithData(constvoid*data,CCTexture2DPixelFormatpixelFormat,unsignedintpixelsWide,unsignedintpixelsHigh,constCCSize&contentSize);84.