Unity - Shader Compiled Log

文章目录

  • 吐槽
  • 开启 Log Shader Compilation
  • 实践
    • 资源准备
    • Build AB
    • Testing Script
    • Shader Compiled Log
  • Project


吐槽

先说一下,最近几天前,纷纷看到 unity install fee 的天才收费方案
真的忍不住吐槽,我只想说: “no zuo no die”

(吃相太难看了)


开启 Log Shader Compilation

如果要做变体优化,或是 Shader.CreateGPUProgram 的 CPU 卡顿优化
都可以使用 Shader Compiled Log,只要在开启:Project Settings/Graphics/Shader Loading/Log Shader Compilation 即可

在这里插入图片描述

这样的话,就可以真机上查看编译情况,每个以 Compiled Log 都是对应 Shader.CreateGPUProgram,因此如果要做: 变体优化,变体预热,都是一个比较好的调试Log


实践

在这里插入图片描述


资源准备

顺便编写简单的 shader,创建 material,创建 prefab
设置 AB 信息,build AB

如下

在这里插入图片描述


Build AB

// jave.lin : 测试 打 ABusing System.IO;
using UnityEditor;
using UnityEngine;public class TestingBuildAB : MonoBehaviour
{[MenuItem("实用工具/BuildAB")]public static void Build(){var curBuildTarget = EditorUserBuildSettings.activeBuildTarget;var outputPath = $"{curBuildTarget}/ABs";try{if (!Directory.Exists(outputPath)){Directory.CreateDirectory(outputPath);}BuildPipeline.BuildAssetBundles(outputPath,BuildAssetBundleOptions.ChunkBasedCompression| BuildAssetBundleOptions.DeterministicAssetBundle,curBuildTarget);EditorUtility.DisplayDialog("Build ABs Result", $"Build {outputPath} Successfully!", "OK");}catch (System.Exception er){Debug.LogError(er);EditorUtility.DisplayDialog("Build ABs Result", $"Build {outputPath} Failure! See Console Plz.", "OK");}}
}

Testing Script

