自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zjz

活到老,学到老

  • 博客(140)
  • 资源 (1)
  • 收藏
  • 关注

原创 托管代码与非托管代码之间的交互

否则,调用者就看不见被调用者修改的内容。2.1、System命名空间下的Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Single、Double类型为blittable基元类型。8.4、当String以LPStr、AnsiBStr、BStr、TBStr、LPUTF8Str非托管类型按照引用传递时,互操作封送器在非托管代码调用返回时会将辅助缓冲区中的内容复制回托管代码中的一个新String中。

2022-12-24 18:04:11 966 1

原创 不安全代码

2、从任何整数类型(sbyte、byte、short、ushort、int、uint、long、ulong)转换成任何指针类型。2.3、固定大小缓冲区的元素类型应该为预定义类型(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool)。3.1.1、当指针指向非托管类型T的静态字段变量时,如果类型T*可以隐式转换为该指针类型,那么初始化程序就会计算指定静态字段变量的固定地址。

2022-12-24 17:06:20 548

原创 Lua5.3指令集详解

详细讲解Lua5.3用到的所有指令。

2022-12-24 16:53:17 1749

原创 Unity Odin从入门到精通(九):验证器详解

然后将自定义的全局类型验证器类型作为参数传递给注册验证器类型,进而让该自定义的全局类型验证器类型生效。然后工程验证器窗口的验证配置文件列表(Validation Profiles)会自动同步管理验证配置文件界面中的主验证配置文件列表。然后工程验证器窗口的验证配置文件列表(Validation Profiles)会自动同步管理验证配置文件界面中的主验证配置文件列表。然后工程验证器窗口的验证配置文件列表(Validation Profiles)会自动同步管理验证配置文件界面中的主验证配置文件列表。...

2022-07-22 17:24:13 1487

原创 Unity Odin从入门到精通(八):自定义定位器

然后重写自定义定制特性处理器类型的ProcessChildMemberAttributes函数来对检视面板父属性下面的检视面板子属性使用定制特性列表进行扩展绘制。5.6.重写自定义定制特性处理器定位器类型的GetChildProcessors函数来对使用该自定义定制特性处理器定位器类型的检视面板父属性下面的检视面板子属性进行扩展绘制。5.5.重写自定义定制特性处理器定位器类型的GetSelfProcessors函数来对使用该自定义定制特性处理器定位器类型的检视面板属性进行扩展绘制。.........

2022-07-22 17:22:27 753 1

原创 Unity Odin从入门到精通(七):自定义解析器

