自由学习记录(23)

news2024/11/23 8:19:38

Lua的学习

table.concat(tb,";")

如果表里带表,则不能拼接,表里带nil也不能,都会报错

true和false也不可以,数字和字符串可以

if要和一个end配对,所以

if a>b then

return true

end

end

两个end

ctrl+b运行脚本

函数在表外部声明的时候要带表的名字.函数名

带:声明函数的时候,在函数内部可以用self表示自己,从而调用自己这个表的成员

不存在表内用的就是自己里面的变量,一样要.出来确认

lua 的表不可以.访问数字

这种pair遍历写法看上去只遍历值,实际上还是拿了键放下划线了

不删除,直接访问没有的那个键,也是会得到nil

lua中字典的添加和修改

直接赋值,和直接修改

pairs不按正常顺序的最后会统一去找

这样空的索引区域会设置成nil

#aa会输出6(这里只跳一格,还可以不断)

lua可以自定义索引,这里的两个print都可以打印出来,1,4

lua中的数组下标从一开始

变长参数先用表接{},再for#表使用

这里改变了x的生命周期,一直存在于function(y)里面

nil不支持..拼接

true flase不能..拼接

and or not

不等于~=

取余对小数也可以取余

各个不同的类型都可以用..连接

打包减少硬盘资源占用

打包后可以减少的硬盘占用,取决于以下几个因素:


1. 资源的重复引用

在未打包的情况下,Unity 项目中有很多资源可能会被多个场景或 Prefab 反复引用,比如材质、纹理、模型等。这些资源存储在磁盘上的多个文件中,各自占用独立的空间。

打包后的优化:

  • Unity 的 AssetBundle 或 Addressable 系统会对这些重复的资源进行分析,提取到共享的 AssetBundle 中。
  • 磁盘上的重复数据大幅减少。

占用减少程度:

  • 效果显著,尤其是大规模项目中,重复资源较多时,可能减少 10%-30% 的硬盘占用。

2. 文件格式的优化

Unity 项目中很多原始资源(如 PNG、JPG、FBX)都保持未压缩或源格式存储,打包时会进行格式转换和压缩处理。例如:

  • 纹理资源:可能被压缩为 ETC、DXT 等格式。
  • 模型资源:只保存运行时必要的顶点、法线数据,移除编辑器使用的信息。
  • 声音资源:通常会压缩为 ADPCM 或其他高效编码格式。

占用减少程度:

  • 纹理和声音资源的压缩会带来显著效果,可能减少 20%-50% 的空间。
  • 模型资源通常减少较少,约 10%-20%。

3. 剔除未使用的资源

Unity 在打包时会剔除未被引用的资源,这些资源在开发时可能仍保存在 Assets 文件夹中,但不会包含在最终的打包文件中。

占用减少程度:

  • 如果你的项目中有大量未使用的资源,可能减少 10%-40% 的硬盘占用。

4. 压缩级别

打包后的文件通常会使用压缩算法进一步优化磁盘占用。常见的压缩方式包括:

  • LZ4 压缩(更快加载,稍大文件体积)。
  • LZMA 压缩(更小文件体积,但加载速度稍慢)。

占用减少程度:

  • 如果启用 LZMA 压缩,打包文件大小可能减少 30%-50%

综合实际案例分析

假设一个项目如下:

  • 原始项目文件夹大小:10 GB
  • 包含大量纹理、声音和模型资源。
  • 纹理占用 5 GB,其中 3 GB 可压缩。
  • 声音占用 2 GB,50% 可压缩。
  • 1 GB 的未使用资源。

打包后可能的结果:

  1. 纹理压缩:3 GB 压缩至 1 GB,节省 2 GB。
  2. 声音压缩:2 GB 压缩至 1 GB,节省 1 GB。
  3. 未使用资源剔除:减少 1 GB。
  4. 文件重复引用优化:减少约 1 GB。
  5. 压缩:最终减少约 20%。

最终打包后大小:
10 GB 原始文件 -> 约 5-6 GB