// jave.lin : 测试 ab loading & unloadingusing System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestingScript : MonoBehaviour
{private Dictionary<string, AssetBundle> loaded_AB_Dict = new Dictionary<string, AssetBundle>();private Dictionary<string, bool> isLoadByMajor_Dict = new Dictionary<string, bool>();private AssetBundleManifest manifest;private bool isLoadedManifest;private AssetBundleManifest GetManifest(string platform = "Android"){if (manifest == null){var buildTarget = platform;var projectPath = Application.dataPath.Replace("/Assets", "");var platformABPath = $"{projectPath}/{buildTarget}/ABs";var manifest_bundle = AssetBundle.LoadFromFile($"{platformABPath}/ABs");manifest = manifest_bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//Debug.Log($"loaded manifest : {platformABPath}, manifest : {manifest}");}return manifest;}private AssetBundle LoadAB(string abName, bool isMajorAB){///*//shader.ab // all shader//* common.svc//* height_fog.svc//* gi.svc//* xxx.svc// * // *///AssetBundle ab = AssetBundle.LoadFromFile("shaders.ab"); 1. 游戏通用 shader warmup (可能会卡顿,因为编译时间长),注意: 一般不用 warmup//ab.LoadAsset<ShaderVariantCollection>("common.svc").WarmUp(); // 一般不用 warmup 2. 进入一些需要 height fog 的场景//ab.LoadAsset<ShaderVariantCollection>("height_fog.svc").WarmUp(); 3. 进入一些【不】需要 height fog,但需要 gi 的场景,但是这块管理很有风险,我记得 unity 的 shader一旦 Shader.Find 不到会导致闪退//GameObject.Destroy(ab.LoadAsset<Shader>("height_fog1.shader"));//GameObject.Destroy(ab.LoadAsset<Shader>("height_fog2.shader"));//ab.LoadAsset<ShaderVariantCollection>("gi.svc").WarmUp(); 4. 再次进入需要 height fog ,不需要 gi的场景//GameObject.Destroy(ab.LoadAsset<Shader>("gi.shader"));//ab.LoadAsset<Shader>("height_fog1.shader"); // 之前 destroy ,现在重现 load 回来//ab.LoadAsset<Shader>("height_fog2.shader"); // 之前 destroy ,现在重现 load 回来//ab.LoadAsset<ShaderVariantCollection>("height_fog.svc").WarmUp();var buildTarget = "Android";//Debug.Log($"Application.dataPath : {Application.dataPath}"); // Application.dataPath : E:/WorkFiles/UnityStudies/Testing_AB_Load_Unload/Assetsvar projectPath = Application.dataPath.Replace("/Assets", "");//Debug.Log($"projectPath : {projectPath}"); // projectPath : E:/WorkFiles/UnityStudies/Testing_AB_Load_Unloadvar platformABPath = $"{projectPath}/{buildTarget}/ABs";//Debug.Log($"platformABPath : {platformABPath}"); // projectPath : E:/WorkFiles/UnityStudies/Testing_AB_Load_Unloadvar ps_ab_path = $"{platformABPath}/{abName.ToLower()}";//Debug.Log($"ps_ab_path : {ps_ab_path}"); // ps_ab_path : e:/workfiles/unitystudies/testing_ab_load_unload/testingeffect_1if (!loaded_AB_Dict.TryGetValue(abName, out var ab)){ab = AssetBundle.LoadFromFile(ps_ab_path);loaded_AB_Dict.Add(abName, ab);if (isMajorAB){isLoadByMajor_Dict[abName] = isMajorAB;}Debug.Log($"loaded ab : {abName}");}return ab;}private bool UnLoadAB(string abName){if (loaded_AB_Dict.TryGetValue(abName, out var ab)){ab.Unload(true);loaded_AB_Dict.Remove(abName);Debug.Log($"unload ab : {abName}");return true;}return false;}private int instCount;public void OnLoadPS_Btn(){//var manifest = GetManifest();// load depsvar abNames = new string[] {"Assets/Textures/tex_1.png","Assets/Textures/tex_2.png","Assets/Materials/ps_mat_1.mat","Assets/Materials/ps_mat_2.mat",};var isAnyChildABUnload = false;foreach (var abName1 in abNames){if (!loaded_AB_Dict.ContainsKey(abName1))isAnyChildABUnload = true;LoadAB(abName1, false);}// load main abvar abName = "Assets/Effects/TestingEffect_1.prefab";if (isAnyChildABUnload){UnLoadAB(abName);}var ab = LoadAB(abName, true);var prefab = ab.LoadAsset<GameObject>(abName.ToLower());var inst = GameObject.Instantiate<GameObject>(prefab);inst.transform.position = Vector3.zero + Vector3.up * (instCount++);}public void OnUnloadPS_Btn(){var abName = "Assets/Effects/TestingEffect_1.prefab";UnLoadAB(abName);}public void OnUnloadMat_Btn(){var abName = "Assets/Materials/ps_mat_2.mat";UnLoadAB(abName);}public void OnUnloadTex_Btn(){var abName = "Assets/Textures/tex_2.png";UnLoadAB(abName);}public void OnLoadMat_Btn(){var abName = "Assets/Materials/ps_mat_2.mat";LoadAB(abName, false);}
}

Shader Compiled Log

在这里插入图片描述


Project

TestingShaderCompiledLog.rar
提取码:yv4d

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easycms v5.5 分析 | Bugku S3 AWD排位赛

前言 这个awd打的悲&#xff0c;后台默认用户名密码为admin:admin&#xff0c;但是几乎所有人都改了 而且一进去看到这个cms就有点懵逼&#xff0c;都不知道这个cms是干嘛的&#xff08;没用过相似的cms&#xff09; 虽然网上找出了很多相关的漏洞&#xff0c;但是不知道为什…

山洪灾害预警方案(山洪预警解决方案的组成)

​ 随着气候变化的不断加剧&#xff0c;山洪灾害在许多地区成为了极具威胁性的自然灾害之一。为了帮助地方政府和居民更好地预防和应对山洪灾害&#xff0c;我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案&#xff0c;并成功在某地区进行了部署。 案…

HTML显示中文空格字符,emsp;一个中文字符,ensp;半个中文字符

&emsp;一个中文字符 &ensp;半个中文字符 <ul><li class"li">姓&emsp;&emsp;名&#xff1a;<input type"text" /></li><li class"li">手&ensp;机&ensp;号&#xff1a;<input type"…

idea装载jerbel以及文件上传下载

一、JRebel 1.1 Jrebel介绍 JRebel是一个Java开发工具&#xff0c;它是一款用于实时代码重载的插件。它的主要功能是在不重新启动应用程序的情况下&#xff0c;将修改后的Java代码实时应用到正在运行的应用程序中&#xff0c;从而加快开发周期&#xff0c;提高开发效率。 实…

编程获取图像中的圆半径

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 即将推出EmguCV的教程&#xff0c;请大家还稍作等待。 之前网友咨询如何获得图像中圆形的半径&#xff0c;其中有两个十字作为标定…

Golang代码漏洞扫描工具介绍——govulncheck

Golang Golang作为一款近年来最火热的服务端语言之一&#xff0c;深受广大程序员的喜爱&#xff0c;笔者最近也在用&#xff0c;特别是高并发的场景下&#xff0c;golang易用性的优势十分明显&#xff0c;但笔者这次想要介绍的并不是golang本身&#xff0c;而且golang代码的漏洞…

stu01-IDEA怎么创建一个HTML项目

1.打开idea&#xff0c;依次点击file→new→project 2.点击Java&#xff0c;选择你的jdk&#xff0c;没有下载的点击“Download JDK”/已经下载有JDK但在这里没显示的→点击“Add JDK”&#xff0c;选择你安装的JDK的路径&#xff0c;然后next 3.next 4.起好名字&#xff0c;我…

【C++】类和对象(中下)

前言&#xff1a; 上一篇文章&#xff0c;我们了解了类的默认成员函数——构造函数、析构函数、拷贝构造函数&#xff0c;这篇我们让我们接着了解。 一、赋值运算符重载&#xff1a; 1.运算符重载&#xff1a; C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是…

Java集合(Collection、Iterator、Map、Collections)概述——Java第十三讲

前言 本讲我们将继续来讲解Java的其他重要知识点——Java集合。Java集合框架是Java编程语言中一个重要的部分,它提供了一套预定义的类和接口,供程序员使用数据结构来存储和操作一组对象。Java集合框架主要包括两种类型:一种是集合(Collection),存储一个元素列表,…

运维Shell牛刀小试(十一):for循环读取多个命令行参数

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

【SpringCloud微服务项目实战-mall4cloud项目(2)】——mall4cloud-gateway

mall4cloud-gateway网关模块 系统架构与网关介绍网关介绍 网关层代码依赖引入bootstrap配置nacos配置gateway配置处理跨域问题gateway路由断言配置gateway路由过滤配置 总结 代码地址 github地址 fork自github原始项目 gitee地址 fork自gitee原始项目 系统架构与网关介绍 从图…

深圳唯创知音电子将参加IOTE 2023第二十届国际物联网展•深圳站

​ 2023年9月20~22日&#xff0c;深圳唯创知音电子将在 深圳宝安国际会展中心&#xff08;9号馆9B1&#xff09;为您全面展示最新的芯片产品及应用方案&#xff0c;助力传感器行业的发展。 作为全球领先的芯片供应商之一&#xff0c;深圳唯创知音电子一直致力于为提供高质量、…