当前位置: 首页 > 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…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...