如何进一步优化打包占用

  1. 纹理压缩设置:在 Texture Import Settings 中,选择适合目标平台的压缩格式(如 ASTC、ETC2)。
  2. 声音格式优化:将声音资源压缩为高效格式(如 ADPCM)。
  3. 清理未使用资源:使用 Unity 的 Asset Usage 检查工具,找出未被引用的资源并移除。
  4. 分包设计:将资源划分为按需加载的多个 AssetBundle,避免一次性加载过多资源。

依赖

在 Unity 中,依赖关系通常指的是一个资源(如场景、Prefab)引用了另一个资源(如材质、纹理、脚本等)。如果一个资源依赖另一个资源,那么在加载前者时,后者必须先加载到内存中。

 依赖,简单来说,是指一个资源在使用时需要另一个资源的支持。

想象你要玩一个游戏,这个游戏的关卡是 Level1,而这个关卡中有一个大炮模型 CannonPrefab

  • 如果把 Level1 比喻成一本书,CannonPrefab 就是书里的插图。
  • 当你打开书时,插图必须已经准备好,否则书里的某些内容就没法展示了。

这就意味着,Level1 依赖CannonPrefab

假设 Level1Level2 都用到了 CannonPrefab

  • 如果没有依赖管理:
    Unity 会把 CannonPrefab 的完整数据分别放进 Level1Level2 的 AB 包中,导致文件变大、加载时占用内存多。

  • 如果有依赖管理:
    Unity 会把 CannonPrefab 提取到一个独立的 CommonAssets 包中,Level1Level2 的 AB 包中只存放对 CannonPrefab 的引用。

加载顺序是:

  1. 加载 CommonAssets 包,加载 CannonPrefab
  2. 加载 Level1Level2,并使用已经加载的 CannonPrefab

AssetBundle 是 Unity 中的资源打包机制,依赖是它的重要部分:

  • Unity 会分析每个 AB 包中的资源,检测哪些资源被多个 AB 包使用。
  • 这些共享资源会被提取到独立的 AB 包中。
  • 生成的 .manifest 文件会记录每个 AB 包的依赖关系。
using UnityEditor;

