Unity减少发布打包文件的体积(二)——设置WebGL发布时每张图片的压缩方式

news2025/1/8 12:09:06

一个项目在发布成WebGL后,其体积至关重要,体积太大,用户加载会经历一个漫长的等待…轻则骂娘,重则用脚把电脑踢烂(扣)…

那么如何减少发布后的体积呢,本文从图片的压缩开始入手。

前传回顾:
Unity减少发布打包文件的体积(一)——获取精灵图片的信息限制它的大小

一、徒手设置每张图片的压缩方法

在assets文件夹里选中一个Image,在Inspector底部有一个各发布平台的压缩设置,如下图中4的部分。
在此处设置压缩格式时,只针对发布时进行压缩,不会修改工程资源的原始文件,这样如果你发布成exe时,可以用高清的设置(而如果直接改了原始图片,则发布成exe时,画质被降低)。
在这里插入图片描述

1、压缩格式Format的说明(来源Claude.ai):

  • ASTC (Adaptive Scalable Texture Compression): 这是一个非常灵活的纹理压缩格式,可以提供一系列不同的压缩比,以适应各种不同的应用需求。ASTC由ARM开发,旨在为各种不同的2D和3D内容提供优质的可压缩性能。它被广泛用于移动设备,特别是那些使用ARM集成电路的设备。

  • ETC (Ericsson Texture Compression): ETC是一种开放的、有损的纹理压缩格式,使用在OpenGL和OpenGL ES。ETC1版本不支持alpha通道,而ETC2支持alpha通道。由于其广泛的设备支持和合理的压缩效果,ETC被广泛应用于移动设备。

  • DXT (DirectXTex): 也被称为S3TC,这是一种有损的纹理压缩格式,主要应用在DirectX场景。DXT格式为纹理提供5:1的压缩比率且支持alpha通道,对于PC和一些游戏主机上的3D应用,通常采用DXT格式。

  • BC (Block Compression): BC是一系列DirectX的一部分提供的纹理压缩方法,这其中包括DXT。BC系列(包括BC1-BC7)是几种特殊用途的格式,它们在纹理分辨率、细节和压缩比率上提供多种选择,但并非所有设备都支持。

  • EAC (Ericsson Alpha Compression): 这是ETC2压缩方法的一部分,用于对alpha通道进行压缩。EAC提供了更好的颜色和alpha通道保真度,特别适合那些需要用到透明效果的游戏或者带有alpha混合的特效。

2、MaxSize的计算

Unity中如果你不单独设置,它的默认值大概就是2048,你可以写一个函数,根据分辨力来计算maxSize的值。
在这里插入图片描述

/// <summary>
/// 获取图片的分辨率,取分辨率中高宽的最大值,然后返回图片的【MaxSize】
/// MaxSize的定义:assets->Image->【Texture2D ImportSettings】->【Override For WebGL】->【Max Size】 
/// 区间:16,32,64,128,256,512,1024,2048,4096,8192,16384
///
/// 举例:图片分辨率 = 12 * 24,那么图片的MaxSize = 32
/// </summary>
/// <param name="texture"></param>
/// <returns></returns>
public static int GetMaxSize(Texture2D texture)
{
   //分辨率区间的预备
   var start = new List<int> { 0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 };
   var end = new List<int> { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 100000 };
   var zones = start.Zip(end, (item1, item2) => (startIdx: item1, endIdx: item2)).ToList();

   //取分辨率高宽的最大值
   var size = new List<int> { texture.width, texture.height }.Max();  //取【宽】【高】中的最大值

   //判断所属的区间
   var maxSize = zones.First(x => x.startIdx <= size && size <= x.endIdx).endIdx;
   //Debug.Log($"图的分辨率 = {texture.width} * {texture.height} size = {size}, MaxSize = {maxSize}");
   return maxSize;
}

3、 Format的设置:

Unity面板上提供的各种压缩算法:
在这里插入图片描述
自己亲自指挥亲自部署时,代码中可选的压缩格式:
在这里插入图片描述

4、提问:所有的图片能不能一键设置呢?

可以的,你可以自己写一个编辑器脚本(俗称插件),也可以让AI帮你写一个…然后自己慢慢改

