自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(140)
  • 资源 (4)
  • 收藏
  • 关注

原创 Unity构建详解(12)——自动构建

自动构建是指整个构建流程不需要人工操作,只需要输入启动构建指令即可获取构建结果。支持命令行参数启动我们不可能每次构建时都打开Unity去手动点击构建,必须支持通过命令行启动Unity自动执行构建我们每次构建的需求不同,可能构建Debug、Release或者其他特殊需求的应用,因此Unity需要支持识别命令行输入的不同参数支持工程自动检查我们构建时需要保证不会出现错误,否则中途就构建失败了。

2024-05-10 22:34:01 945 1

原创 Unity构建详解(11)——代码剥离

我们知道代码在程序启动时全量加载到内存中的,一个库内的全部代码有些是不需要使用的,遵循减少内存的一个目标:内存中仅存在需要的数据,如果可以将这些不需要的代码去除,就可以减少内存,这就是代码剥离。对于大型的项目而言,代码剥离可以减少几十M的常驻内存。在Unity中,被剥离的是托管代码,并不是全部代码。使用 IL2CPP 编译时,托管代码剥离还可以减少构建时间,因为需要转换为 C++ 并进行编译的代码减少。游戏逻辑的C# 脚本构建的程序集插件中的程序集。

2024-04-28 19:26:34 872

原创 Unity构建详解(10)——Unity构建流程

构建流程为:准备构建->资源收集->脚本编译->Shader编译->配置文件生成->平台构建

2024-04-22 20:24:01 1177

原创 Unity构建详解(9)——Addressable的打包结果

这里说的Task不算是真正SBP管线里的了,而是Addressable中自定义的,包括之前的GenerateLocationListsTask和Post Processing AssetBundles都是在Addressable中的。一般使用SBP时都会用上Addressable。

2024-04-15 21:24:08 674

原创 Unity构建详解(8)——SBP的Bundle生成

这个Task目的是为Addressable创建寻址信息,在Addressable中每个Bundle、Asset都会有一个用于寻址的Location,上层加载传入路径,根据路径找到Location,根据Location找到Bundle、Asset。这一步会生成实际的SerializedFile文件,文件名就是之前的InternalName,但这还不是最终的Bundle文件,所以在之前的处理中会有一个InternalnameToBundleName的映射。这里生成最终的Bundle文件。

2024-04-13 18:32:29 798

原创 Unity构建详解(7)——AssetBundle格式解析

文件可以分为文本文件、图片文件、音频文件、视频文件等等,我们常见的这些文件都有行业内的标准格式,其意味着按照一定的规则和规范去保存读取文件,可以获取我们想要的数据。有些软件会有自己的文件格式,会按照其自己设计的规则和规范去保存读取文件。我们自己在做开发时,也需要保存和读取一些文件,但我们需要保存的数据一般会比较简单,很少去做设计格式。例如,要保存一系列角色和怪物的当前血量。为了读取时能区分是角色和怪物,可以先保存角色个数。读取时先读取角色个数n,随后读取n个血量数据,这些都是角色的,随后读取的是怪物的。个数

2024-04-11 20:42:26 1037

原创 Unity构建详解(6)——SBP的Bundle写操作生成

这里其实就是将构建Bundle需要的参数封装成命令模式,每一个File(AssetBundle)都会有一个WriteOperation。这里主要是为了处理BuildExtendedAssetData,创建对应的AssetLoadInfo。

2024-04-02 21:21:48 999

原创 Unity构建详解(5)——SBP的Bundle组装

Bundle里包含Asset、Asset由Object组成,Object由Type组成。前文说了Type由MonoScript的方式处理,这里我们需要从Object看起。IDeterministicIdentifiers:确定性标识符,对每个对象可以生成唯一一个标识符,具有可重复性和确定性。可以理解为一种哈希方式。Object会依赖其他Object,所以Asset会依赖其他Asset,进而Bundle依赖其他Bundle。我们组建Bundle有两个目标和一套规则。

2024-03-30 18:14:46 696

原创 Unity构建详解(4)——SBP的依赖后处理

这里Task存在的主要原因是:指定哪些Asset要被打包时不是一个个指定的,可以指定贴图所在的文件夹,此时文件夹内的贴图都被认为是要打包的Aseert,但实际上可能有些贴图根本不需要被打包,这里就是为了去掉不需要使用的贴图。Hash算法接受的输入是byte[],通常我们需要将输入数据转为byte[],转化的实现看HashingMethods.GetRawBytes。这里主要是因为要根据依赖计算Hash值,所以才放在后面,如果仅仅根据指定的Bundle的名字来算Hash值,可以去掉这个Task。

2024-03-27 20:30:05 1192

原创 Unity构建详解(3)——SBP的依赖计算

