TexturePacker使用详解

2023-12-22 08:18
文章标签 使用 详解 texturepacker

本文主要是介绍TexturePacker使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TexturePacker是一款把若干资源图片拼接为一张大图的合图工具,在游戏开发以及网页制作中经常会使用到这个工具。为什么需要使用这个工具呢?

1.我们知道,大部分游戏引擎底层的渲染方式都是基于OpenGL的,但是,你知道吗?OpenGL载入纹理图片时,所用内存会自动扩张到2的N次方。比如,一张图片的大小为10*10像素,OpenGL会按照16*16的规格将图片载入到内存中;如果图片大小为64*65,那么就会按照64*128载入了,这就造成了内存的无必要开销。

具体浪费了多少内存空间呢?

我们这里需要了解一个概念:图片格式(Image format)。图片格式有RGBA8888、RGBA4444、RGBA5555、RGB888等等。假如我们使用的图片格式为RGBA8888,也就是说图片每个像素点都由R、G、B、A4个值组成,每个值占用8位(值为0-255),那么一个像素点会占用8位*4=32位=4字节。所以图片大小为64*65时我们按照64*128载入,此时会造成64*(128-65)*4字节=16128字节=15.75KB的内存空间浪费,要知道整张图片的大小才有64*65*4/1024=16.25KB。

所以,在游戏开发使用图片资源时,我们要尽量保证图片的大小在接近且不大于2的整数倍,理想状态下,如果每一张图的长宽都恰好是2的n次方数值,就不会有任何浪费了。TexturePacker正是帮助我们将图片资源进行这样优化的一款软件。

2.另外,TexturePacker不仅能帮助我们在加载图片时节省内存,它将很多小图拼接成一张大图后,合成的大图会比之前所有的散图所占用的物理存储更小,也许一堆散图的大小为20KB,将它们合成一张大图后可能就变成了10KB,这样便从而通过减小图片资源物理存储大小起到压缩游戏安装包的作用。

3.最后,将很多小图拼接成一张大图,载入内存时一次载入,提高了载入速度。

 

二.如何获得TexturePacker的激活码

一般我们下载的TP都是试用7天的,但是TexturePacker的作者Andreas人很nice,你可以向他申请激活码:https://www.codeandweb.com/request-free-license ,不过要求就是你自己要有关于游戏开发的博客,Andreas会根据你的博客决定是否给你激活码:

 

 一般申请几天后就会有回复(在这里还要谢谢Andreas啦):

 

 

 

三.使用TexturePacker合图

 

TP这个软件其实很好用。打开TexturePacker软件:

我们先看软件最上方的选项:

 

分别为:新创建一个TP工程;

打开一个文件夹;

保存现在对图片的操作;

添加一些图片;

添加一个文件夹里的所有图片;

删除正在操作的图片;

发布TP工程。

 

这里有还一些地方需要注意:

1.Output-DataFormat:压缩成支持什么引擎的文件,如cocos、unity等:

 

 

2.Geometry-Size constraints :

POT(Power of 2):导出的大图为大小是2的N次方的方形图;

Anysize:任何尺寸都可以,所以它导出的图的尺寸是最小的;

NPOT(Anysize but power of 2)与POT区别就是导出的图为矩形。

 

 

3.Output-Image format:图片格式,上面提到过,比如RGBA8888,图片每一个像素点由R、G、B、A四个值组成,每个值占8位。

我们看软件的右下角显示的size,这就是合图加载到内存中会占用的内存大小:

 

若选择RGBA4444占用的内存大小会减少一半,这样会节省一倍内存,代价就是图片质量有损失,但由于算法存在这种损失是极小的。

 

我们新建一个项目,导入图片资源并设置相关属性,就可以发布了。这里我将6个按钮图片合成了一张大图。发布后会生成两个文件,一个保存各图片信息的.plist文件和一个.png格式的大图。

          

 

 

四.使用代码加载合图,并创建sprite

用TP发布出来文件后,接下来我们要在工程项目中通过代码使用合图。

在这之前我们要将.plist和.png文件拷到工程的res文件目录下;

1.首先需要加载合图

 

[cpp]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. //加载TP文件  
  2. //参数:1.plist文件名 2.png文件名  
  3. SpriteFrameCache::getInstance()->addSpriteFramesWithFile("TPtest.plist","TPtest.png");  

可以看到,我们通过精灵帧缓存的单例对象将合图加载到了工程中,使用的方法为addSpriteFramesWithFile(),也就是说合图中的图片资源都是以精灵帧的形式存储起来的

 

2.加载完资源后,我们就可以使用合图里的图片资源了。比如之前我的博客中讲过精灵的3种创建方法,其中有一种就是通过精灵帧创建精灵

 

[cpp]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. //使用TP合图里的资源创建精灵  
  2. auto _sprite = Sprite::createWithSpriteFrameName("Button01.png");  
  3. addChild(_sprite);  

运行结果:

 

 

 

以上。

这篇关于TexturePacker使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/523230

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker