【Unity Optimize】使用图集(Sprite Atlas)优化项目

news2024/12/23 13:50:33

目录

  • 1 图集(Sprite Atlas)介绍
  • 2 创建与配置Sprite Atlas
    • 2.1 创建Sprite Atlas
      • 2.1.1 Unity2D项目
      • 2.1.2 Unity3D项目
    • 2.2 配置Sprite Atlas
    • 2.3 注意事项
  • 3 Sprite Atlas的接口
  • 4 Sprite Atlas的优化建议

1 图集(Sprite Atlas)介绍

Unity中的图集(Sprite Atlas)是一种用于优化游戏性能和内存的纹理集。Sprite Atlas 可以应用于 2D 和 3D 项目中的 UI、粒子系统、贴图等等。

使用Unity可以很方便地创建Sprite Atlas,只需要创建一个Sprite Atlas GameObject,然后将纹理分配给它。在创建Sprite Atlas时,需要将纹理名称按角色或功能组织好,并设置好导入设置。随着纹理的添加,Unity会自动按照最优布局将它们分配到Sprite Atlas上,以便GPU可以批量处理而不是单独处理它们。而如果纹理不能完全填充Sprite Atlas,则可以将多个Sprite Atlas组合在一起以最大化空间利用。

2 创建与配置Sprite Atlas

2.1 创建Sprite Atlas

2.1.1 Unity2D项目

在Unity 2D的项目中,在Project面板中Assets文件夹处右键Create → 2D → Sprite Atlas,创建一个Sprite Atlas。
在这里插入图片描述

2.1.2 Unity3D项目

在Unity 3D的项目中,需要在设置中开启图集,在Project面板中才能创建Sprite Atlas。
菜单栏Edit → Project Settings → 左侧栏找到Editor → 右侧找到Sprite Packer,其中Mode属性根据需要进行选择(默认是Disabled)。

在这里插入图片描述

另外,还需要安装2D Sprite包,菜单栏Window → Package Manager:

Sprite包

包安装完成后,也是同样的方法创建Sprite Atlas:

在这里插入图片描述

2.2 配置Sprite Atlas