增量是缓存的一种方式,每次在已有缓存的基础上进行构建,就是增量构建。一般的缓存,例如对象池等,其数据还在内存中,增量时缓存数据要保存在磁盘中,构建时再加载到内存中。

2024-03-24 17:43:00 1121

原创 Unity构建详解(2)——SBP的初始设置和脚本编译

TypeDB包含了Unity中所有的类、结构体、枚举、委托,类的名称、命名空间、父类、成员变量、方法等信息,它是Unity的一个核心组件,可以用来进行反射和序列化等操作,可以通过C#代码或Unity编辑器中的各种工具来访问和修改。这里步骤是可选得,在BuildApp时做,其可以用增量缓存,会生成一系列的文件和Dll,如果有缓存,可以直接读取。也是直接调用unity提供的接口,重新打包图集,这一步也可以完全自己做,一般会根据项目的实际情况,自己做图集打包。

2024-03-19 20:31:35 637

原创 Unity构建详解(1)——SBP介绍

Unity的资源工作流程分为导入、创建、构建、分发、加载。我们说的是其中的构建步骤。构建是指将项目工程中的资源文件和代码整合程可执行文件的过程,构建的结果是生成可执行文件,在win平台上是exe,在Android平台上是apk,在ios平台上是ipa。游戏比互联网的app多了很多资产,资产的整合是构建过程中非常耗时且重要的一步,这一步通常会被单独拿出来说,叫打包,在Unity中叫打Bundle。因此,我们说游戏构建通常分为两个大步骤,一是打包,二是构建。

2024-03-18 20:04:02 1376

原创 C#流Stream与IO详解(5)——读取文件的详细流程

这里说的是阻塞式读写文件,只说主要的流程,不包括每个流程中为了处理不同情况的更细节处理。

2023-11-21 13:53:08 543

原创 Unity Job System详解(2)——如何将业务逻辑Job化

Job化只是加速计算,并不改变原有的业务计算逻辑。并不是一上来就使用Job,而是要先优化下原有的业务逻辑。如果优化完了之后提升并不大,可以考虑再Job化。最好真的有一块的业务逻辑需要你Job化,要不然可能看不懂接下来再说什么。

2023-11-16 19:45:14 567

原创 Unity Job System详解(1)——基础知识

当需要加速计算以优化性能时可以考虑使用Job。为了更好的理解和使用Job,需要有些并行编程的基础。必须先了解下C# Task是怎么回事。

2023-11-14 20:58:33 479

原创 BlendTree动画混合算法详解

在动画混合中,四个点就表示四个动画片段,X轴和Y轴表示角色运动的两个属性,以速度和朝向为例,a1和a2是运行时根据角色当前的速度和朝向,以及动画片段的属性计算出来的。在实际运行时,需要先根据属性值知道四个动画片段,分两次找,每次找的方式与一维线性插值混合找的方式相同,然后进行双线性插值,得到最后的角色Pose。这实质上是一个离散数据插值问题,这里有一个基本假设,假设某个采样点对目标点的影响因子为h,所有采样点影响和为H,那么采样点的权重w = h/H。接下来需要确定两个动画片段的权重分别是多少。

2023-11-13 20:01:04 304

原创 骨骼动画详解

插值骨骼坐标:骨骼坐标插值要在骨骼自身空间中完成,如果在模型空间,那么插值出来的骨骼组成的Pose很怪异,因此,我们需要保存骨骼的TransformMatrix,而不是骨骼的TransformMatrix。首先,人眼的分辨率是有极限的,当两个点足够近,在人眼看来就连在一块,很多足够近的点就连成线了,再多的点就可以构成一个面。等到了66.6ms时,人眼才感知到物体在动。可以猜想不够平滑的地方是关节处,关节处的顶点受到多个骨骼的影响,在初始Pose中给定了每个骨骼的权重,在随后的计算中这些权重是固定不变的。

2023-11-06 21:06:16 471

原创 如何从多个数据中选择一个数据

具体选择哪中方式可能没有什么逻辑依据,这些方式从上到下的可靠概率依次递减,需要一次对这些方法进行尝试,看哪个方式得到的结果更接近于真值。

2023-09-26 08:54:08 249

原创 C#流Stream与IO详解(4)——如何更快的读写文件

在我们追求更快读写速度时,通常都是为了读写二进制文件,而不是文本文件,所以这里只说FileStream、BinaryReader、BinaryWriter的使用。从前文的源码解读中能看到使用BinaryReader和BinaryWriter进行IO读写时本质还是调用了FileStream的接口,所以我们这里只说FileStream的使用即可。此外,我们这里说的更快读写是指在同一个线程中的读写,而不是使用多线程读写。

2023-09-22 08:54:23 604

原创 C# 流Stream详解(3)——FileStream源码

