当前位置: 首页 > news >正文

Unity中实现动态图集算法

在 Unity 中,动态图集(Dynamic Atlas)是一种在运行时将多个纹理合并成一个大纹理图集的技术,这样可以减少渲染时的纹理切换次数,提高渲染效率。
实现原理:
动态图集的核心思想是在运行时动态地将多个小纹理合并到一个大的纹理中,形成一个纹理图集。

主要步骤如下:
创建一个大的空白纹理:作为最终的纹理图集。
纹理分配:使用合适的算法将小纹理放置在大纹理的空闲区域。
复制纹理数据:将小纹理的数据复制到大纹理的相应位置。
更新材质和 UV 映射:使用新的纹理图集更新材质,并调整 UV 映射以正确显示小纹理。

定义图集的基础属性:

    // 图集的宽度public int atlasWidth = 1024;// 图集的高度public int atlasHeight = 1024;// 要合并的纹理列表public List<Texture2D> texturesToMerge;// 最终生成的图集纹理private Texture2D atlasTexture;// 每个纹理在图集中的位置和大小信息private List<Rect> textureRects;

然后导入几张图片

并且图片的Read/Write属性要打开,

否则会报如下错:

然后创建一个Texture2D

 atlasTexture = new Texture2D(atlasWidth, atlasHeight, TextureFormat.RGBA32, false);

使用 Texture2D中的PackTextures方法(其中纹理匹配算法使用的是Unity内置的矩形装箱算法),将多个纹理打包到一个纹理图集中:

textureRects = new List<Rect>(atlasTexture.PackTextures(texturesToMerge.ToArray(), 2, atlasWidth));

结果:使用RawImage显示合并后的图集

纹理分配算法:
1. 四叉树算法(Quadtree Algorithm)
原理:
将大纹理(容器)看作一个根节点,不断将其递归地分割成四个子节点(四叉),直到每个子节点要么完全被一个纹理占据,要么太小无法再放置纹理。
放置纹理时,从根节点开始检查,如果当前节点能容纳该纹理,则尝试将其放入该节点;如果不能,则递归地检查其子节点。
优点:
适合处理动态变化的纹理集合,插入和删除纹理相对方便。
可以较好地处理不同尺寸的纹理。
缺点:
实现相对复杂,需要维护四叉树的数据结构。
可能会产生较多的小空闲区域,导致空间利用率不高。
2. 遗传算法(Genetic Algorithm)
原理:
把矩形的放置方案看作一个染色体,每个染色体包含多个基因(每个基因代表一个矩形的放置位置)。
初始化一个包含多个染色体的种群,通过选择、交叉和变异等遗传操作不断进化种群,直到找到最优或近似最优的放置方案。
优点:
理论上可以找到全局最优解或接近全局最优解。
可以处理复杂的约束条件。
缺点:
计算复杂度高,需要较长的计算时间。
参数调整比较困难,不同的参数设置可能会导致不同的结果。
3.矩形装箱算法:
优点:
简单易懂,实现相对容易。
能在一定程度上减少空间浪费,提高容器的利用率。
缺点:
可能无法得到最优解,尤其是对于复杂的矩形组合。
时间复杂度较高,对于大量矩形的情况,性能可能会受到影响。

具体实现:

相关实现链接:

Unite 2016 - Building Sprite Sheets at Runtime (Top Eleven, Nordeus) - YouTube

DynamicSpriteSheets/DynamicAtlasses/TexturePacker.cs at master · dusanst/DynamicSpriteSheets (github.com)

tkonexhh/DynamicAtlas (github.com)

DaVikingCode/UnityRuntimeSpriteSheetsGenerator: Unity – generate SpriteSheets at runtime! (github.com)

相关文章:

Unity中实现动态图集算法

在 Unity 中&#xff0c;动态图集&#xff08;Dynamic Atlas&#xff09;是一种在运行时将多个纹理合并成一个大纹理图集的技术&#xff0c;这样可以减少渲染时的纹理切换次数&#xff0c;提高渲染效率。 实现原理&#xff1a; 动态图集的核心思想是在运行时动态地将多个小纹理…...

MySQL中的覆盖索引的使用

文章目录 1. 覆盖索引的定义2. 覆盖索引的工作原理2.1 索引和回表2.2 如何实现覆盖索引 3. 覆盖索引的优势4. 覆盖索引的限制5. 创建和优化覆盖索引5.1 分析查询模式5.2 确定需要覆盖的列5.3 创建复合索引5.4 使用覆盖索引优化查询5.5 避免过度索引5.6 索引整理与优化 6. 实际应…...

XML DOM

XML DOM XML DOM(Document Object Model)是一种用于访问和操作XML文档的标准方式。它提供了一种树形结构来表示XML文档,使得开发者能够方便地对XML数据进行读取、修改和操作。本文将详细介绍XML DOM的基本概念、结构、操作方法以及应用场景。 一、XML DOM的基本概念 XML …...

[开源]MaxKb+Ollama 构建RAG私有化知识库

