Shader变体自定义组合压缩方案

news2024/11/26 2:51:48

前言

本篇文章不讲什么是变体,不讲shader_feature和multi_compile的区别,也不讲如何收集变体。

关于什么是变体,如何优化变体,看这篇文章

Shader:优化破解变体的“影分身”之术 - 知乎 (zhihu.com)

关于变体的收集方案看这篇文章

Unity SVC的一种收集方案 - 知乎 (zhihu.com)

简述一下问题:

shader_feature是使用的变体才会打包进包内,multi_compile是不管是否使用都会打包进包内。

后者就会导致内存翻倍。因为

它的生成会是这样,枚举组合。

本次我们主要讲的是如何解决multi_compile导致不必要变体组合的问题。

优化的核心思路:

multi_compile替换成shader_feature,由开发者以配置的形式组合变体的排斥关系。比如A与D不一起打包。

正文开始

有人问,所有的multi_compile替换成shader_feature就好了?只需要美术提前设置好当前材质球需要的变体就能保证变体不疯狂增长。

事实上,有一些keyword是无法提前预知,且会动态改变的。

比如LIGHTMAPON或者LINEAR_FOG。

一个石头,它可能会被地编放在场景中烘焙,也可能会成为动态物体,让玩家拖动。那我们就无法知道它会使用哪个keyword。

或者一个物体在当前场景中使用线性雾,在第二个场景又用了别的雾,这样也是我们无法确定的。

我们要解决的问题是

大家可以看下上面四个变体,_LINEAR_FOG与HEIGHTFOG不会组合,_UIMODE与SKYMODE不会组合。

现在的情况是:
UI上不需要高度雾,但是要默认雾,但它们仍然会组合

飞船上的模型不需要线性雾,需要高度雾,但它们仍然会组合

我们不要只看到这四个变体的组合,可能还有另外几十种shader_feature。再跟它们组合,就会导致内存暴增。

如何解决这种问题?

1.彻底干掉multi_compile,全部统一替换成shader_feature。在Shader文件的结尾,配置哪些变体原本是multi_compile的,它们的排斥关系是怎样的。

2.在构建收集变体时,收集所有材质球,根据当前材质球使用到的shader_feature变体,读取对应shader文件结尾处的排斥规则和变体配置,枚举出所有真正需要组合的变体,塞入变体列表中。

枚举的代码稍微有点烦人,需要将二维数组排列出来,这部分大家抄作业就行:

/// <summary>
    /// 递归枚举出所有keyword组合
    /// </summary>
    /// <param name="findPaths"></param>
    /// <param name="keywords"></param>
    /// <param name="values"></param>
    /// <param name="group"></param>
    public static void RecursionFind(List<List<string>> findPaths,string[][] keywords,List<string> values,int group)
    {
        findPaths.Add(values);
        if (group >= keywords.Length) return;
        //往里面走
        List<string> newList = values.ToList();
        for (int i = group+1; i < keywords.Length; i++)
        {
            for (int j = 0; j < keywords[i].Length; j++)
            {
                newList = values.ToList();
                newList.Add(keywords[i][j]);
                RecursionFind(findPaths,keywords, newList, i);
            }
        }
    }
    
    /// <summary>
    /// 算出所有动态变体的组合
    /// </summary>
    /// <param name="keywords"></param>
    /// <returns></returns>
    private static List<List<string>> VarintsGroups(string[][] keywords)
    {
        List<List<string>> findPaths = new List<List<string>>();
        for (int i = 0; i < keywords.Length; i++)
        {
            for (int j = 0; j < keywords[i].Length; j++)
            {
                List<string> grouplist = new List<string>();
                grouplist.Add(keywords[i][j]);
                RecursionFind(findPaths,keywords,grouplist, i);
            }
        }
        return findPaths;
    }

最终效果

原本42M的变体,直接干到了2.5M

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

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

相关文章

自然语言处理历史史诗:NLP的范式演变与Python全实现

目录 一、引言什么是自然语言处理&#xff1f;语言与人类思维自然语言的复杂性NLP的历史轨迹 二、20世纪50年代末到60年代的初创期符号学派重要的研究和突破 随机学派重要的研究和突破 三、20世纪70年代到80年代的理性主义时代基于逻辑的范式重要的研究和突破 基于规则的范式重…

亚马逊云科技数据分析为这伴科技赋能,实现“零”中断目标

当前&#xff0c;利用数据分析能力赋能精准营销逐渐成为全球企业的主流趋势之一&#xff0c;然而复杂的基础设施和运维压力也不容忽视&#xff0c;因此如何才能构建行之有效的数据分析平台&#xff0c;支撑业务营销服务&#xff0c;实现与客户的共创互赢&#xff1f; 数字营销时…

Spring MVC入门必读:注解、参数传递、返回值和页面跳转的关键步骤

目录 引言 一、常用注解 1.1.RequestMapping 1.2.RequestParam 1.3.RequestBody 1.4.RequestHeader 1.5.PathVariable 二、参数传递 2.1.基础类型String 2.2.复杂类型 2.3.RequestParam 2.4.PathVariable 2.5.RequestBody 2.6.RequestHeader 三、返回值 3.1.vo…

jdk软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 JDK&#xff08;Java Development Kit&#xff09;是Java开发工具包的缩写&#xff0c;是Java开发人员必备的软件。它提供了一系列的工具和库&#xff0c;用于开发、编译、调试和运行Java应用程序。 JDK的主要组成部分包括&#…