SafeFileHandle用的很少,一般来多语言交互的时候用到,比如在C++打开了一个文件,要把引用传递给C#,C#这边来读取文件,或者C#打开文件,传递给C++读取文件。memorystream也有一个buffer来缓存数据,在new的时候可以指定这个buffer的大小,那么这个buffer的实例化在new的时候完成,如果在写数据时这个buffer的大小不够用,则会自动扩容。ReadExactly:其与Read的区别是,在读取一定的字节序列后,会推进流的位置,也即改变Position属性的值。

2023-09-15 18:14:21 917

原创 C# 流Stream详解(2)——FileStream、BinaryReader、MemorySream、SreamReader等之间的关系

电脑上的文件有很多,文本文件、音频文件、视频文件等等,物理什么文件,在电脑上保存的时候本质都是一堆二进制数据,用FileStream可以读取所有的文件,用TextReader可以更好的读所有的文本类型的文件,StreamReader可以用更好的读某种编码格式的文本文件。MemoryStream用于解决在内存中各种流的交换处理,BufferedStream对流的数据进行下缓存。

2023-08-22 16:48:15 1213

原创 C# 流Stream详解(1)——读写txt和二进制文件

我们知道在磁盘上只会存储二进制数据,文本文件最后也会被保存为二进制文件,我们调用接口读取和写入时虽然用的是string,但到底层一定是byte[]。这就涉及到string到byte[]的编码和byte[]到string的解码,只不过对于文本文件而言,有确定的编码解码规则,我们不需要关心。如果文件非常大,还是要用上面的方法读文件,否则一次性读进来,内存会爆。电脑手机上有各种各样的文件,例如视频文件、图片文件、文本文件,其中读写txt文件是最简单的,有多种方式,,在读取和写入文本时都可以传递文本编码参数。

2023-08-18 09:04:05 4978

原创 C#与C++交互(2)——ANSI、UTF8、Unicode文本编码

我们知道计算机上只会存储二进制的数据,无论文本、图片、音频、视频等,当我们将其保存在计算机上时,都会被转成二进制的。我们打开查看的时候,二进制数据又被转成我们看得懂的信息。如何将计算机上的二进制数据转为我们看得懂的文本、图片等,就涉及到编码规则,即二进制数据与我们看的懂的信息之间的映射关系。我们这里讨论的是文本编码规则,有ANSI、ASCII、UTF-8、Unicode等。

2023-08-08 13:14:08 912

原创 技术学习到什么层次比较好

技术学习真的是很耗费时间和精力的事情,需要学习的内容有很多,很多技术你在实际工作中又用不到,但因为人多而卷得你不得不学习。(这里的技术指写代码相关的技术)

2023-08-06 16:33:32 258

原创 C#与C/C++交互(1)——需要了解的基础知识

C#中用于实现调用C/C++的方案是P/Invoke(Platform Invoke),让托管代码可以调用库中的函数。类似的功能,JAVA中叫JNI,Python中叫Ctypes。调用过程为查找dll,例子中为Test.dll'将该dll加载到内存中查找函数在内存中的地址,例子为查找Load函数,并将其参数按照函数的调用约定压栈,例子中调用约定为Cdecl将控制权转移给非托管函数。

2023-08-06 15:55:41 1528

原创 Unity与iOS交互(3)——常见交互示例

前面两篇文章详细介绍了Unity与iOS交互的原理,相信仔细看了之后基本了解了,当然你可能需要花费好几个小时才能看明白。现在缺的就是具体的调用代码了,相信你其实可以自己一点点整理出来,但会花费不少时间趟坑,这里我们直接给出常见的交互代码示例。

2023-07-14 08:58:07 1220

原创 Unity与iOS交互(2)——接入SDK

接入Android和iOS SDK有很多相同的地方,建议先看下Android SDK如何接入。

2023-07-11 08:56:03 3376

原创 Unity与iOS交互(1)——需要了解的IOS相关知识

以下只是简要介绍,详细的内容需要自己去看链接。

2023-07-07 09:04:21 2852

原创 Unity与Android交互(5)——常见交互示例

