《Cocos2D权威指南》——3.5 CCTexture纹理类

简介: 本节书摘来自华章计算机《Cocos2D权威指南》一书中的第3章,第3.5节,作者:王寒,屈光辉,周雪彬著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.5 CCTexture纹理类

游戏运行中,所有图像文件(PNG、PVR)都被加载成GPU可以理解的OpenGL ES纹理,而精灵则对应着这些纹理图。Cocos2D内置一个纹理缓存管理器(CCTextureCache)来保存这些纹理图,这样可以极大加速创建新精灵,并充分利用已有的纹理图。不利的是,如果收到内存警报,Cocos2D会将当前未使用的纹理图(即引用计数为1的纹理图)全部从内存中清除。
首先我们了解一下和纹理相关的概念。
3.5.1 纹理和纹理图集
所有游戏角色都是以图像的形式存储在iPhone和iPad设备的内存中,通常使用的格式是PNG或JPEG。这些图像一旦被加载入内存,它们将以一种未压缩的纹理格式来存储。PNG是苹果官方推荐的用于iOS设备的图像存储格式。
1 . 纹理(Texture)
游戏角色的图像文件在使用前必须解压缩,并转换成iPhone和iPad的GPU可以理解的格式,同时要加载进RAM(随机存储器),这样的图像称为纹理。GPU原生支持一系列压缩格式,如PVRTC,其他格式必须存储为未压缩的图像数据。OpenGL ES可以使用这些数据在屏幕上绘制图像,所使用的PNG图像文件虽然在闪存中不占用多少空间,但是因为要解压缩,所以会在内存中占用更大的空间。
2 . 纹理图集(TextureAtlas)
对于iPhone和iPad设备而言,内存是非常宝贵的。而且iOS设备的GPU使用共享显存,而不是独立显存,换句话说,GPU将使用主系统的内存来存储纹理图和几何图形。旧版iOS设备的内存是128MB。
让这种内存限制更捉襟见肘的是,旧版iOS设备中,图像填充到纹理中时,其长度和宽度必须使用2的乘方。虽然iPhone 3GS和iPhone 4、iPad等设备支持非2的乘方大小的纹理图,但在Cocos2D中,为了兼容所有设备,仍然使用2的乘方来填充纹理。当然,也可以在ccConfig.h文件中修改这一点。
为了节省内存空间,并减少纹理中的浪费空间,将把这些纹理拼合成为一个大的纹理图,称为纹理图集。纹理图集只是一个大的纹理图而已,其中包含所有的图像。想象有一大张纸,然后把自己的照片都贴在上面,在需要时从纸上把照片剪下来。如果想把所有照片一次性给别人,只需给这一大张纸就行,而不需一张张地递过去。OpenGL ES处理图像也是类似,如果使用纹理图集或精灵表单(Spritesheet)把所有图像一次性交给OpenGL ES来处理,比把单个图像逐个交给OpenGL ES处理要高效。
下面大致介绍CCTexture2D、CCTextureCache和CCTextureAtlas这三个纹理类。
3.5.2 CCTexture2D、CCTextureCache和CCTextureAtlas
在Cocos2D中,使用CCTexture2D(纹理)从图片、文本或源数据中创建OpenGL 2D纹理,所创建的纹理对象使用2的乘方来填充。根据创建CCTexture2D对象的方法不同,纹理的真实图片大小可能和纹理大小略有差异。另外需要注意的是,纹理内容通常是上下颠倒的!关于该类的更多内容,可以参考CCTexture2D.h。
CCTextureCache(纹理缓存)作为单例使用,用于加载和管理纹理。一旦纹理加载完成,下次使用时可使用它返回之前加载的纹理,从而减少对GPU和CPU内存的占用。关于该类的更多内容,大家可以参考CCTextureCache.h。
CCTextureAtlas(纹理图集)用来实现纹理图集。纹理图文件可以是PVRTC、PNG或任何Texture2D所支持的文件类型。CCTextureAtlas(纹理图集)可以对纹理图集的矩形进行实时的更新、添加、删除或重排序。关于该类的更多内容,大家可以参考CCTextureAtlas.h。
在Cocos2D的开发中,CCTexture2D和CCTextureCache在多个方法中都有体现,以CCSprite类的初始化方法之一为例:

-(id) initWithFile:(NSString*)filename rect:(CGRect)rect
{
      NSAssert(filename!=nil, @"Invalid filename for sprite");

      CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage: filename];
      if( texture )
            return [self initWithTexture:texture rect:rect];
      [self release];
      return nil;
}