在Project面板中点击新建的Sprite Atlas,观察其Inspector面板的属性:

  • Type:Master或Variant。将 Master Sprite Atlas 和 Variant Sprite Atlas 相结合可以极大地简化 2D 游戏资源的管理。

    • Master:Master Sprite Atlas 包含一组 Sprite,以及所有 Sprite 公用的纹理信息。在创建和编辑 Master Sprite Atlas 时,不需要考虑具体的解析度或平台,只需要将 Sprite 以及 Sprite 的纹理材质添加到其中即可。Master Sprite Atlas 中将 Sprite 打包到同一个纹理中,来增加 Sprite 的渲染效率。
      在这里插入图片描述

    • Variant:Variant Sprite Atlas 利用 Master Sprite Atlas,并将其分配给不同的平台或解析度,生成各种不同的纹理变体。Variant Sprite Atlas 由预配置的 Platform-specific Sprite Atlas 生成,这些预配置可能考虑到最终运行的平台和设备。其中,修改Scale可改变Sprite Atlas的分辨率。
      在这里插入图片描述

  • Include in Build:是否将 Sprite Atlas 包含在构建中。

    • 如果该选项未勾选,则 Sprite Atlas 不会包含在构建中,并且需要在游戏中手动加载。
    • 如果该选项勾选,则 Sprite Atlas 将自动包含在构建中。
  • Allow Rotation:是否允许旋转 Sprite。

    • 若勾选,打包器可以旋转 Sprite 来尽可能地填充空白区域。
    • 建议勾选来提高打包效果。
  • Tight Packing:是否启用精确包装技术。

    • 若启用,打包器会更精确地计算 Sprite 的边界,但也会占用更多的内存。
    • 对于资源比较紧张的情况,建议关闭。
  • Alpha Dilation:是否应用 Alpha Dilation 过滤。这对于提高 Sprite 的渲染质量非常有用,例如,在精灵放大时防止出现锯齿状的边缘。

  • Padding:设置打包 Sprites 时的填充量,用于控制 Sprites 相互之间的距离,避免 Atlas 中 Sprites 之间相互重叠或发生边角过渡, 可以设置为 2、4 或 8 像素。

  • Read/Write:是否允许 Sprite Atlas 中纹理的读写操作。

    • 如果不需要修改 Sprite 的像素数据,建议关闭此选项以提高性能和内存占用。
  • Generate Mip Maps:是否生成 Mipmap。

    • 如果游戏需要远距离呈现纹理,建议启用此选项以提高图像质量和性能。
  • sRGB: 是否启用 sRGB 格式。

    • 如果勾选该选项,则使用 sRGB 格式;否则,将使用线性格式。
  • Filter Mode:设置 Sprite Atlas 的纹理过滤模式,可以选择Trilinear、Bilinear 或 Point。

    • 在 Trilinear 模式中,使用三个 MIP 来平滑渐进细节。
    • 在 Bilinear 模式中,使用两个 MIP来平滑渐进细节。
    • 在 Point 模式中,则显示 Texture 中最接近目标像素的 Texel。
  • Show Platform Settings For:指定各个平台的配置。可以设置各个平台支持的纹理分辨率、最大 Sprite 尺寸等。

    • Max Texture Size:纹理的最大分辨率。在选择时,需要考虑到各种设备的能力和支持分辨率的差异。
    • Format:纹理的格式。通过选择不同格式,在质量、大小和运行时性能之间找到最佳平衡。
      • Automatic: Unity 默认的设置。它允许 Unity 自动选择最适合的像素格式。在大多数情况下,这是最佳选择。
      • RGBA 32 bit:这是最常见的像素格式之一,包含 RGBA 四个通道。使用这种格式可以提供最高的图像质量,但是也会需要更多的内存和带宽。
      • RGB 16 bit:这种格式使用更少的内存,但同时也会占用更少的带宽。它只包含 RGB 通道,因此如果图像不需要 alpha 通道时,可选择该格式。
      • RGB 24 bit:这种格式也只包含 RGB 通道,但是它的每个通道比 RGB 16 bit 更精细,所以占用的空间也更大。
      • R 8:这种格式只包含一个通道,因此它主要用于存储高度图、灯光图等单通道数据的纹理。
      • R 16 bit:这种格式也只包含一个通道,但是每个通道都使用更多内存来储存更高的精度。
      • Alpha 8:这种格式只包含 alpha 通道,对于只需要一些简单的透明度信息的情况下,Alpha 8 是最合适的选择,因为它只占用很少的内存。
    • Compression:压缩质量。可以根据需要选择Low Quality、Normal Quality和High Quality。压缩质量越高,代表压缩的压缩率越高,但同时也会对纹理的质量产生更明显的影响,可能会导致图像细节的损失。高质量的压缩会导致更大的纹理大小,这可能会在某些平台上导致性能问题。
    • Use Crunch Compression:是否选择使用零延迟压缩(Crunch Compression)算法。这种算法可以以更小的体积存储纹理,同时保留更高的品质和更短的加载时间。但是,Crunch 压缩需要一些时间来进行压缩,因此可能会增加构建时间。
  • Objects for Packing:将 Sprite Atlas 的 Sprites 打包到哪个 Atlas 中。

    • 可以选择文件夹,纹理或单个Sprite。
    • 如果留空,则 Unity 将尝试将 Sprite 打包到所有的 Sprite Atlas 中。
  • Pack Preview:点击该按钮即可显示 Unity 将如何布置 Sprite 的预览。
    在这里插入图片描述

2.3 注意事项

  • UGUI打包Sprite Atlas不能勾选Tight Packing,否则Sprite会重叠显示。
    • UGUI 是基于矩形的图形渲染,因此它对每个子图片都使用一个矩形进行渲染。如果勾选了 Tight Packing 选项,UGUI 将会使用紧凑堆叠的方式将矩形放置在一起。然而,如果子图片是非方形或者存在旋转,则这种堆叠方式会导致矩形相互交叉,使显示效果不正确。
  • 而Sprite Renderer可以勾选Tight Packing。
    • Sprite Renderer 在处理 Sprite 图集时,会基于 Sprite 的非透明部分生成网格,因此可以使用旋转和/或紧密堆叠的 Sprite。Sprite Renderer 组件的 Tight Packing 选项只是为了节省纹理的空间占用,它不会影响 Sprite 的显示效果。
  • Spine的图集PNG打包到 Unity 的 Sprite Atlas 中,因为内存会变两份,
    • Spine 是直接读取图集 PNG,并不会自动关联到 SpriteAtlas 里的图片。将 Spine 图集 PNG 打包到 Unity 的 Sprite Atlas 中会导致内存占用变成两份,造成资源浪费。