之前的文章更多的是进行一些原理说明,很少涉及代码,本文举一些Unity与Android交互的常见的一些例示例获取UnityPlayerActivity获取包名获取Android Id(Android Id是Android操作系统提供的一个用于标识设备的唯一标识符,是一个字符串类型的值,可以用于区分不同的设备。其是操作系统在设备首次启动时生成的,一般是通过获取设备的硬件信息,如IMEI,MAC地址等,进行hash计算得到的。获取应用的内部存储路径如何开启一个线程来调用Java代码if(!

2023-07-04 18:46:41 1146

原创 Unity与Android交互(4)——接入SDK

unity接入Android SDK有两种方式,一种是把Unity的工程导出google project的形式进行接入,另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。对我们接入SDK的人来说,SDK也是分等级的:第一等级:只有so文件,这种so文件里一般是算法居多,他们不懂得如何做成SDK,这时需要做这个JAR中间层,C#调用JAR接口,JAR接口调用so文件接口,如果你懒得做,可以让给so文件的人做,本来就是他们应该做的。

2023-06-30 12:56:44 6587

原创 Unity与Android交互(3)——需要了解的Andorid基础知识

在上一篇文章中只是说了如何实现unity和android交互的问题,要了解其中的原理还必须要先了解一些Android的基础知识,了解后也能搞清楚如何接入SDK或者写Native插件。(以下只是简要介绍,详细的内容需要自己去看链接)

2023-06-16 12:40:56 3336

原创 对球面线性插值的理解

线性插值是点A到点B间距离的均匀变化,球面线性插值是点A到点B的角度均匀变化,前者应用范围很广,后者主要应用平滑旋转。

2023-06-08 12:24:25 1098

原创 Unity与Android交互(2)——常用交互方式

常用AndroidJavaClass/AndroidJavaObject实现C#调用Java代码,常用UnitySendMessage实现Java调用C#代码。

2023-06-06 09:07:07 1006

原创 数据加密——MD5、SHA、AES、RSA

数据加密分为单向加密、对称加密和非对称加密。单向加密常用算法有MD5和SHA系列,对称加密常用算法有DES、3DES、AES,非对称加密常见算法有RSA、ECC这里的数据可以是用户名、密码、文本、图片、PDF,小到几百b,达到几十G。一般而言,如果不是搞信息安全的,了解这些加密方式的优缺点和适用场景即可,不用去看其实现原理。(更详细的直接看参考链接)

2023-05-22 11:51:30 2785

原创 消息队列的实现

游戏的主逻辑一般是单线程的,所以实现一个消息队列很简单,不像互联网开发中会涉及多线程、多进程。可以先看看这篇文章。对回调函数和消息机制的理解_消息回调函数_永恒星的博客-CSDN博客这里尝试先去分析一些要素,然后直接基于这些要素去写代码,而不是边写边分析。对于实现一个消息队列,首先实现其基本功能,其次考虑各种不同的使用情况,在基本功能的基础上做额外的修改,最好考虑性能和内存,再做优化。

2023-05-07 21:13:39 1257

原创 Unity与Android交互(1)——交互方式

在做一些原生开发,例如调用相机权限,查询电池电量,获取屏幕亮度,获取麦克风声音大小,获取陀螺仪等,需要调用手机操作系统的相关接口来实现,有些调用Unity做好了封装,我们只需要在C#里调用unity提供的接口即可,但有些Unity没做封装,我们就需要自己来实现。

2023-04-28 17:54:41 508

原创 Unity性能优化

这里暂时将性能优化分为程序和渲染两个部分,这里主要说的是程序部分。

2023-03-12 16:52:53 443

原创 字符串内存优化

字符串占用的内存往往很多,优化的空间很大,在做内存优化的时候,优化字符串内存是必不可少的一步。字符串内存优化的核心原则有三个:1.复用字符串,减少字符串数量2.降低不可复用字符串的占用的内存3.降低运行时产生的GC字符串内存在这个三个核心原则下又有一些具体的方法。

2023-03-11 11:04:22 800

原创 Unity 实现贴花/投影效果

三是在一个物体上渲染想投影的贴图,让这个物体最后绘制,且只绘制那些被遮挡的部分,二是对被投影的物体的Shader加上关键字,开启关键字的时候用想投影的贴图。一是对处理渲染到相机的最终画面,将想投影的贴图修改上去。本文采用第三种实现方式。

2023-02-19 18:52:14 2145

原创 对线性插值的理解

如果是在两个点之间有一个未知点,如果我们不知道两个点之间的点怎么变化,我们通常认为是线性变化的,也即对两个点进行线性插值,得到第三个点。之所以用“已知点”而不用“已知值”是因为,已知点可以是用一个值表示的一维点,也可以是两个值表示的二位点,也可以是三个值表示的三维点。有时候我们对具体的X并不关心,这种情况下,我们不需要知道x0、x1,只要有y0、y1,给插值系数取任何一个合适的值就可以。既然是用两个已知点求一个未知点,那么两个已知点之间的距离要尽可能的小,这样求出来的未知点才会尽可能的准确。

2022-09-13 21:29:52 2392

计算色品坐标

可以根据测得的光谱反射/透射比求出色品坐标,代码中S是光源的相对光谱功率分布,在10°视场下。

2016-12-29

汇编语言 大小排序

可以实习输入0到65535之间的任意数和输入任意个数进行从小到大排序

2016-11-29

汇编语言 查找空格

可以查找空格的数量和输入的空格 位置

2016-11-29

汇编语言 大小写转换

原创代码,可以实现大写转小写,小写转大写,非大小写不转换

2016-11-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除