计算机网络重点知识整理
计算机网络概述 计算机网络的概念 定义 一些互连的、独立自治的计算机集合。最重要的功能是连通性和资源共享 分类 从网络的作用范围进行分类 广域网 WAN (Wide Area Network) 局域网 LAN (Local Area Network) 城域网 MAN (Metropolitan Area Network) 个人区域网 PAN (Personal Area Network) 从网络的使用者进行分类 公用网 (public network) 专用网 (private network) 接入网 AN (Access Network) 计算机网络的性能指标 基础前置知识 比特(bit)意思是一个二进制数字(0或1)。 B为字节(Byte),b为比特(bit),一字节为8比特,即1B = 8b。 网络技术中的数率指的是数据的传送速率,当数据率较高时,常常在bit/s前面加上字母,比如k = 10310^3103,M = 10610^6106,G = 10910^9109,T = 101210^{12}1012等。 注意区分网络传输和文件系统中的数据后缀字母。比如一个100M...
接入Recastnavigation寻路到ET5.0
前言 因为Unity版本的更新迭代,老版本的A*插件在新版本Unity已经无法正常使用,包括一些运行时代码也已经过时,重新接入要花费很多时间,干脆接入一个新的寻路方案吧。 这里选择的是久负盛名的https://github.com/recastnavigation/recastnavigation,但因为他是基于C++的,所以我们要使用C#的P/Invoke来调用它的dll来实现寻路。 由于篇幅与操作复杂的原因,本文会更加注重大体的工作流程,而不会有太多细节上的图片,但是会有一个配套的详细教学视频供大家学习,视频链接:https://www.bilibili.com/video/bv1uK4y1E7CV。 C++/C#的桥接源码也会以在码云开源的形式分享给大家,完整的示例可以在我的Moba项目 https://gitee.com/NKG_admin/NKGMobaBasedOnET 中看到。 通过本文和配套视频你将能学习到recastnavigation的大体设计思路,使用方式,Unity/服务器接入recastnavigation的完整流程。 感谢@footman大佬在我学习过...
C#对于非托管资源的释放原理探究
前言 我们都知道CLR有一个使用根的可达性算法的垃圾回收机制来回收托管内存,那么对于那些本机资源(非托管内存)他又是怎么清理的呢? 正文 要看他怎么清理资源,首先要知道这个资源是怎么来的,这里我们用FileStream这一经典类来探讨这些问题。 首先是它的构造函数 12345678910111213141516171819202122[SecuritySafeCritical]public FileStream(string path, FileMode mode) : this(path, mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.None, Path.GetFileName(path), false){}[SecurityCritical]internal FileStream( string path, FileMode mode, FileAccess access, Fi...
数字图像处理复习纲要
第一章 1.数字图像的概念: 数字图像:数字图像是对连续图像数字化或离 散化的结果,也称离散图像 2.广义的图像处理(图像工程)包含的三个层次 3.像素的概念 一幅图像可分解为许多个单元。每个基本单元叫做图像元素,简称像素 4.灰度图像存储容量的计算 空间分辨率:图像的尺寸(M∗NM*NM∗N),在成像时采了MN个样,图像包含了MN个像素。 幅度分辨率:在成像时量化成了G(G=2kG = 2^kG=2k)个灰度级,存储一幅图像所需的位数b(b=M∗N∗kb = M * N * kb=M∗N∗k)(单位是bit) 第二章 1.像素的邻域 2.像素间距离,三种距离公式 像素间距离 : 欧氏距离(也是范数为2的距离):DE(p,q) = [(x − s)2 + (y − t)2]12D_E(p,q)\;=\;\lbrack{(x\;-\;s)}^2\;+\;{(y\;-\;t)}^2\rbrack^{\frac12}DE(p,q)=[(x−s)2+(y−t)2]21 城区距离(也是范数为1的距离): D4(p,q) = ∣x − s∣ + ∣y − ...
数据结构篇:邻接表
每一个顶点后面就是一条链表,每个顶点都存在数组里。 以这张图为例 结构如下 运行截图 结构体定义 12345678910111213141516171819202122 //边表结点typedef struct EdgeNode { //顶点对应的下标 int adjvex; //指向下一个邻接点 struct EdgeNode *next;} edgeNode;//顶点表结点typedef struct VertexNode { //顶点数据 char data; //边表头指针 edgeNode *firstedge;} VertexNode, AdjList[100];//集合typedef struct { AdjList adjList; //顶点数和边数 int numVertexes, numEdges;} GraphAdjList; 完整程序 1234567891011121314151617181920212223242526272...
DFS和BFS
深度优先遍历 (DFS) 深度优先遍历,也称作深度优先搜索,缩写为DFS 深度优先遍历从某个顶点出发,访问此顶点,然后从v的未被访问的邻接点触发深度优先便利图,直至所有和v有路径想通的顶点都被访问到。 这样我们一定就访问到所有结点了吗,没有,可能还有的分支我们没有访问到,所以需要回溯(一般情况下都设置一个数组,来记录顶点是否访问到,如果访问到就不执行DFS算法,如果未被访问过就执行DFS算法) 以这张图为例 我们约定,在没有碰到重复顶点的情况下,优先选择右手边 那么按深度优先遍历就是:A B C D E F G H(此时这条线路已经走到尽头,可是还有一个I顶点没有遍历,所以回到G,发现G的邻接点都遍历过了,再回到F,发现F的邻接点也都遍历过了。。。直到D顶点,发现I这个顶点没有遍历,所以把I再遍历,继续回溯,最终回到起点A) I 落实到代码就是 123 //访问标志的数组,为1表示访问过,为0表示未被访问int visted[100]; 1234567891011121314151617 //邻接表的深度优先遍历算法void AdjacencyList::DFS(GraphAd...
数据结构篇:校园最短路径导航
地图数据的配置以及图的建立[toc] 首先去找一张学校的地图,并且自己配置好数据和路线** 在代码里面写好数据 123456 //地点信息char _mapName[32][50] = {"行政楼","实验楼D", "教学楼A", "篮球场", "足球场", "A4", "实验楼C", "教学楼B", "A2", "A6", "计算机系", "苏果超市", "果曼优品", "实验楼A", "教学楼C", "图书馆", "一食堂", "D2", "D8", "C4", "中国联通", "羽毛球场&q...
数据结构篇:单链表
本程序以类似应用程序的对话框形式进行单链表的操作。希望对大家的学习有所帮助。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881...
数据结构篇:二叉树
二叉树的创建,递归遍历及其他基础知识 二叉树的相关概念 结点的度。结点所拥有的子树的个数称为该结点的度。例如右图B结点度数为2 叶结点。度为0的结点称为叶结点,或者称为终端结点。例如右图的F,D,C结点 分枝结点。度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶结点外,其余的都是分支结点。例如右图的A,B,E,左图的A,B 结点的层数。规定树的根结点的层数为1,其余结点的层数等于它的双亲结点的层数加1。例如右图的F结点层数为4 树的深度(高度)。树中所有结点的最大层数称为树的深度。例如右图深度为4 树的度。树中各结点度的最大值称为该树的度。一般情况下,二叉树的度都为2 先给出结构 12345 struct BiTree { char data; BiTree *lchild,*rchild;}; 二叉树的创建 只能用先序法创建,单独的中序或后序都无法进行创建,原因和解决办法我会在以后博客进行完成 12345678910111213141516171819202122232425 BiTree * Tree :: PreCrea...
C#篇:剖析c#中的异步方法
本文翻译自 https://blogs.msdn.microsoft.com/seteplia/2017/11/30/dissecting-the-async-methods-in-c/ 前言 c#语言对于开发人员的工作效率非常好,我很高兴最近的努力使它更适合于高性能应用程序。 下面是一个例子:C#5引入了“async”方法。从用户的角度来看,该特性非常有用,因为它有助于将几个基于任务的操作组合成一个操作。但是这种抽象是有代价的。任务是引用类型,在创建它们的任何地方都会导致堆分配,即使在“async”方法同步完成的情况下也是如此。使用C#7,异步方法可以返回类似于任务的类型,比如ValueTask,以减少堆分配的数量,或者在某些场景中完全避免它们。 为了理解所有这些是如何实现的,我们需要深入了解异步方法是如何实现的。 历史回顾 但首先,让我们回顾一下历史。 类Task和Task<T>是在.Net 4.0中引入的,在我看来,在.Net中的异步和并行编程领域发生了巨大的思想转变。与以前的异步模式(如.Net 1.0中的BeginXXX/EndXXX模式,也称为“异步编程模...