3 Sprite Atlas的接口

Sprite Atlas 提供了一些接口,可以方便地创建、管理和访问 Sprites,以下是 Sprite Atlas 的常用访问接口示例,参考API接口-SpriteAtlasExtensions:

using UnityEditor;
using UnityEditor.U2D;
using UnityEngine;
using UnityEngine.U2D;

public class AtlasAPI : MonoBehaviour
{
    public Texture2D[] textures; // 存储图片的数组

    // Start is called before the first frame update
    void Start()
    {
        // 创建 SpriteAtlas
        SpriteAtlas spriteAtlas = new SpriteAtlas();

        // 将图片添加到 SpriteAtlas
        foreach (Texture2D texture in textures)
        {
            // 创建 Sprite 对象
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
            // 添加到 SpriteAtlas 中
            spriteAtlas.Add(new Sprite[] { sprite });
        }

        // 将创建的 SpriteAtlas 保存为 .spriteatlas 文件
        AssetDatabase.CreateAsset(spriteAtlas, "Assets/NewSpriteAtlas.spriteatlas");
        AssetDatabase.Refresh();

        // 获取当前平台的名称
        spriteAtlas.GetPlatformSettings(GetPlatformName(EditorUserBuildSettings.activeBuildTarget));
        // 修改对应平台上的图集设置
        spriteAtlas.SetPlatformSettings(new TextureImporterPlatformSettings
        {
            maxTextureSize = 2048,
            textureCompression = TextureImporterCompression.CompressedHQ,
            format = TextureImporterFormat.Automatic,
        });

    }

    string GetPlatformName(BuildTarget target)
    {
        string platformName = "";
        switch (target)
        {
            case BuildTarget.Android:
                platformName = "Android";
                break;
            case BuildTarget.iOS:
                platformName = "iPhone";
                break;
            case BuildTarget.PS4:
                platformName = "PS4";
                break;
            case BuildTarget.XboxOne:
                platformName = "XboxOne";
                break;
            case BuildTarget.NoTarget:
                platformName = "DefaultTexturePlatform";
                break;
            default:
                platformName = "Standalone";
                break;
        }
        return platformName;
    }
}

4 Sprite Atlas的优化建议

以下是一些使用 Sprite Atlas 优化游戏的建议:

  • 将相同尺寸和类型的 Sprite 放在同一个 Sprite Atlas 中。

  • 压缩 Sprite 像素格式。

  • 允许旋转 Sprite 会增加 Sprite Atlas 中可以打包的精灵数量。

  • 确保 Sprite Atlas 大小不会超过硬件设备支持的最大纹理大小。

  • 在运行时按需异步加载和卸载 Sprite Atlas。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3+element plus+vite 引入本地静态资源图片require报错的原因和解决方案,以及如何在表格中展示图片

文章目录 一、vue3element plusvite 引入本地静态资源图片require报错的原因和解决方案二、vue 3element plusvite 项目中,在el-table中展示本地静态图片总结 一、vue3element plusvite 引入本地静态资源图片require报错的原因和解决方案 在写vue3vite项目的过程中…

Java-代码连接数据库生成POJO、Mapper

本文主要介绍如何在IDEA中,编写代码连接数据库生成对应的POJO、Mapper、Service、Controller 文章目录 前言环境搭建代码开发基本配置常量信息代码生成 测试结果 前言 在实际开发中,设计完数据库后,不可避免需要创建数据库表对应的POJO&…

rt-thread汇总