二、一键设置所有图片的Build时的压缩选项

1、快捷菜单入口

右键全选图片 -> 【设置发布WebGL时贴图的压缩格式】
在这里插入图片描述

处理中…
在这里插入图片描述
在这里插入图片描述

2、压缩效果

压缩结束后,发现包的大小从230M减少到138兆。

3、实现的基本思路

  • (1)找到所有的全选物体
Object[] textures = Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
  • (2)单个物体的压缩选项设定

      创建特定平台压缩实例
      勾选压缩
      设置参数
      Apply
    
// 创建特定平台压缩实例
TextureImporterPlatformSettings platformSettings = new TextureImporterPlatformSettings();
platformSettings.overridden = true;
platformSettings.name = "WebGL";

// 设置为压缩
platformSettings.textureCompression = TextureImporterCompression.Compressed;

// 设置压缩格式
platformSettings.format = format;                                     //TextureImporterFormat.ASTC_12x12;
platformSettings.compressionQuality = compressionQuality;             //40
platformSettings.maxTextureSize = GetMaxSize(texture as Texture2D);   //32

//设置importSettings
TextureImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;
importer.SetPlatformTextureSettings(platformSettings);

//Apply 设置
importer.SetPlatformTextureSettings(platformSettings);

//保存资源
importer.SaveAndReimport();

三、附录(代码)

运行方式,放到任何Editor文件里

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;

public class SetTextureCompression
{
    //****************************************参数设置区**********begin
    //TODO 做成EditWindow类型

    private static TextureImporterFormat format = TextureImporterFormat.ASTC_12x12;  //图片压缩格式
    private static int compressionQuality = 60;                                      //压缩比例
    private static string platform = "WebGL";                                        //发布的平台 

    //************************************************************end

    /// <summary>
    /// 设置贴图在build时的压缩选项
    /// </summary>
    [MenuItem("Assets/设置发布WebGL时贴图的压缩格式")]
    static void SetCompression()
    {
        int count = 0;

        Object[] textures = Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
        if (textures.Length > 0)
        {
            foreach (Object texture in textures)
            {
                // 创建特定平台压缩实例
                TextureImporterPlatformSettings platformSettings = new TextureImporterPlatformSettings();
                platformSettings.overridden = true;
                platformSettings.name = platform;

                // 设置为压缩
                platformSettings.textureCompression = TextureImporterCompression.Compressed;

                // 设置压缩格式
                platformSettings.format = format;                                     //TextureImporterFormat.ASTC_12x12;
                platformSettings.compressionQuality = compressionQuality;             //40
                platformSettings.maxTextureSize = GetMaxSize(texture as Texture2D);   //32

                //设置importSettings
                TextureImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;
                importer.SetPlatformTextureSettings(platformSettings);

                //Apply 设置
                importer.SetPlatformTextureSettings(platformSettings);

                //保存资源
                importer.SaveAndReimport();

                count++;
            }
            //Debug.Log("Texture Compression Set!");
        }
        else
        {
            Debug.LogWarning("没有选中图片!");
        }
        Debug.Log($"一共处理了{count}张图片!");
    }

    /// <summary>
    /// 获取图片的分辨率,取分辨率中高宽的最大值,然后返回图片的【MaxSize】
    /// MaxSize的定义:assets->Image->【Texture2D ImportSettings】->【Override For WebGL】->【Max Size】 
    /// 区间:16,32,64,128,256,512,1024,2048,4096,8192,16384
    ///
    /// 举例:图片分辨率 = 12 * 24,那么图片的MaxSize = 32
    /// </summary>
    /// <param name="texture"></param>
    /// <returns></returns>
    static int GetMaxSize(Texture2D texture)
    {
        //分辨率区间的预备
        var start = new List<int> { 0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 };
        var end = new List<int> { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 100000 };
        var zones = start.Zip(end, (item1, item2) => (startIdx: item1, endIdx: item2)).ToList();

        //取分辨率高宽的最大值
        var size = new List<int> { texture.width, texture.height }.Max();  //取【宽】【高】中的最大值

        //判断所属的区间
        var maxSize = zones
            .First(x => x.startIdx <= size && size <= x.endIdx)
            .endIdx;
        //Debug.Log($"图的分辨率 = {texture.width} * {texture.height} size = {size}, MaxSize = {maxSize}");
        return maxSize;
    }
}

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

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

