- 博客(266)
- 资源 (8)
- 收藏
- 关注
原创 Win32结构化异常处理
SEH(Structured Exception Handling)是windows系统提供的异常处理机制。这种机制独立于编程语言。通常情况下,开发人员不需要直接调用Win32中原始的与SEH相关的API函数,而是通过特定语言的类库(比如MFC)间接地使用SEH,特定语言的编译器会把他们转换为windows操作系统中相关API函数的调用。SEH的思想:当某个线程在执行过程中出现异常时,它回调一...
2020-04-11 11:45:52
419
原创 快速排序
基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录比另一部分记录的关键字小,然后对这两部分分别进行快速排序,如此重复直到整个序列有序。实现代码:void QSort(int a[], int left, int right){ int i,j,k; k = a[left]; i = left; j = right; while(i < j) {...
2020-04-06 14:16:43
930
原创 希尔排序
希尔排序算法思想:希尔排序是把序列按照增量分组,对每一组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的元素越来越多,当增量为1时,整个序列分成一组,算法结束。算法实际上是一种分组插入方法。算法实现代码:void ShellSort(int a[], int n,int d){ int i, j, t; while (d > 0) { for (i = d; ...
2020-04-01 16:13:50
335
原创 直接插入排序
插入排序思想:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止实现代码如下:void InsertSort(int a[], int n){ int i, j, t; for (int i = 1; i < n; ++i) { t = a[i]; j = i - 1; while (a[j] &...
2020-04-01 15:39:08
250
原创 简单选择排序
选择排序的基本思想:每一趟在数个记录里选取关键字最小的记录作为有序序列的第i个记录。实现代码如下:void SelectSort(int a[], int n){ int k, temp; for (int i =0 ; i < n - 1; ++i) { k = i; for (int j = i + 1; j < n; ++j) { if (a[...
2020-04-01 12:03:03
258
原创 冒泡排序
冒泡排序算法的原理如下:1、比较相邻的元素,如果第一个比第二个大,就交换它们两个。2、对每一组相邻元素做同样的操作,一趟完成后,最后的元素就是最大的数。3、对所有元素重复上述步骤,除了最后一个数4、持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。算法代码如下:void BubbleSort(int a[], int n){ int temp;...
2020-04-01 10:24:26
231
原创 二叉排序树
顺序存储的线性表查找我们可以使用折半、插值、斐波那契等查找算法来实现,因为有序,所以在插入和删除上就需要耗费大量的时间,今天要讨论的算法既可以获得不错的插入删除效率,也可以比较高效的实现查找——二叉排序树。二叉排序树又叫二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树。1、如果它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。2、如果它的右子树不为空,则右子树上所有...
2020-03-31 12:27:35
212
原创 有序表查找
折半查找折半查找又称为二分查找,它的前提是线性表中的记录必须是关键码有序,线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录关键字,则在中间记录的左半区继续查找;若给定值大于中间记录关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有记录都已查完,查找失败为止。折半查找的算法代码...
2020-03-31 11:19:24
215
原创 顺序表查找
顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不相等时,则表中没有所查的记录,查找不成功。顺序查找的算法如下:/*顺序查找,a为待查数组,n为数组长度, key为要查找的关键字*/int search(int...
2020-03-31 10:51:05
459
原创 单链表的拓展操作
前面我们已经学习了单链表的存储结构以及一些基本操作,但是在实际运用中,我们还会涉及到其他一些需求。下面我们针对不同需求做一下整理。输出列表中倒数第i个元素的值下面算法通过两次遍历的方式巧妙的实现了查找链表中倒数第i个元素的功能,实现代码如下:/*输出链表中倒数第i个元素的值*/Status GetEelemTail(LinkList L, int i, Elemtype *e){...
2020-03-29 13:52:46
374
原创 单链表的存储结构及操作
在讨论单链表(带头节点,不带头节点类似,这里不再赘述)之前我,我们学习过线性表的顺序存储结构,我们知道它是有缺点的,最大的缺点就是插入和删除元素时需要移动大量元素、并且需要预先分配存储空间,但是优点是存取方便。线性表的链式存储结构特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。其存储结构如下:/*线性表的链式存储结构*/typedef int...
2020-03-29 13:18:43
2848
原创 scriptableobject类理解
ScriptableObject是一个数据容器,它可以用来保存大量数据,主要的用处就是在项目中通过将数据存储在ScriptableObject对象,避免值拷贝来减少游戏运行中的内存占用。当你有一个预制体,上面挂了一个存有不变数据的MonoBehaviour 脚本时,每次我们实例化预制体时都将产生一次数据拷贝,这时我们可以使用ScriptableObject对象来存储数据,然后通过引用来访问预制...
2020-03-26 14:06:49
5851
原创 对象销毁理解
当.NET程序运行时,CLR负责监控所有应用程序所创建的所有对象,当发现对象不再使用时,就回销毁对象,并回收其资源。这就是CLR的垃圾收集机制,基于此,.NET程序员再不用管理内存分配与回收,极大地简化了.NET应用程序的开发。但是有时我们也需要考虑对象销毁的问题,比如程序中我们使用了非托管资源,如文件句柄、用于线程同步的Mutex对象。这些资源应遵循“需要即创建用完即销毁”的原则。与c+...
2020-03-21 11:06:24
433
原创 CLR如何捕获并处理异常
对于任何一个.NET应用程序中的类,其所包含的方法都有一个异常处理表,如果此方法中没有try...catch...finally语句,则异常处理表为空。(即此方法生成的IL指令中不包括任何的异常处理子句)根据之前的学习我们知道,当应用程序拥有多层嵌套的异常捕获结构时,如果最底层发生了异常,CLR将优先在引发异常的那一层去搜索catch语句块,看看有没有“兼容”此类型异常的处理代码,如果没有,跳...
2020-03-15 13:37:11
797
原创 类和对象的CLR内存布局
c#中有许多的内置类型,int是最常用的数据类型之一。它代表一个4个字节的有符号整数。对于下面的这代码却可以通过c#编译器的语法检查。int i = int.Parse("123");string num = 100.ToString();生成的IL指令如下:仔细查看可发现call指令调用的是System.Int32的方法。为什么一个四字节的int型整数会与一个复杂的Sy...
2020-03-13 15:22:43
1000
原创 CLR虚方法调用原理
我们知道CLR会为每个类型创建一个”方法表“。方法表的详细布局方式微软没有公开发布,因此只能依据自己的理解给出一个大致的方法表, 并不一定符合CLR实情。 类型方法表的前面是一些CLR用于管理类型的控制信息,紧接着是一个表明此类型的方法总数的表项(即图中的方法槽个数),类型用的方法被分为几部分依次排列,一般来说,虚方法都集中在表的前部,因为这些方法可能会以多态方式被调用。表的中部是类...
2020-03-12 19:03:17
690
原创 String字符串总结
String类型的变量代表一个字符串,属于.Net应用程序中最常用的类型之一,然后它包含着很对容易被人忽略的地方。首先String不是值类型,它属于引用类型,由于String变量定义不适用new,因此很对人认为它是值类型变量,但是它实际上属于引用类型,然而因它拥有一些不同于一般引用类型的特性,因此我们将String看成一个特殊的引用类型。String变量内容是只读的string s1...
2020-03-12 15:19:40
406
原创 值类型与引用类型变量探究
.Net将变量的类型分为引用类型和值类型两大类。使用int、double等数值类型所定义的变量属于值类型,除此之外,枚举类型和结构也属于值类型。类类型的变量属于引用类型,他们可以引用一个真实的对象。.Net中的引用类型分为:类类型、接口类型、数组类型和委托类型。值类型变量与引用类型变量的内存分配模型是不一样的,为此先区分下两种不同类型的内存区域:线程堆栈和托管堆线程堆栈和托管堆每个...
2020-03-12 13:50:17
205
原创 多态编程的CLR探索
我们知道在定义类字段的时候可以对其初始化,如果子类和父类都有多个字段需要初始化,那么初始化的顺序如何呢?实例化字段测试代码如下:class A{ public int m = 5;}class B : A{ public int n = 8; public B(int v) { n = v; }}static v...
2020-03-12 12:51:15
202
原创 汇编语言17(字符串的输入)
最基本的字符串输入程序通常具备以下功能(1)在输入的同时要显示输入的字符串(2)在输入回车符后,字符串输入结束(3)能删除已输入的字符分析如下:(1)我们知道字符串的输入和删除是以栈的访问规则进行的,即后进先出,因此我们可以用栈的方式来管理字符串的存储空间(2)输入回车符后可以在字符串中加入0,表示字符串结束(3)每次重新输入一个字符或者删除一个字符,都要重新显示字符串,即从栈底到栈...
2019-11-14 10:54:40
3105
原创 实验16编写包含多个功能子程序的中断例程
编程:安装一个新的int7ch中断例程,为显示输出提供以下功能子程序(1)清屏;(2)设置前景色(3)设置背景色(4)向上滚动一行入口参数说明如下:(1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行(2)对于1,2号功能,用al传递颜色值, al∈{0,1,2,3,4,5,6,7}。完整代码如下:assume cs:codesta...
2019-10-25 21:07:14
407
原创 直接定址表
一、单元长度的标号之前的课程中,我们一直在代码段中使用标号来标记指令、数据、段的起始地址。比如,下面的程序将code段中的a标号处的8个数据累加,结果存储到b标号处的字中。assume cs:codecode segment a: db 1,2,3,4,5,6,7,8 b: dw 0 start:mov si,offset a mov bx,offset ...
2019-10-25 11:59:48
541
原创 安装新的中断例程9
我们在之前编写的int9安装例程基础上加一个功能功能:在DOS下,按F1键后改变屏幕当前的显示颜色,其他的按键照常处理。我们简单分析一下:(1)改变屏幕的显示颜色我们知道,在80x25的彩色字符模式显示缓冲区中每页约有4000个字节的内容显示在屏幕上,因此程序如下: mov ax, 0b800h mov es, ax mov bx, 1 mov cx, 2000s...
2019-10-21 09:53:53
292
原创 int 9中断例程优化分析
上篇文中我们已经实现了int9中断例程的编写,根据课后检测点我们对上文代码做出优化。代码如下:assume cs:codestack segment db 128 dup (0)stack endsdata segment dw 0, 0data endscode segment start:mov ax, stack mov ss, ax mo...
2019-10-19 17:01:46
962
原创 PC机键盘的处理过程(外中断-键盘输入)
我们知道cpu在计算机系统中除了能够执行指令,进行运算以外,还应该能对外部设备进行控制,接收它们的输入,向它们进行输出,也就是说cpu除了具有运算能力外,还要有I/O(Input/Output,输入输出)能力。通过以前的学习我们知道,PC系统的接口卡和主板上装有各种接口芯片。这些外设接口芯片的内部有若干寄存器,cpu将这些寄存器当作端口来访问。外设的输入不直接送入内存和cpu,而是送入相关的接口...
2019-10-19 16:24:35
6675
3
原创 实验13 编写、应用中断例程(续)
(1)编写并安装int 7ch中断例程,功能为显示一个用0结尾的字符串,中断例程安装在0:200处。 参数: (dh)=行号, (dl)=列号, (cl)=颜色 ds:si指向字符串首地址 以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意int,iret指令执行前后cs,ip的和栈中的状态。assume cs:codedata segment...
2019-09-29 10:24:32
337
原创 实验13 编写、应用中断例程
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。参数:(cx)=循环次数,(bx)=位移。 以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意int,iret指令执行前后cs,ip的和栈中的状态。 assume cs:code code segment start: mov ax, 0b800H ...
2019-09-27 11:07:00
544
原创 汇编语言(王爽第三版)检测点13
(1)在上面内容中,我们用7cH中断例程实现loop功能,则上面的7cH中断例程所能进行的最大转移位移是多少?答案:题目描述个人感觉有二义性,因此从loop实现角度和位移值bx变量两方面来讨论 如果从loop的指令角度上看,loop是段内短转移,它的范围是-128~127,也就是说最大转移位移是128. 如果从bx变量来说,bx存储二进制补码数据的表示范围。对于...
2019-09-24 11:02:34
566
转载 Android Activity Launch Mode 启动模式详解
android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题。它是 Androidmanifest.xml 中 Activity 的属性,如 <activity android:name="com.demo.activity.TripRecorderActi...
2019-09-23 20:09:29
218
转载 Unity将来时:IL2CPP是什么?
Unity3D 想必大家都不陌生,独立游戏制作者们很多人都在用它,甚至一些大公司也用在很商业的游戏制作上。Unity3D最大的一个特点是一次制作,多平台部署,而 这一核心功能是靠Mono实现的。可以说Mono是Unity3D核心的核心,是Unity3D跨平台的根本。但是在2014年年中的时 候,Unity3D官方博客上却发了一篇“The future of scripting in unity”的...
2019-09-23 17:07:30
226
原创 实验12 编写0号中断的处理程序
编写0号中断处理程序,使得在除法溢出时,在屏幕中间显示字符串'divide error!',然后返回dos。前面讲到,内存0000:0000~0000:03FF,大小为1KB的空间是系统存放中断处理程序入口地址的中断向量表。8086支持256个中断,但是,实际上,系统要处理的中断事件远没有达到256个,所以在向量列表中,有许多单元是空的。中断向量表睡觉哦PC系统中最重要的内存区,只用来存放...
2019-09-23 10:05:56
1600
转载 Unity性能优化 – 脚本篇
最近开始进行Unity性能优化的工作,主要分为三类:CPU、GPU和内存。由于我们游戏的核心战斗是计算密集型,所以主要是受限于CPU。CPU的优化又分为渲染和脚本,本文将着重于脚本优化。一般来说,优化必须要知道性能热点在哪里,而知道性能热点则需要在目标设备去进行深度的profile。如果不进行profile,而是靠臆测去进行优化,往往会事倍功半,甚至适得其反。本文所讲述的是已经经过验证的,...
2019-09-19 11:33:35
841
1
转载 Unity性能优化 – 设置篇
Unity性能优化 – 设置篇Posted on 2019/05/30 · Leave a comment想要做好Unity性能优化,主要从CPU,内存,GPU等多方面进行,需要处理好许多事情。在脚本篇中我们就Unity API,C#,IL2CPP,Lua和算法数据结构等多方面提出了性能优化建议。鉴于Unity内设置项繁多,如果某项设置不当,就可能会对性能造成负面影响。本文将从纹理、模...
2019-09-19 11:30:15
1926
原创 汇编语言(王爽 第三版)实验11 编写子程序
编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下。名称:letterc功能:将以0结尾的字符串中的小写字母转变成大写字母参数:ds:si指向字符串首地址应用举例:assume cs:codesgdatasg segment db "Beginner's All-purpose Symbolic Instruction Code....
2019-09-19 09:40:06
1166
转载 c#扩展方法的理解
扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中。扩展方法所在的类也必须被声明为staticC#只支持扩展方法,不支持扩展属性、扩展事件等。扩展方法的第一个参数是要扩展的类型,放在this关键字的后面,告诉编译期这个方法是Money类型的一部分。在扩展方法中,可以访问扩展类型的所有公共方法和属性。“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生...
2019-09-18 20:43:20
276
转载 C#装箱和拆箱(Boxing 和 UnBoxing)
1、什么是装箱和拆箱?简单来说: 装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。(网上广为流传) C#中值类型和引用类型的最终基类都是Object类型(它本身是一个引用类型)。也就是说,值类型也可以当做引用类型来处理。而这种机制的底层处理就是通过装箱和拆箱的方式来进行,利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来...
2019-09-18 15:32:43
179
转载 C#装箱和拆箱(Boxing 和 UnBoxing)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...
2019-09-18 15:20:00
209
转载 浅谈unity中gamma空间和线性空间
一、概述 很久没有写文章了,今天写一篇对gamma空间和线性空间的个人理解总结,在查阅和学习了各个资料后,算是一个个人笔记吧。二、Gamma颜色空间和线性颜色空间其实对于颜色空间的理解,我个人是这样理解的:所有的一切颜色空间,最终的目的,都是为了最终投入到人眼中,能够基本重现自然界的颜色。 记住这一个目的,对下面的一些理解就会更加的有依据了。 2.1 人眼的感...
2019-09-05 17:57:09
354
原创 Unity性能优化(DrawCall合批)
为了在屏幕上绘制一个对象,游戏引擎必须发出一个绘制命令给图形化API接口(如OpenGL 或者Direct3D),DrawCalls通常都是资源密集的,图形化API每一次DrawCall都要做很多重要的工作,会造成CPU一定的性能开销,这通常是由于在显示卡驱动中DrawCall资源密集验证和转化步骤之间状态切换导致的Unity利用两种技术来解决上述问题:Dynamic batching对于...
2019-08-30 11:24:57
3069
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人