public class AssetBundleBuilder
{
    [MenuItem("Build/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        // 创建 AB 包的输出路径
        string assetBundleDirectory = "Assets/AssetBundles";
        if (!System.IO.Directory.Exists(assetBundleDirectory))
        {
            System.IO.Directory.CreateDirectory(assetBundleDirectory);
        }

        // 设置独立打包规则
        AssetBundleBuild[] buildMap = new AssetBundleBuild[3];

        // Level1 打包
        buildMap[0].assetBundleName = "level1";
        buildMap[0].assetNames = new string[] { "Assets/Scenes/Level1.unity" };

        // Level2 打包
        buildMap[1].assetBundleName = "level2";
        buildMap[1].assetNames = new string[] { "Assets/Scenes/Level2.unity" };

        // CannonPrefab 打包为公共资源
        buildMap[2].assetBundleName = "commonassets";
        buildMap[2].assetNames = new string[] { "Assets/Prefabs/CannonPrefab.prefab" };

        // 构建 AB 包
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}

装Lua之后会一起安装一个东西

cmd去check out,print Lua

公司一般会帮把IDE环境搭好,所以如果是要学习Lua的话,IDE可以任意

PlayerPrefs 数据存储路径

Windows
  • 编辑器环境
    • 路径:%APPDATA%\Unity\EditorPrefs
  • Build 后的游戏
    • 路径:%USERPROFILE%\AppData\LocalLow\<CompanyName>\<ProductName>\
      <CompanyName><ProductName>PlayerSettings 中设置的公司名称和产品名称。)

AB 包(AssetBundle

使用需要在unity里先添加assetbundle browser插件(pack Manager那)

减小初始包体积

  • 通过将部分资源分离成 AB 包,玩家首次下载时只需要获取核心内容,其他资源可以在需要时下载。
  • 例如:一款游戏有多个关卡,玩家只需下载第一个关卡的资源,后续关卡可以按需加载。

支持热更新

  • 更新游戏时,只需替换 AB 包而无需重新打包整个游戏,大大减少更新包的大小。
  • 例如:网游中增加新角色时,只需下载新角色的资源包,而不必重新下载整个客户端。

跨平台共享

  • 将资源打包为 AB 包后,不同平台可以复用相同的资源,而不需要为每个平台生成独立的资源版本。

先为要打ab包的资源指定包名

编写脚本,在运行时加载 AB 包中的图片并显示在场景中。 

using UnityEngine;
using UnityEngine.UI; // 如果需要将图片显示在 UI 上

public class LoadAssetBundle : MonoBehaviour
{
    public string bundlePath = "Assets/StreamingAssets/example_bundle"; // AB 包路径
    public string assetName = "example_texture"; // 图片资源名称
    public RawImage targetImage; // 场景中的 UI 元素,用于显示图片

    void Start()
    {
        LoadTextureFromBundle();
    }

    void LoadTextureFromBundle()
    {
        // 加载 AB 包
        AssetBundle bundle = AssetBundle.LoadFromFile(bundlePath);
        if (bundle == null)
        {
            Debug.LogError("Failed to load AssetBundle!");
            return;
        }

        // 加载资源
        Texture2D texture = bundle.LoadAsset<Texture2D>(assetName);
        if (texture != null)
        {
            targetImage.texture = texture; // 显示图片在 UI 上
        }

        // 卸载 AB 包,释放内存
        bundle.Unload(false);
    }
}

图片的名字(assetName)仍然是它在项目中的原始名字

AB 包并不会改变资源本身的名称,而是会将资源的路径和名称记录在 AB 包的元数据中

ab包的资源依赖

unload单个ab包的资源,

作用是卸载所有的ab包资源,后面的true和false则决定要不要把ab包加载出的资源也一起删了

最好是填false

比如过场景的时候使用卸载

转热更新

转进阶

everything's gonna be fine

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

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

相关文章

GoZero对接GPT接口的设计与实现:问题分析与解决

在本篇文章中&#xff0c;我们将探讨如何在GoZero框架下对接GPT接口&#xff0c;并详细讨论在实现过程中遇到的一些常见问题及其解决方案。特别是遇到的错误信息&#xff0c;如 parse parameter fail,recover: interface conversion: interface {} is nil, not string 和 获取历…

【2024 Optimal Control 16-745】【Lecture 3 + Lecture4】minimization.ipynb功能分析

主要功能-最小化问题 目标函数分析: 定义函数 f ( x ) f(x) f(x) 及其一阶、二阶导数。使用绘图工具可视化函数的形状。 实现数值优化: 使用牛顿法寻找函数的极值点&#xff0c;结合一阶和二阶导数加速收敛。使用正则化牛顿法解决二阶导数矩阵可能不正定的问题。 可视化过程…

实现 UniApp 右上角按钮“扫一扫”功能实战教学

实现 UniApp 右上角按钮“扫一扫”功能实战教学 需求 点击右上角扫一扫按钮(onNavigationBarButtonTap监听)&#xff0c;打开扫一扫页面(uni.scanCode) 扫描后&#xff0c;以网页的形式打开扫描内容(web-view组件)&#xff0c;限制只能浏览带有执行域名的网站&#xff0c;例如…

ThreadLocal 父子线程、线程池、数据传递

讲一下背景&#xff1a;springboot 项目。写了个拦截器&#xff0c;解析请求头 Authorization 中传过来的 token&#xff0c;获取到登录用户信息&#xff0c;然后通过 ThreadLocal 存起来&#xff0c;后面的业务代码从 ThreadLocal 取用户信息。 再说下问题&#xff1a;当业务代…

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点

如图&#xff0c;如果要实现上方的效果&#xff1a; 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…

ubuntu下如何使用C语言访问Mysql数据库(详细介绍并附有案例)

一、配置 首先&#xff0c;确保你已经安装了MySQL服务器和MySQL Connector/C库。在Linux上&#xff0c;你可以使用包管理器来安装这些&#xff0c;例如&#xff1a; sudo apt-get install mysql-server libmysqlclient-dev 在ubuntu的机器上&#xff0c;库文件通常保存在 /li…

uniapp接入BMapGL百度地图

下面代码兼容安卓APP和H5 百度地图官网&#xff1a;控制台 | 百度地图开放平台 应用类别选择《浏览器端》 /utils/map.js 需要设置你自己的key export function myBMapGL1() {return new Promise(function(resolve, reject) {if (typeof window.initMyBMapGL1 function) {r…

直播服务器多设备同显方案

在直播行业中&#xff0c;服务器多设备同显方案已成为一种创新且高效的技术应用。这一技术不仅能够满足大规模同步直播的需求&#xff0c;还能显著提升观众的观看体验和参与度。本文将深入探讨直播服务器多设备同显方案的技术细节、实施步骤以及在不同场景下的应用价值。 直播服…

101.【C语言】数据结构之二叉树的堆实现 下

目录 1.堆删除函数HeapPop 一个常见的错误想法:挪动删除 正确方法 设计堆顶删除函数HeapPop 解析向下调整函数AdjustDown 向下调整最多次数 向下调整的前提 代码实现 2.测试堆删除函数 运行结果 3.引申问题 运行结果 4.练习 分析 代码 执行过程图 运行结果 承…

数据结构(Java版)第二期:包装类和泛型

目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

【CSP CCF记录】201903-1第16次认证 小中大

题目 样例1输入 3 -1 2 4 样例1输出 4 2 -1 样例1解释 4 为最大值&#xff0c;2 为中位数&#xff0c;−1 为最小值。 样例2输入 4 -2 -1 3 4 样例2输出 4 1 -2 样例2解释 4 为最大值&#xff0c;(−13)21为中位数&#xff0c;−2为最小值。 思路 本题两个注意点&#xff0…

P8692 [蓝桥杯 2019 国 C] 数正方形:结论,组合数学

题目描述 在一个 NNNN 的点阵上&#xff0c;取其中 44 个点恰好组成一个正方形的 44 个顶点&#xff0c;一共有多少种不同的取法&#xff1f; 由于结果可能非常大&#xff0c;你只需要输出模 10971097 的余数。 如上图所示的正方形都是合法的。 输入格式 输入包含一个整数 …

Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f; 100…

【题解】—— LeetCode一周小结46

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结45 11.切棍子的最小成本 题目链接&#xff1a;1547. 切棍子的最…

AI社媒引流工具:解锁智能化营销的新未来

在数字化浪潮的推动下&#xff0c;社交媒体成为品牌营销的主战场。然而&#xff0c;面对海量的用户数据和日益复杂的运营需求&#xff0c;传统营销方法显得力不从心。AI社媒引流王应运而生&#xff0c;帮助企业在多平台中精准触达目标用户&#xff0c;提升营销效率和效果。 1.…

Python 使用 Selenuim进行自动化点击入门,谷歌驱动,以百度为例

一、首先要下载谷歌驱动 1.&#xff08;打开谷歌浏览器 - 设置 - 关于谷歌&#xff0c;查看谷歌浏览器版本&#xff0c;否则不对应无法调用&#xff0c;会提示&#xff1a;selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This versio…

C语言-指针作为函数返回值及二级指针

1、指针作为函数返回值 c语言允许函数的返回值是一个指针&#xff08;地址&#xff09;我们将这样的函数称为指针函数&#xff0c;下面的例子定义一了一个函数strlong&#xff08;&#xff09;&#xff0c;用来返回两个字符串中较长的一个&#xff1a; 1. #include <stdio…

实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么

今天学Flink的关键技术–容错机制&#xff0c;用一些通俗的比喻来讲这个复杂的过程。参考自《离线和实时大数据开发实战》 需要先回顾昨天发的Flink关键概念 检查点&#xff08;checkpoint&#xff09; Flink容错机制的核心是分布式数据流和状态的快照&#xff0c;从而当分布…

再次讨论下孤注一掷

在孤注一掷中的黑客技术里面&#xff0c;简单介绍了电影孤注一掷中用的一些"黑科技"&#xff0c;这里继续讨论下&#xff0c;抛弃这些黑科技&#xff0c;即使在绝对公平的情况下&#xff0c;你也一样赢不了赌场 相对论有一个假设就是光速不变&#xff0c;这里也有个…