相关文章

语雀 P0 事故复盘,这 9 个字亮了!

大家好&#xff0c;我是鱼皮。 最近语雀不是出了个号称 “载入史册” 的 P0 级事故嘛 —— 连续宕机 7 个多小时无法使用&#xff0c;作为一个大厂知名产品&#xff0c;这个修复速度属实让人无法理解。要命的是我们公司的知识库也是放在语雀上的&#xff0c;导致那天下午大家摸…

【C语法学习】26 - strcat()函数

文章目录 1 函数原型2 参数3 返回值4 使用说明5 示例5.1 示例1 1 函数原型 strcat()&#xff1a;将src指向的字符串拼接在dest指向的字符串末尾&#xff0c;函数原型如下&#xff1a; char *strcat(char *dest, const char *src);2 参数 strcat()函数有两个参数src和dest&am…

现货黄金休市时间长不长?科普一下交易时间

先告诉你答案&#xff0c;现货黄金市场每天的交易时间很长&#xff0c;因为它全天的盘面是由亚洲、欧洲和北美时间无缝地连接而成&#xff0c;无论投资者身处何方&#xff0c;通过哪里的平台入市&#xff0c;每天基本上都可以享受到连续20多个小时的行情。 只要投资者有足够的精…

如何下载到正确版本的Steam?正确使用实现多开搬砖不被封号

各位游戏玩家们&#xff0c;你们是否也曾因为无法在Steam平台上正常下载游戏而感到烦恼呢&#xff1f;盗版问题已经严重影响了Steam的用户体验&#xff0c;也给玩家们带来了不必要的经济损失。但是&#xff0c;作为玩家&#xff0c;我们需要更多的方法来区分正版和盗版&#xf…

【送书活动】阿里云经历的历史级的大故障,能给我们什么启迪?

作为一个淘系出来的人&#xff0c;参加过声势浩大的S11、S2大促&#xff1b;也和阿里云数据库团队、内核团队等并肩作战过&#xff1b;更是手握过六七百万的预算支持阿里云的服务&#xff0c;更是他们的至尊群用户&#xff0c;得知此次重大故障后&#xff0c;也甚是惊讶。 从阿…

【23真题】难!985难度第一梯队!

今天分享的是23年华南理工大学811的信号与系统试题及解析 本套试卷难度分析&#xff1a;22年华南理工大学811考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题难度中等偏上&#xff0c;只有十道大题&#xff0c;考察大家的综合…

MyBatis整合Spring Boot扫描Mapper相关配置

MyBatis是一款 Java 平台的优秀数据库映射框架&#xff0c;支持 XML 定义或注解&#xff0c;免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 针对 Spring 提供 Mapper 扫描注解&#xff1a; 集成 Spring Boot 时&#xff0c;可以通过 MapperScan 注解&#xff0…

纯前端模板文件下载如何精确控制下载的文件名字

在写项目的时候&#xff0c;遇到了一个需要把给定的文件放到页面中&#xff0c;然后用户点击下载按钮将这个文件下载下来&#xff0c;我将其存入了云服务之中(这个云服务是不会清空的&#xff0c;内存又不值几个钱)&#xff0c;但是当我下载的时候&#xff0c;下载的文件名是存…