MaxKbOllama&#xff0c;基于RAG方案构专属私有知识库 关于RAG工作原理实现方案 一、什么是MaxKb&#xff1f;二、MaxKb的核心功能三、MaxKb的安装与使用四、MaxKb的适用场景五、安装方案、 docker版Docker Desktop安装配置MaxKb安装和配置 总结和问题 MaxKB 是一款基于 LLM 大…...

迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试

将编译好的镜像全部进行烧写&#xff0c;镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后&#xff0c;在调试串口查看打印日志&#xff0c;如下图所示&#xff1a; 然后打开 hdc 工具&#xff0c;运行测试程序&#xff0c;输入“led_test 1”&…...

将Mac上Python程序的虚拟环境搬到Windows

1. 导出Mac上Python虚拟环境的依赖 cd py && source venv/bin/activate && pip freeze > requirements.txt 2. 在Windows上创建一个新的虚拟环境 python -m venv venv 3. 激活虚拟环境 venv\Scripts\activate 4. 安装依赖 pip install -r requiremen…...

大语言模型评价 怎么实现去偏见处理

大语言模型评价 怎么实现去偏见处理 在训练大语言模型(LLMs)时,去偏处理对于避免模型学习到带有偏见的模式至关重要,以下从数据处理、模型训练、评估监测三个阶段介绍具体实现方法,并结合招聘场景进行举例说明: 数据处理阶段 数据清洗:仔细审查并剔除包含明显偏见的训练…...

3.React 组件化开发

react&#xff1a;版本 18.2.0node&#xff1a; 版本18.19.1脚手架&#xff1a;版本 5.0.1 一、类组件 (一) 一个干净的脚手架 【1】使用已经被废弃的 CRA (create-react-app) create-react-app 已经被废弃&#xff0c;且目前使用会报错&#xff0c;官方已经不推荐使用&…...

19vue3实战-----菜单子树的展示

19vue3实战-----菜单子树的展示 1.实现目标2.实现思路3.实现步骤3.1新建config配置文件3.2封装组件3.3使用组件 1.实现目标 如上,以上效果的难点是“在表格里面实现树形结构”。可以用element-plus框架中的table作为辅助: 可以自己查看文档了解怎么使用。 2.实现思路 上面的…...

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库

文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…...

JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能?

JDK 17 和 JDK 21 在垃圾回收器&#xff08;GC&#xff09;上有什么优化&#xff1f;如何调整 GC 算法以提升应用性能&#xff1f; 本文将从 JDK 17 与 JDK 21 的垃圾回收改进出发&#xff0c;结合代码示例解析优化方案&#xff0c;并提供实际项目中的调优策略&#xff0c;帮助…...

CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机和环境问题的日…...

kotlin中expect和actual关键字修饰的函数作用

在 Kotlin 多平台编程中&#xff0c;expect 和 actual 关键字用于定义跨平台的抽象和具体实现。这种机制允许开发者声明一个平台无关的接口或函数签名&#xff08;使用 expect&#xff09;&#xff0c;然后在每个目标平台上提供具体的实现&#xff08;使用 actual&#xff09;。…...

鸿蒙音视频播放器:libwlmedia

libwlmedia 跨平台播放器wlmedia现在已经支持了鸿蒙(Harmony)平台了&#xff0c;SDK插件地址&#xff1a;libwlmedia 一、接入SDK 1.1 导入SDK ohpm i ywl5320/libwlmedia1.2 添加权限&#xff08;可选&#xff09; 如果需要播放网络视频&#xff0c;需要添加网络权限 #m…...

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库

一、场景说明 场景&#xff1a; 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态&#xff0c;即&#xff1a;Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…...

CEF132编译指南 MacOS 篇 - 构建 CEF (六)

1. 引言 经过前面一系列的精心准备&#xff0c;我们已经完成了所有必要的环境配置和源码获取工作。本篇作为 CEF132 编译指南系列的第六篇&#xff0c;将详细介绍如何在 macOS 系统上构建 CEF132。通过配置正确的编译命令和参数&#xff0c;我们将完成 CEF 的构建工作&#xf…...

mysql大数据量分页查询

一、什么是‌MySQL大数据量分页查&#xff1f; MySQL大数据量分页查‌是指在使用MySQL数据库时&#xff0c;将大量数据分成多个较小的部分进行显示&#xff0c;以提高查询效率和用户体验。分页查询通常用于网页或应用程序中&#xff0c;以便用户能够逐步浏览结果集。 二、为什…...

计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

尚硅谷爬虫note003

一、函数 1. 函数的定义 def 函数名&#xff08;&#xff09;&#xff1a; 代码 2.函数的调用 函数名&#xff08;&#xff09; 3. 定义参数&#xff08;不调用函数不执行&#xff09; def sum&#xff08;a&#xff0c;b&#xff09; #形参 c a b print&#xff08;c&…...

【逆向工程】破解unity的安卓apk包

先了解一下普通apk包的逆向方法&#xff08;无加密或加壳&#xff09; 开发环境&#xff1a; 操作系统&#xff1a;windows 解apk包 下载工具&#xff1a;apktool【Install Guide | Apktool】按照文档说的操作就行&#xff0c;先安装java运行时环境【我安装的是jre-8u441-wind…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...