【Unity3D优化】使用ASTC压缩格式优化内存
在Unity3D手游开发中,合理选择纹理压缩格式对于优化内存占用、提高渲染效率至关重要。本文将记录近期在项目内进行的图片压缩格式优化过程,重点介绍从ETC2到ASTC 5x5的优化方案及其带来的收益。
1. 现状分析:从ETC2到ASTC 6x6 block
在项目初期,统一采用ETC2作为主要的纹理压缩格式。这种格式在Android设备上的兼容性较好,但在细节表现和压缩效率上仍有优化空间。
通过测试,我发现 ASTC 6x6 block 可以在与ETC2相同的视觉质量下提供更好的压缩率。因此,我开始尝试将资源从ETC2转换为ASTC 6x6,并观察其对内存使用和加载性能的影响。
2. 选择ASTC 6x6作为主要格式
2.1 兼容性检查
虽然ETC2几乎在所有OpenGL ES 3.0及以上的设备上均受支持,但 ASTC 在现代设备上的支持率也非常高。为了确保兼容性,我们通过以下方法进行设备支持性检测:
// 检查设备是否支持ASTC 6x6
bool supportsASTC6x6 = SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_6x6);
// 检查设备是否支持ASTC 5x5
bool supportsASTC5x5 = SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_5x5);
同时,我们也确保设备支持OpenGL ES 3.0,避免兼容性问题:
public static bool CheckSupportOpenGLES3()
{GraphicsDeviceType deviceType = SystemInfo.graphicsDeviceType;return deviceType == GraphicsDeviceType.OpenGLES3;
}
通过广泛的数据收集和日志记录,发现项目用户绝大多数设备都支持 ASTC 格式,因此决定将其作为主要的压缩格式。
3. 相关配套优化
3.1 自动检查格式工具的修改
为了自动化这一优化过程,我们对内部的资源检测工具进行了修改,使其能够:
-
自动检测并转换符合条件的ETC2纹理为ASTC
-
对于某些 不希望被压缩 的纹理(如RGBA32格式的特殊资源),保持原样,不进行转换。
-
允许手动标记精度要求较高的资源,自动选择 ASTC 4x4 或 ASTC 5x5 作为替代方案。
3.2 资源包适配不同设备
为了兼容少部分不支持ASTC的设备,我们采取了 双版本资源方案:
-
打包时生成两套资源:
-
ASTC 5x5 版本:大多数设备加载该版本,减少内存占用。
-
ETC2 版本:兼容性回退版本,仅用于不支持ASTC的设备。
-
-
运行时判断设备支持情况,选择合适的资源下载:
if (SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_5x5) && SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_6x6) && CheckSupportOpenGLES3())
{// 下载ASTC版本资源
}
else
{// 下载ETC2版本资源
}
3.3 纹理效果测试与优化
除了兼容性优化外,还针对纹理的视觉效果进行了测试。
-
半透明渐变纹理问题:
-
发现某些带有半透明渐变的图片在使用ASTC压缩后会出现明显的“色带”(banding)现象。
-
解决方案:对于这类资源,继续使用 ETC2 或者 RGBA32。
-
-
高精度纹理优化:
-
某些对细节要求较高的纹理可以使用 ASTC 4x4 或 ASTC 5x5 替代 RGBA32。
-
结果表明,这样的替换方案在大多数情况下都能保持良好的画质,同时大幅减少内存占用。
-
4. 优化成果总结
经过以上优化,取得了以下成果:
-
内存占用降低了30% 以上,有效减少了RAM压力。
-
ASTC 6x6 block的包体大小甚至比ETC2还小点,由于有部分精度为5x5和4x4以及保留不压缩的格式,至少在包体大小没有变大甚至有优化的情况下,实现了更精细的精度控制。
-
加载性能优化,由于ASTC的高效压缩,资源的磁盘占用也相应减少。
-
兼容性良好,通过自动检测设备支持情况,确保了游戏在不同设备上的稳定运行。
-
视觉效果优化,针对特定场景调整了压缩方案,避免了画质损失。
5. 结论
本次优化充分利用了ASTC的压缩优势,使项目在保证兼容性的同时,大幅降低了内存占用。对于现代移动游戏来说,合理选择纹理压缩格式可以带来显著的性能收益,也值得在后续的优化中持续关注和改进。
相关文章:
【Unity3D优化】使用ASTC压缩格式优化内存
在Unity3D手游开发中,合理选择纹理压缩格式对于优化内存占用、提高渲染效率至关重要。本文将记录近期在项目内进行的图片压缩格式优化过程,重点介绍从ETC2到ASTC 5x5的优化方案及其带来的收益。 1. 现状分析:从ETC2到ASTC 6x6 block 在项目…...
iptables网络安全服务详细使用
iptables防火墙概念说明 开源的基于数据包过滤的网络安全策略控制工具。 centos6.9 --- 默认防火墙工具软件iptables centos7 --- 默认防火墙工具软件firewalld(zone) iptables主要工作在OSI七层的二、三、四层,如果重新编译内核&…...
MiC建筑引领未来:中建海龙的探索与实践
随着全球城市化进程的加速推进,建筑行业正面临着前所未有的挑战与机遇。如何高效、环保地建造高质量的建筑,成为了行业内外普遍关注的焦点。在此背景下,MiC(Modular Integrated Construction,模块化集成建筑࿰…...
清华精品资料:DeepSeek从入门到精通、DeepSeek赋能职场
今天电脑天空给大家推荐2份清华大学专家编写的DeepSeek的使用手册,分别是《DeepSeek从入门到精通》和《DeepSeek赋能职场》。 《DeepSeek从入门到精通》是一本系统化的技术指南,旨在帮助用户从零基础到精通掌握通用人工智能模型DeepSeek的核心功能与应用…...
Nginx进阶篇 - nginx多进程架构详解
文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器,其特点是…...
SpringBoot初始化8个常用方法
在 Spring Boot 中,初始化方法通常是在应用程序启动时被调用的,可以用来执行应用启动时的一些准备工作。以下是几种常见的初始化方法: 一、顺序 1. 图解 ┌─────────────────────────────┐│ Spring Boot…...
boolen盲注和时间盲注
获取当前数据库名 import requestsdef inject_database(url):namemax_length20low{a: 97, z: 122, A: 65, Z: 90, 0: 48, 9: 57, _: 95}high{97: a, 122: z, 65: A, 90: Z, 48: 0, 57: 9, 95: _}for i in range(1, max_length 1):low_val32high_val122while low_val < hi…...
CTF-web:java-h2 堆叠注入rec -- N1ctf Junior EasyDB
代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…...
TUSB422 MCU 软件用户指南
文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制(…...
BUU37 [DASCTF X GFCTF 2024|四月开启第一局]web1234100
Hint1:本题的 flag 不在环境变量中 Hint2:session_start(),注意链子挖掘 题目: 扫描出来www.zip class.php <?phpclass Admin{public $Config;public function __construct($Config){//安全获取基…...
常见的排序算法:插入排序、选择排序、冒泡排序、快速排序
1、插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素…...
vue学习9
1.文章分类页面-element-plus表格 基本架子-PageContainer封装 按需引入的彩蛋,components里面的内容都会自动注册 用el-card组件,里面使用插槽或具名插槽 文章分类渲染 & loading处理 序号: <el-table-column type"index"…...
TDengine 性能测试工具 taosBenchmark
简介工具获取运行 无参数模式命令行模式配置文件模式 命令行参数配置文件参数 通用配置参数写入配置参数 数据库相关超级表相关标签列与数据列写入行为相关 查询配置参数 执行指定查询语句查询超级表 订阅配置参数数据类型对照表 配置文件示例 写入 JSON 示例查询 JSON 示例订阅…...
【xdoj离散数学上机】T283
递归函数易错: 防止出现递归死循环! 题目 题目:求诱导出的等价关系的关系矩阵 问题描述 给定有限集合上二元关系的关系矩阵,求由其诱导出的等价关系的关系矩阵。 输入格式 第一行输入n,表示矩阵为n阶方阵,…...
Javaweb中,使用Servlet编写简单的接口
案例:网页提交用户名和密码信息,后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…...
GESP5级语法知识(十):初级数论(三)
埃氏筛法: #include <iostream> using namespace std; const int N1e61; int pri[N]; void prime(int n){for(int i2;i*i<n;i){if(pri[i]0){ // 如果i为素数for(int jii;j<n;ji){pri[j]1; // 将i的倍数标记为合数}}} } int main(){int n;cin>>n;…...
“PEP 8: W292 no newline at end of file“报错 IntelliJ IDEA自动添加空行问题
"PEP 8: W292 no newline at end of file"报错 IntelliJ IDEA自动添加空行问题 在使用IntelliJ IDEA的过程中,经常会发现不管是对于代码文件或者纯文本文件,在保存时中会在文件末尾加上一个空行,提交GIT对比检查时,总是…...
ComfyUI工作流 FluxRedux基础换装
文章目录 FluxRedux基础换装SD模型Node节点工作流程效果展示开发与应用FluxRedux基础换装 该工作流的目标是实现服装换装功能,利用多种深度学习模型和图像处理技术,通过用户输入的服装图像和模特图像,生成逼真的换装效果图。整个工作流涵盖了从图像加载、模型编码、条件生成…...
【机器学习】常见采样方法详解
在机器学习领域,数据采样(Sampling)是一项至关重要的技术。它不仅影响模型的训练效率,还直接关系到模型的性能与泛化能力。本文将从基础概念出发,逐步深入介绍机器学习中常见的采样方法,帮助读者全面理解并…...
使用瑞芯微RK3588的NPU进行模型转换和推理
使用边缘设备进行算法落地时,通常要考虑模型推理速度,NVIDA系列平台可以使用TensorRT和CUDA加速,瑞芯微RK3588的板子上都是Arm的手机GPU,虽然没有类似CUDA的加速计算方式,但是提供了NPU进行加速推理,本文说…...
ComfyUI ControlNet Aux预处理器深度解析:从模型下载到性能优化全攻略
ComfyUI ControlNet Aux预处理器深度解析:从模型下载到性能优化全攻略 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet Aux…...
基于SpringBoot+Vue的网上商城系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着互联网技术的快速发展,电子商务已成为现代商业活动的重要组成部分。网上商城系统作为电子商务的核心载体,为用户提供了…...
DDR内存接口测试:从信号完整性到电源噪声的工程实践指南
1. DDR内存测试的核心挑战与价值在任何一个涉及高速数字信号的设计项目中,内存接口的验证都是决定系统稳定性的关键一环。从早期的SDRAM到如今主流的DDR4、DDR5乃至LPDDR系列,双倍数据速率(DDR)技术通过在每个时钟周期的上升沿和下…...
GENIVI DLT Viewer:从编译到实战连接的完整指南
1. 环境准备:搭建DLT Viewer开发环境 第一次接触GENIVI DLT Viewer时,我花了两天时间才把环境搭好。现在回想起来,其实只要抓住几个关键点就能少走弯路。DLT Viewer是汽车电子和嵌入式领域常用的日志分析工具,主要用于查看设备端…...
保姆级教程:在Windows 10/11上从源码编译Groops(含Qt环境变量避坑指南)
从零构建Groops编译环境:Windows系统下的完整避坑指南 当你在GNSS数据处理领域深耕时,一款强大的开源工具能让你事半功倍。Groops作为重力场恢复和精密定轨的瑞士军刀,其功能强大但编译过程却可能让新手望而却步。本文将带你一步步穿越编译迷…...
告别手动建造:TEdit免费地图编辑器如何10倍提升泰拉瑞亚创作效率
告别手动建造:TEdit免费地图编辑器如何10倍提升泰拉瑞亚创作效率 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also l…...
如何通过命名规范降低代码维护成本:7个命名技巧提升长期项目质量
如何通过命名规范降低代码维护成本:7个命名技巧提升长期项目质量 【免费下载链接】naming-cheatsheet Comprehensive language-agnostic guidelines on variables naming. Home of the A/HC/LC pattern. 项目地址: https://gitcode.com/gh_mirrors/na/naming-chea…...
车规级国际物联卡是什么?车载物联网硬件选型与行业标准解析
随着跨境整车出口、改装车辆、工程机械外销、车载定位终端普及,车载联网通信要求持续升级。普通民用SIM卡无法适配车辆颠簸、温差跨度大、高速移动、跨境切换网络的复杂工况,车规级国际物联卡逐步成为车载智能化硬件的标配通信载体。很多出海设备厂商容易…...
【博安通BW16模组专题②】实战TCP客户端:从指令到云端数据透传
1. 认识BW16模组的TCP客户端功能 博安通BW16模组作为一款高性价比的物联网通信模块,其TCP客户端功能在实际项目中应用广泛。简单来说,TCP客户端就是能够主动连接服务器的终端设备,比如我们常见的智能家居设备连接云端服务器,就是典…...
Linux安装配置小龙虾【openclaw】(飞牛NAS OS)
OneAPI & NewAPI 完全指南:从零开始搭建你的AI模型聚合网关 在AI大模型百花齐放的今天,我们常常需要同时使用多个模型提供商的服务——OpenAI的GPT-4、Anthropic的Claude、Google的Gemini、国内的文心一言、通义千问等等。每个提供商都有自己的API接…...