finish和msh的区别? 这个问题我一直没搞懂,可能得看一下源码才能搞清楚了吧 通过Qemu运行RT-Thread 在windows上通过QEMU快速上手RT-thread smart RT-thread启动流程 rt-thread启动流程 Kconfig语法 Kconfig语法 LOG输出 rt_kprintf("Hello …

InsCode AI ,你的良师益友!

Chat-GTP的火爆程度相信大家已经听说了,也对它有一个基本的初识,它是Open AI所研发的,读者当中应该有不少人已经接触和体验人工智能聊天,以及使用它交流很多问题有关于生活,学习等,而 InsCode AI 也一样能够…

javaWeb ssh学堂在线管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh学堂在线管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

30天从入门到精通TensorFlow1.x 第三天,tf.variable_scope()共享或重用变量

tf.variable_scope()共享或重用变量 文章目录 一、接前一天二、tf.variable_scope()共享或重用变量1. 背景2. 目的3. tf.variable_scope()基本参数3. tf.variable_scope()作用(1).命名空间(2).共享变量(3).…

软考A计划-电子商务设计师-电子商务相关技术与应用基础知识

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

cesium 相机相关

1 相机的初始位置 /*** The default rectangle the camera will view on creation.* type Rectangle*/ Camera.DEFAULT_VIEW_RECTANGLE Rectangle.fromDegrees(-95.0,-20.0,-70.0,90.0 );// set default view rectangleCameraPosition3D(this,Camera.DEFAULT_VIEW_RECTANGLE,…

Async 使用详解

Spring Boot异步调用Async 在实际开发中,有时候为了及时处理请求和进行响应,我们可能会多任务同时执行,或者先处理主任务,也就是异步调用,异步调用的实现有很多,例如多线程、定时任务、消息队列等&#xf…

若依框架快速搭建(二)

目录 数据库设计功能模块设计XXX信息管理xxx查询xxx添加xxx删除xxx修改xxx导出 功能模块实现运行数据库自动代码生成在IDEA中找到RuoYi-generator,修改配置运行前后端项目,在网页中找到代码生成模块导入表后点击确定,序号前打勾,再…

Mac - 光标特效 By CursorEffect2

目录 一.引言 二.安装 CursorEffect2 三.使用 CursorEffect2 四.使用效果 五.内存消耗 六.一键关闭 七.总结 一.引言 在自己搭建的 Hexo 博客上可以定义鼠标点击的特效,如图点击后可以产生彩色的斑点。 于是想着除了浏览 Hexo 博客外,能不能别的也…

【笔试强训编程题】Day1.(组队竞赛100449)和(删除公共字符69390)

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训编程题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!! 文章目录…

【CSS3系列】第一章 · CSS3新增的三种基本属性

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

FineBI6.0基础学习第一课 数据门户

PC端门户使用示例 首先,以管理员身份登录FineBI系统,安装数据门户,安装步骤见官网 新建一个数据门户

SouapUI接口测试之创建性能测试

SouapUI也是一个能生动的体现一个系统(项目)性能状态的工具,本篇就来说说如何在SouapUI工具下创建性能测试 一、创建测试用例 由于在《SouapUI接口测试之使用Excel进行参数化》篇已经创建好了测试用例,本篇就不讲解如何创建测试…

SpringCloudAlibaba:服务网关之Gateway学习

目录 一、网关简介 (一)为什么要用网关 (二)网关解决了什么问题 (三)常用的网关 二、Gateway简介 (一)核心概念 (二)工作原理 三、Gateway快速入门 &…

linuxOPS基础_用户与组管理

linux用户与组概念 为什么需要了解用户和组 服务器要添加多账户的作用 ​ 针对不同用户分配不同的权限,不同权限可以限制用户可以访问到的系统资源 ​ 提高系统的安全性 ​ 帮助系统管理员对使用系统的用户进行跟踪 用户和组的关系 理论上Linux系统中的每个用户…

2023年6月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

日本原装Yokogawa AQ6317B横河AQ6317C光谱分析仪

Yokogawa AQ6317B光谱分析仪,50 GHz ​Yokogawa AQ6317B 光谱分析仪 (OSA) 是一款先进的光谱分析仪,应用范围广泛,包括光源评估、光学设备损耗波长特性的测量以及 WDM(波分复用)系统的波形分析。在 Yokogawa 购买产品…

第十七篇、基于Arduino uno,获取cp2d12红外测距传感器的原始值和距离值——结果导向

0、结果 说明:先来看看串口调试助手显示的结果,第一个值是原始的模拟电压值,第二个值是距离值,如果是你想要的,可以接着往下看。 1、外观 说明:虽然红外测距传感器形态各异,但是原理和代码都是…