手把手教你写一个简单的ioc容器

Ioc IOC&#xff08;控制反转&#xff09; 就是 依赖倒置原则的一种代码设计思路。就是把原先在代码里面需要实现的对象创建、对象之间的依赖&#xff0c;反转给容器来帮忙实现。 Spring IOC容器通过xml,注解等其它方式配置类及类之间的依赖关系&#xff0c;完成了对象的创建和…

wu-ui 多平台快速开发的UI框架

WU-UI 多平台快速开发的UI框架(无论平台&#xff0c;一致体验) 官方群 wu-ui官方1群: 767943089 说明 wu-ui(如虎添翼) 是 全面兼容多端的uniapp生态框架&#xff0c;基于vue2、vue3和nvue开发。丰富组件库&#xff0c;便捷工具库&#xff0c;简单高效。无论平台&#x…

COMSOL Multiphysics软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 COMSOL Multiphysics是一款基于有限元分析&#xff08;FEA&#xff09;的多物理场仿真软件。它提供了一个强大的平台&#xff0c;用于模拟和优化各种物理现象和工程问题。 COMSOL Multiphysics具有广泛的应用领域&#xff0c;包括…

redis持久化、主从和哨兵架构

一、redis持久化 1、RDB快照&#xff08;snapshot&#xff09; redis配置RDB存储模式&#xff0c;修改redis.conf文件如下配置&#xff1a; # 在300s内有100个或者以上的key被修改就会把redis中的数据持久化到dump.rdb文件中 # save 300 100# 配置数据存放目录&#xff08;现…

【前端】场景题:如何在ul标签中插入多个节点 使用文档片段

直接插入的问题&#xff1a;会回流多次。每插入一次li就会回流一次&#xff0c;消耗性能。 这里可以使用文档片段来解决这个问题。 // 创建文档片段 let node document.createDocumentFragment()DocumentFragment节点存在于内存中&#xff0c;并不在DOM中&#xff0c;所以将子…

VR农学虚拟仿真情景实训教学演示

首先&#xff0c;VR农学虚拟仿真情景实训教学提供了更为真实的实践环境。传统的农学实训往往受制于时间、空间和资源的限制&#xff0c;学生只能通过观察或简单的模拟来学习农业知识和技能。而借助虚拟现实技术&#xff0c;学生可以进入虚拟农场&#xff0c;与各种农作物、工具…

直播软件app开发流程全解析

直播软件app开发是当今互联网行业中备受瞩目的领域。随着移动用户的爆发式增长和即时互动的需求日益增加&#xff0c;开发一款高质量的直播应用已经成为各个企业和个人创作者追逐的目标。本文将深入探讨直播软件app开发的全过程&#xff0c;为您揭示开发直播应用的关键步骤&…

uni-app语音转文字功能demo(同声传译)

目录 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 在文件中开始引用&#xff1a; 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 后续使用的时候可以看详情里面的信息进行使用 在文件中开始引用&#xff1a; 注意&#xff01;&#xff01;在这个…

【RuoYi移动端】uni-app中通过vuex的store来实现全局变量的修改和读取

一、在store文件中新建csjVar.js文件 const csjVar {csjMess: [{aaa:"ok"},{bbb:"no"}] } export default csjVar 二、修改store文件中新建index.js文件 import Vue from vue import Vuex from vuex import user from /store/modules/user import gette…

对于array的.toLocaleString()与.flat()区别

最近都使用到这两个方法&#xff0c;对于array。记录下具体区别 先是他们的简介,我这里用的就是string的.toLocaleString() &#xff0c;因为array的就是分别去调用里面的.toLocaleString() 在拼接成 string.toLocaleString() string[].toLocaleString()方法是一个JavaScrip…

解决Maven依赖下载问题:从阿里云公共仓库入手

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Vue 2 条件渲染

条件渲染相关的指令有哪些&#xff1f; v-if、v-else、v-else-ifv-show v-if 的作用 <div v-if"expression"></div>v-if 根据表达式 expression 返回的值是否为 truthy 来决定其内容是否被渲染。 Vue还实现了 v-else 和 v-else-if&#xff1a; <d…

北斗提供关键技术支撑,车辆智能监管将迎来广阔发展前景

随着车辆数量的快速增长和道路交通压力的持续增加&#xff0c;如何保障交通安全和提升出行效率成为了亟待解决的问题。而车辆智能监管作为一种基于现代信息技术的管理方式&#xff0c;具有实时监控、数据分析和智能预警等优势&#xff0c;可以提高交通管理的精细化水平&#xf…

ClickHouse进阶(九):Clickhouse数据查询-3

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

node socket.io

装包&#xff1a; yarn add socket.io node后台&#xff1a; const express require(express) const http require(http) const socket require(socket.io) const { getUserInfoByToken } require(../../utils/light/tools)let app express() const server http.createS…

武汉芯源半导体CW32F030系列MCU在电焊机的应用

随着工业技术的发展&#xff0c;单片机在许多领域都发挥了重要的作用。在电焊机中应用单片机&#xff0c;通过编写特定的程序&#xff0c;可以实现自动化控制、提高焊接质量和效率。 电焊机是一种用于金属焊接的设备&#xff0c;利用电弧热将金属熔化实现焊接。电焊机主要由电源…