**注意事项**:如下所示:1.自定义解析器主要用来扩展[自定义绘制器](https://blog.csdn.net/zjz520yy/article/details/125398881?spm=1001.2014.3001.5501)。2.解析字符串不仅可以是硬编码,而且还可以是以\$开头的成员引用或者以@开头的表达式。**命名值**:如下所示:1.命名值的类型为NamedValue。具有以下特性:1.1.主要作用:命名值是解析器的重要组成部分,用来表示解析字符串可以访问的上下文值。当解析字符

2022-07-22 17:20:50 562

原创 Unity Odin从入门到精通(五):自定义处理器

然后将该自定义定制特性处理器类型的泛型参数设置为关联的自定义检视面板属性类型;10.当自定义定制特性处理器类型应用OdinDontRegisterAttribute定制特性时,虽然该自定义定制特性处理器类型不能直接处理关联的检视面板属性类型,但是可以使用定制特性处理器定位器类型来处理检视面板属性类型。5.6.重写自定义定制特性处理器定位器类型的GetChildProcessors函数来对使用该自定义定制特性处理器定位器类型的检视面板父属性下面的检视面板子属性进行扩展绘制。......

2022-07-12 22:38:43 1111

原创 Unity Odin从入门到精通(六):自定义绘制器

自定义通用绘制器:可以使用PropertyTree类型来使用Odin绘制系统中的所有功能。使用流程如下所示:1.首先调用PropertyTree.Create函数来为指定的目标类型实例创建一个PropertyTree类型实例;然后调用PropertyTree类型实例的Draw函数来绘制关联的目标类型实例。参考代码如下所示:2.在调用PropertyTree.Create函数时,不仅可以指定OdinAttributeProcessorLocator类型实例来绘制目标类型实例当中的定制特性,而且还可以指定O

2022-06-22 22:36:01 1720

原创 Unity Memory Profiler从入门到精通

前言:Unity Memory Profiler主要用来查看托管内存和本机内存的详细分配情况。它通过捕获、检查、比对内存快照的方式来检测内存泄漏和内存碎片。本篇文章中使用的版本是0.2.10版本。打开偏好设置:点击【Preferences -> Analysis -> MemoryProfiler】菜单项来打开偏好设置。如下图所示:其中,常用的参数设置如下所示:1.Memory Snapshot Storage Path:设置保存内存快照文件的相对路径(必须以./或者…/开头)。当路径非

2022-05-08 21:50:36 11045

原创 Unity Odin从入门到精通(四):序列化调试器详解

什么是序列化和反序列化:序列化和反序列化主要用来解决对象的传输问题。其中序列化用来将对象转换成二进制流;反序列化用来将二进制流转换成对象。Unity序列化:Unity序列化器的实现十分简单,目的是为了非常快速的进行序列化和反序列化操作。具有以下特性:1.可以被序列化的类型如下所示:1.1.某些Unity内置类型。如:Vector2、Vector3、Vector4、Rect、Quaternion、Matrix4x4、Color、Color32、LayerMask、AnimationCurve、Gradie

2022-03-27 14:43:19 2832

原创 Unity Odin从入门到精通(三):静态检查器详解

前言:开发者可以使用静态检查器来选择项目工程、Unity引擎、.Net框架中所有的类型,并查看其所有的静态成员。打开静态检查器:在Unity的菜单栏中选择【Tools -> Odin Inspector -> Static Inspector】菜单项来打开静态检查器。如下图所示:查看静态检查器的源码:首先在Rider当中切换到Assemblies视图。接着在该视图的列表当中选择Sirenix.OdinInspector.Editor程序集。然后从该程序集的列表当中选择Sirenix.Odi

2022-03-17 21:58:45 5295

原创 Unity Odin从入门到精通(二):创建编辑器窗口

前言:为了更加快速和高效的组织项目数据,开发者可以使用Odin来快速创建自定义编辑器窗口,以帮助组织项目数据。这就是Odin可以真正帮助提升工作流程的地方。

2021-10-15 21:07:54 4768

原创 Unity Odin从入门到精通(一):定制特性详解

前言:Odin是一款功能十分强大的Unity第三方插件,可以让程序员从繁琐的GUI开发中解放出来,从而大大提高开发效率。以下介绍的所有关于Odin的章节都是基于3.0.6个人版,读者可以根据自己实际需要进行选择性的阅览。AssetListAttribute:资源列表定制特性。具有以下特性:1.使用范围:可以用在列表、数组或者单个Unity类型的字段上。参考代码如下所示:[AssetList]public GameObject[] goArray;[AssetList]public List&lt

2021-08-28 21:15:01 6910

原创 Unity Timeline从入门到精通(六):扩展Timeline

声明:以Default Playables插件中提供的LightControl为例,讲解怎么去扩展Timeline。自定义行为:流程如下所示:1.创建一个继承自PlayableBehaviour类型的公有序列化行为类型LightControlBehaviour。2.在LightControlBehaviour类型中添加需要显示在检视面板中的公有属性。3.参考代码如下所示:using System;using UnityEngine;using UnityEngine.Playables;us

2021-06-28 20:50:23 3234 5

原创 Unity Timeline从入门到精通(五):检视面板详述

基础知识:如下所示:1.Timeline对象指的是Timeline资源、轨道或片段。2.如果所选片段的相同属性具有不同数值时,那么在检视面板中该数值将由短划线(“-”)来表示。3.Timeline中的时间单位要么为秒数(检视面板显示为s),要么为帧数(检视面板显示为f)。显示检视面板的方式:如下所示:1.首先选择单个Timeline对象;然后检视面板将显示所选Timeline对象的属性。以选择Timeline资源为例,检视面板的显示如图所示:2.首先选择多个Timeline对象,并且所有选择的T

2021-06-28 12:17:52 1497 3

原创 Unity Timeline从入门到精通(四):片段详述

基础知识:如下所示:1.片段的彩色强调线跟关联轨道的彩色强调线保持一致。片段导航的方式:如下所示:1.平移片段视图:按住鼠标中键并拖动或者按住Alt并拖动。2.水平缩放片段视图:滚动鼠标中键或者按住Alt并拖动鼠标右键。3.垂直缩放片段视图:按住Ctrl并滚动鼠标中键。4.聚焦全显示指定的片段:按住F。5.聚焦全显示所有的片段:按住A。添加片段的方式:参见Unity Timeline从入门到精通(三):轨道详述中介绍的每种轨道添加片段的方式。选择或者取消选择片段的方式:如下所示:1.单击

2021-06-23 18:23:39 1438

原创 Unity Timeline从入门到精通(三):轨道详述

轨道组(Track Group)和轨道子组(Track Sub Group):可以看做是空的文件夹。具有以下特性:1.添加轨道组的方式如下所示:1.1.单击添加轨道按钮,选择轨道组菜单项。1.2.鼠标右击轨道列表的空白区域,选择轨道组菜单项。2.一个轨道组或者轨道子组也可具有任意数量的轨道子组。添加轨道子组的方式如下所示:2.1.鼠标右击轨道组或者轨道子组的名称以外区域,选择轨道子组菜单项。2.2.点击轨道组或者轨道子组上的添加按钮,选择轨道子组菜单项。2.3.首先选择轨道组或者轨道子组;然后

2021-06-22 21:23:15 2290

原创 Unity Timeline从入门到精通(二):窗口详述

1.当Hierarchy窗口中没有选择任何游戏对象时,Timeline窗口会提示先选择一个Hierarchy窗口中的游戏对象。如图所示:2.当Hierarchy窗口中选择一个尚未关联到Timeline资源的游戏对象时,Timeline窗口会显示创建按钮。如图所示:3.锁按钮:当游戏对象不关联Timeline资源时,该按钮是不能进行操作的;否则当通过该按钮执行上锁操作时,Timeline窗口就一直显示该Timeline资源的设置,从而避免误操作。如图所示:4.轨道列表:用来展示Timeline资源

2021-06-22 12:13:37 1651

原创 Unity Timeline从入门到精通(一):理论概述

声明:本篇乃至后续的博客中采用的Unity版本为2020.3.11f1c1,Timeline版本为1.4.8。什么是Timeline:Timeline是Unity推出的一个资源整合工具。在该工具内部可以给不同的游戏对象建立不同类型的轨道。每个轨道可以单独的进行编辑,轨道内的不同资源可以有序的进行排列以及融合。Timeline的用途:Timeline可以用来创建电影内容、游戏序列、音频序列和复杂的粒子效果。Timeline的组成:Timeline是由Track(轨道)、Clip(片段:一个轨道中包含若干

2021-06-21 21:04:49 4679

原创 利用Direct3D绘制几何体

基础知识:如下所示:1.除了空间位置信息,Direct3D中的顶点还可以存储其他类型的属性数据(法线,纹理等)。2.在Direct3D 12中,所有的资源均用ID3D12Resource接口表示。可以通过ID3D12Device::CreateCommittedResource函数来获取该接口对象。3.资源类型由D3D12_RESOURCE_DIMENSION字段加以区分。如:D3D12_RESOURCE_DIMENSION_BUFFER表示缓冲区;D3D12_RESOURCE_DIMENSION_T

2021-04-26 22:13:52 458

原创 HLSL高级着色器语言

变量类型:如下所示:1.标量类型如表所示:名称说明bool取值非真即假。HLSL为此而提供了类似于C++语言中的true与false关键字。int32位有符号整数,平台不支持时就用float类型进行模拟。half16位浮点数,平台不支持时就用float类型进行模拟。float32位浮点数。double64位浮点数,平台不支持时就用float类型进行模拟。2.向量类型如表所示:名称说明float22D向量,其中的分量都是f

2021-03-29 20:12:37 1322

原创 渲染流水线

常用概念:如下所示:1.渲染流水线也叫做渲染管道,渲染管线,绘制流水线,图形流水线等。2.可以把渲染流水线想象为一个工厂里的流水线,里面有不同的加工环节(也就是渲染阶段),可以根据用户需求对每个环节灵活改造或拆卸(也就是在不同的着色器中编写自定义函数以及开启或者禁用某些渲染阶段)。以此把原始材料(CPU端向GPU端提交的纹理资源以及指令等)加工为成品(像素颜色)出售给消费者(用户屏幕)。3D视觉的表示:根据人们在真实生活中观察物体的经验,我们可以总结出一些规律。运用这些规律,我们便可以通过2D图像模拟

2021-03-24 12:56:39 185

原创 初始化Direct3D

1.用D3D12CreateDevice函数创建ID3D12Device接口实例。参考代码如下所示:// 通过默认适配器来创建硬件设备HRESULT hardwareResult = D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&md3dDevice));// 创建硬件设备失败时就使用WARP适配器来创建硬件设备if (FAILED(hardwareResult)){ ComPtr<UDXGIAda

2021-03-19 13:06:49 341 1

原创 CPU与GPU间的交互

1.每个GPU中都至少有一个命令队列。CPU可以通过Direct3D API用命令列表向该队列提交命令,而这些命令则指挥GPU执行某些操作。在命令没有到达队列首部以前,用户所提交的命令是无法被执行的。如果命令队列内为空,则GPU会因为没有任务要去处理而处于空闲状态;但若命令队列被装的太满,则CPU将在某个时刻因提交命令的速度追上GPU执行命令的速度而进入空闲状态。值得一提的是,这两种情景其实都没有充分地利用系统资源。2.GPU是系统中与CPU一起并行工作的第二种处理器。有时,我们需要对CPU与GPU进行同

2021-03-17 17:30:20 2621

原创 预备知识

1.DirectX:它是微软公司创建的多媒体编程接口,由显示部分(由负责2D显示的DirectDraw和3D显示的Direct3D组成)、声音部分(DirectSound)、输入部分(DirectInput)和网络部分(DirectPlay)组成。2.Direct3D:它是DirectX中的重要组成部分,是编写高性能3D图形应用程序的渲染库。可以把它看作是一种介于程序员和图形硬件之间的桥梁。借此,程序员便可以通过调用Direct3D函数来实现把资源视图绑定到硬件渲染流水线,配置渲染流水线的输出以及绘制3D

2021-03-17 16:27:31 227

原创 必备的数学知识

向量代数:如下所示:1.向量可以用来模拟同时具有大小和方向的物理量。在几何学上,我们用有向线段来表示向量。其中线段长度代表向量的大小(也叫做模),箭头的指向代表向量的方向。2.当向量平移至尾部与所在坐标系原点恰好重合的位置时,向量位于标准位置。一旦向量处于标准位置,我们便可以用向量头部相对于坐标系的坐标来作为它的数学描述。3.改变向量的位置并不会对其大小或者方向这两个属性造成任何影响,因此两个向量相等就等价于它们的长度相等且方向相同。4.假设向量u=...

2021-03-02 20:22:03 1196 1

原创 在VS2019中新建DX12工程

前期准备:如下所示:1.Windows 10操作系统 + 一款支持Direct3D 12的显卡。2.下载Visual Studio 2019。3.下载本书源代码。安装演示项目:如下所示:1.首先解压下载好的源码;然后在源码根目录下新建一个MyDemos目录。如图所示:2.首先打开VS2019;然后新建一个将解决方案和项目放在相同的目录下的Win32空项目工程,项目名为MyD3DProject。如图所示:错误参考解决方案:如下所示:1.https://blog.csdn.net/qq_3481

2021-03-01 12:37:18 1547 5

原创 改变函数声明&封装变量

动机:一个好的函数名字能够一眼看出该函数的用途,而不必查看其实现代码。一个好的参数列表能够改变连接一个模块所需要的条件,从而去除不必要的耦合。简单做法:如下所示:1.如果想要移除一个参数,需要先确定函数体内没有使用该参数。2.修改函数声明,使其成为你期望的状态。3.找出所有使用旧的函数声明的地方,将它们改为使用新的函数声明。4.测试。迁移式做法:如下所示:1.如果有必要的话,先对函数体内部加以重构,使后面的提炼步骤易于开展。2.使用提炼函数重构手法将函数体提炼成一个新函数。3.如果提炼出的

2021-02-24 12:33:25 367 2

原创 提炼变量&内联变量

提炼变量:如下所示:1.反向重构:内联变量。2.动机:面对一块复杂逻辑时,局部变量能给其中一部分命名,这样就可以更好地理解这部分逻辑要干什么。3.做法:如下所示:1>.确认要提炼的表达式没有副作用。2>.声明一个不可以修改的变量,把你想要提炼的表达式复制一份,以该表达式的结果值给这个变量赋值。3>.用这个新变量取代原来的表达式。4>.测试。4.范例:如下所示:1>.源代码如下所示:function price(order) { // price is b

2021-02-23 21:17:09 1979

原创 提炼函数&内联函数

名称:提炼函数(Extract Function),提炼方法(Extract Method),提炼过程(Extract Procedure),提炼子程序(Extract Subroutine)。动机:如果你需要花时间浏览一段代码才能弄清它到底在干什么,那么就应该将其提炼到一个函数中,并根据它所做的事为其命名。以后再读到这段代码时,你一眼就能看到函数的用途,大多数时候根本不需要关心函数如何达成其用途(这是函数体内干的事)。做法:如下所示:1.创造一个新函数,根据这个函数的意图来对它命名(以它"做什么"来

2021-02-22 20:56:01 545

原创 坏味道与重构手法速查表

坏味道(英文)坏味道(中文)释义常用重构手法Alternative Classes with Different Interfaces异曲同工的类改变函数声明,搬移函数,提炼超类Comments注释提炼函数,改变函数声明,引入断言Data Class纯数据类拥有一些字段以及访问这些字段的函数,除此之外一无长物封装记录,移除设值函数,搬移函数,提炼函数,拆分阶段Data Clumps数据泥团不同类中相同的字段,不同函数签名中相同的参数等提炼类,...

2021-02-22 15:30:25 337

原创 概念总览

基础原则:1.如果你要给程序添加一个特性,但发现代码因缺乏良好的结构而不易进行更改,那就先重构那个程序,使其比较容易添加该特性,然后再添加该特性。2.重构技术就是以微小的步伐修改程序,每次修改后就运行测试。如果你犯下错误,很容易便可发现它。3.傻瓜都能写出计算机可以理解的代码。唯有能写出人类容易理解的代码的,才是优秀的程序员。4.如果重构引入了性能损耗,先完成重构,在做性能优化。...

2021-02-04 20:54:46 104

原创 Expert .NET IL Assembler:ILAsm语法

词法标记:如下所示:1.ID:C风格的字符和数字混合的标识符(例如,Hello_There2)。2.DOTTEDNAME:复合的以句点分割的名称(例如,System.Object)。3.QSTRING:C风格的双引号字符串(例如,“hi\n”)。4.SQSTRING:C风格的单引号字符串(例如,‘hi’)。5.INT32:C风格的32位整数(例如,235,03423,0x34FFF)。6.INT64:C风格的64位整数(例如,-2353453636235234,0x34FFFFFFFFFF)。

2020-08-05 18:14:39 334

原创 CLR via C#:混合线程同步构造

基础知识:如下所示:1.混合线程同步构造合并了用户模式构造和内核模式构造。2.同步块中包含内核对象,拥有线程标识,递归计数以及等待线程计数。3.CLR初始化时在堆中分配一个同步块数组,堆对象的同步块索引初始值为-1。ManualResetEventSlim / SemaphoreSlim类:如果线程没有竞争资源,就使用用户模式构造。如果线程有竞争资源,当线程自旋期间获取到资源就使用用户模式构造;否则就使用内核模式构造。Monitor类:具有以下特性:1.Enter函数:CLR设置对象的同步块索引

2020-08-03 18:20:20 200

原创 CLR via C#:基元线程同步构造

基础知识:如下所示:1.线程安全指的是多个线程试图同时访问数据时,数据不会被破坏。2.FCL保证所有的静态函数都是线程安全的,但是不保证所有的实例函数都是线程安全的。3.建议自定义类库的所有静态函数以及协调线程的实例函数都是线程安全的,其他实例函数都是非线程安全的。4.将线程从用户模式和内核模式之间相互切换时会造成巨大的性能损失。用户模式构造:具有以下特性:1.用户模式构造使用特殊CPU指令来协调线程。2.在用户模式构造上阻塞的线程池线程永远不认为已阻塞,所以线程池不会创建新线程来替换这种临时

2020-07-30 16:28:02 210

原创 CLR via C#:IO限制的异步操作

执行同步IO操作:流程如下图所示:执行异步IO操作:流程如下图所示:

2020-07-22 19:16:44 226

原创 CLR via C#:计算限制的异步操作

执行上下文:具有以下特性:1.执行上下文内部包括安全设置,宿主设置以及逻辑调用上下文数据。2.CLR自动造成初始线程的执行上下文流向任何辅助线程。但是可以使用ExecutionContext类来阻止执行上下文的流动以提升应用程序的性能。协作式取消和超时:具有以下特性:1.CancellationToken类的使用规范如下所示:1>.None属性:获取一个不和任何的CancellationTokenSource对象关联的CancellationToken对象。2>.CanBeCance

2020-07-14 16:15:01 208

原创 CLR via C#:线程基础

基础知识:如下所示:1.不同的应用程序会分配成不同的进程(一个虚拟地址空间)。一个进程中使用的代码和数据无法被另一个进程访问,从而确保应用程序的健壮性(可靠性)。2.一个进程中可以分配多个线程,且不同进程的线程之间互相独立。当一个进程中的线程被冻结时,其他进程的线程可以正常执行,从而确保应用程序的响应能力。3.线程的数量不超过CPU数目时,线程可以全速运行;否则就会出现上下文切换和性能损失。线程内存开销:如下所示:1.线程内核对象:OS创建线程时都会分配并初始化的内存块。具有以下部分:1>

2020-07-03 15:44:55 186

原创 CLR via C#:与WinRT组件互操作

基础知识:如下所示:1.WinRT组件使用由ECMA协会标准化的.NET元数据格式(ECMA-335)来描述其API。

2020-07-02 17:51:58 466

原创 CLR via C#:运行时序列化

对象图:它是一个抽象的概念,代表的是对象系统在特定时间点的一个视图。(反)序列化:序列化是将对象图转换成字节流的过程;反序列化是将字节流转换回对象图的过程。具有以下特性:1.XmlSerializer和DataContractSerializer类可以将XML进行序列化和反序列化。2.BinaryFormatter格式器可以将对象图进行序列化和反序列化。3.可以将多个对象图序列化到一个流中;然后从该流中反序列化成多个对象图。4.序列化对象图时,类型的全名和类型定义程序集的全名会被写入流;然后反序列

2020-06-30 19:48:37 213

ulua资源包

unity热更新解决方案,一种优秀的脚本语言

2015-08-12

空空如也

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

TA关注的人

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