以上方法中使用CCTextureCache的单例将图片文件添加到纹理缓存中,并创建一个CCTexture2D纹理对象。如果该纹理对象存在,则使用initWithTexture方法来创建精灵对象。initWithTexture的方法实现如下:

-(id) initWithTexture:(CCTexture2D*)texture rect:(CGRect)rect
{
      NSAssert(texture!=nil, @"Invalid texture for sprite");
      // IMPORTANT: [self init] and not [super init];
      if( (self = [self init]) )
      {
            [self setTexture:texture];
            [self setTextureRect:rect];
      }
      return self;
}

上述方法中指定用于渲染精灵对象的纹理,以及矩形大小。

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
负载均衡 前端开发 Cloud Native
API 网关选型及包含 BFF 的架构设计
在更通用的场景下我们会使用 NGINX 这样的软件做前置,用来处理SLB负载均衡过来的流量,作用是反向代理、集群负载均衡、转发、日志收集等功能。
API 网关选型及包含 BFF 的架构设计
|
11月前
|
SQL 安全 算法
解读 Python 3.14:模板字符串、惰性类型、Zstd压缩等7大核心功能升级
Python 3.14 引入了七大核心技术特性,大幅提升开发效率与应用安全性。其中包括:t-strings(PEP 750)提供更安全灵活的字符串处理;类型注解惰性求值(PEP 649)优化启动性能;外部调试器API标准化(PEP 768)增强调试体验;原生支持Zstandard压缩算法(PEP 784)提高效率;REPL交互环境升级更友好;UUID模块扩展支持新标准并优化性能;finally块语义强化(PEP 765)确保资源清理可靠性。这些改进使Python在后端开发、数据科学等领域更具竞争力。
560 5
解读 Python 3.14:模板字符串、惰性类型、Zstd压缩等7大核心功能升级
|
10月前
|
缓存 算法 NoSQL
校招 Java 面试高频常见知识点深度解析与实战案例详细分享
《2025校招Java面试核心指南》总结了Java技术栈的最新考点,涵盖基础语法、并发编程和云原生技术三大维度: 现代Java特性:重点解析Java 17密封类、Record类型及响应式Stream API,通过电商案例演示函数式数据处理 并发革命:对比传统线程池与Java 21虚拟线程,详解Reactor模式在秒杀系统中的应用及背压机制 云原生实践:提供Spring Boot容器化部署方案,分析Spring WebFlux响应式编程和Redis Cluster缓存策略。
298 0
|
11月前
|
开发者 Windows
鸿蒙5开发宝藏案例分享---一多窗口适配开发实践
本文为鸿蒙开发者分享HarmonyOS多窗口适配技巧,涵盖窗口断点自适应、横竖屏旋转策略、PC端自由窗口适配及沉浸式状态栏透明显方案。通过官方案例代码,解决折叠屏、小屏设备布局问题,提供设备兼容清单与避坑指南。重点包括动态监听窗口变化、宽高比判断、最小尺寸限制及全屏切换等配置。最后建议使用ohpm安装示例模板,借助DevEco预览器模拟多设备效果,并参考开发者社区解决问题。
|
缓存 开发框架 NoSQL
75道Java常考面试题+18篇面试疑难点解析|面试必看
Java工程师面试就看这一篇,75道常考面试题+18篇面试疑难点解析,正逢金三银四招聘季,小编会继续更新面试真题,也请大家多关注,一定要助你过关斩将,拿下心仪offer!
|
机器学习/深度学习 算法 Python
OpenAI Gym高级教程——解决实际问题与研究探索
OpenAI Gym高级教程——解决实际问题与研究探索
733 1
|
算法 计算机视觉 网络架构
CVPR 202:擅长处理复杂场景和语言表达,清华&博世提出全新实例分割网络架构MagNet
【5月更文挑战第10天】在CVPR 2024会议上,清华大学与博世团队推出MagNet,一种针对复杂场景和语言表达的实例分割网络。MagNet通过Mask Grounding辅助任务强化视觉-语言对应,缩小模态差距,并结合跨模态对齐损失与模块,提升RIS任务的准确性。在RefCOCO、RefCOCO+和G-Ref基准上取得显著优势,但对罕见表达和复杂场景的处理仍有待优化。[论文链接](https://arxiv.org/abs/2312.12198)
461 5
|
编译器 API 调度
JAX 中文文档(十二)(1)
JAX 中文文档(十二)
370 0
|
Linux 开发工具
如何在 centos 7 中修改内核启动顺序
CentOS 7是CentOS项目发布的开源类服务器操作系统,于2014年7月7日正式发布。对于Centos 7 grub 配置有改变,如何修改?
如何在 centos 7 中修改内核启动顺序

热门文章

最新文章

下一篇
开通oss服务