Java读取本地文件

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException;public class Main {public static void main(String[] args) {String filePath "C:/Users/admin/Desktop/知识点记录.md";// 创建一个文件对象File f…

【MySQL8】1130 - Host *** is not allowed to connect to this MySOL server

问题描述 使用 Navicat 连接 MySQL8 报错&#xff1a; 1130 - Host *** is not allowed to connect to this MySOL server解决方案 use mysql;select host ,user from user; -- 将 root 用户的主机&#xff08;host&#xff09;值修改为 %&#xff0c;即允许从任何主机连接 …

navigator.geolocation.getCurrentPosition在谷歌浏览器不执行的问题

/*** 获取我的位置*/getNavigatorLocation: function () {navigator.geolocation.getCurrentPosition(function (success) {console.log(inner>>>, success);if (success && success.coords) {var data success.coords;var point "POINT(" data.…

Web前后端漏洞分析与防御

第1章 课程介绍 试看2 节 | 15分钟 介绍安全问题在web开发中的重要性&#xff0c;并对课程整体进行介绍 收起列表 视频&#xff1a; 1-1 Web安全课程介绍 (09:24) 试看 视频&#xff1a; 1-2 项目总览 (04:47) 第2章 环境搭建2 节 | 26分钟 本章节我们会搭建项目所需要的环境 …

两种常用的找到现货白银目标位的方法

在现货白银交易中&#xff0c;会买的不算厉害&#xff0c;会卖的人才能让利润真正的落袋为安。这里的“买”和“卖”指的不是买入和卖出&#xff0c;而是开仓和平仓。今天我们就来讨论一下&#xff0c;我们怎么样才能懂得“卖”&#xff0c;应该在哪里设置“卖”&#xff0c;也…

freeRTOS--软件定时器

一、什么是定时器&#xff1a; 简单可以理解为闹钟&#xff0c;到达指定一段时间后&#xff0c;就会响铃。STM32 芯片自带硬件定时器&#xff0c;精度较高、达到定时时间后会触发中断&#xff0c;也可以生成 PWM 、输入捕获、输出比较&#xff0c;等等&#xff0c;功能强大&am…

STM32GPIO——上拉下拉电阻、施密特触发器、P-MOS/N-MOS管

图1和图2 两种版本的GPIO基本结构图 如上两个图所示&#xff0c;标号2都为上拉、下拉电阻部分&#xff0c;阻值约为30k~50k欧&#xff0c;通过对应开关进行控制&#xff0c;开关由寄存器控制。 当引脚外部的器件没有干扰引脚的电压时&#xff0c;即没有外部的上、下拉电压&a…

springboot 2.1.0.RELEASE 项目加入swagger接口文档

Release v2.1.0.RELEASE spring-projects/spring-boot GitHub springboot 2.1.0.RELEASE发行日期是2018年10月30日&#xff08;Oct 30, 2018&#xff09; 不要使用过高的swagger版本&#xff0c;如SpringFox Boot Starter 3.0.0&#xff0c;否则报错&#xff1a; spring-…

Java学习之路 —— 多线程

文章目录 1. 线程创建方式1.1 继承Thread1.2 声明一个实现Runnable接口的类1.3 利用Callable接口、FutureTask类来实现 2. 线程同步2.1 同步代码块2.2 同步方法2.3 Lock锁 3. 线程同步4. 线程池 1. 线程创建方式 1.1 继承Thread 定义子类&#xff0c;继承Thread&#xff0c;创…

Vue指令修饰符、v-bind、v-model、computed计算属性、watch侦听器

前言 持续学习总结输出中&#xff0c;Vue指令修饰符、v-bind、v-model、computed计算属性、watch侦听器 一、指令修饰符 1.什么是指令修饰符&#xff1f; 所谓指令修饰符就是通过“.”指明一些指令后缀 &#xff0c;不同的后缀封装了不同的处理操作 —> 简化代码 2.按键…

玩具、儿童用品、儿童服装上亚马逊TEMU平台CPC认证办理

CPC认证是Childrens Product Certificate的简称&#xff0c;即儿童产品证书。它是美国强制性法规CPSIA要求的一部分&#xff0c;该法规主要针对12岁及以下儿童使用的产品&#xff0c;如玩具、儿童用品、儿童服装等。 一、儿童小汽车CPC测试项目可能会因产品标准和法规的不同而…

开关电源测试之输出暂态响应测试标准及方法详解

暂态响应是指在接收到输入信号后&#xff0c;输出信号在短时间内产生的变化。开关电源输出暂态响应测试是为了检测输出负载快速变化时&#xff0c;输出电压跟随变动的稳定性。 开关电源输出暂态响应怎么测试&#xff1f; 测试目的&#xff1a;测试S.M.P.S.输出负载快速变化时&a…