接入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大佬在我学习过...
计算机操作系统复习纲要
操作系统引论 操作系统基础知识 定义:操作系统(Operating System,OS)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。 设计目标:在计算机系统上配置操作系统,,其主要目标是方便性,有效性,可扩充性和开放性。 作用:可以从用户,资源管理以及资源抽象等多个不同角度来分析讨论。 OS作为用户与计算机硬件系统之间的接口 OS作为计算机系统资源的管理者 OS实现了对计算机资源的抽象 操作系统的发展过程 未配置操作系统的计算机系统——单道批处理系统——多道批处理系统——分时系统——实时系统——微机操作系统的发展 单道批处理和多道批处理系统的原理,优缺点 单道批处理系统 原理 计算机系统自动的一个作业紧接一个作业地进行处理,直至磁带上所有作业全部完成。虽然系统对作业的处理是成批的,但在内存中始终只保持一道作业。 优缺点 主要缺点是系统中的资源得不到充分利用。优点是一定程度上提高了系统资源利用率。 多道批处理系统 原理 用户所提交的作业先存放在外存上,并排成一个队列,然后作业调度程序按照一定的算法,从队列选择若干个作业调入内存,使他们共享CPU和系统中的各种资源。...
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 − ...
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...
数据结构篇:邻接表
每一个顶点后面就是一条链表,每个顶点都存在数组里。 以这张图为例 结构如下 运行截图 结构体定义 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...
数据结构篇:校园最短路径导航
地图数据的配置以及图的建立[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...
关于ISharedComponent的一切
前言 ECS中的ISharedComponent是一个非常重要的概念,但是理解起来却不是这么容易,前阵子找到一篇讲ISharedComponent的文章,感觉例子举的很好,讲的也很透彻,故翻译出来分享给大家。 本文翻译自:https://gametorrahod.com/everything-about-isharedcomponentdata/ 正文 这是ECS最容易被误解的功能之一。当您不知道它是如何设计的时候,通常会出现诸如“如何在工作中获取SCD数据?我不能?那有什么卵用!”这样的问题。因此,让我们开始了解它是如何工作的。 数据共享并不那么ECS 众所周知,ECS会紧密排布entity数据成为chunk。同样,高性能C#(HPC#)的限制是得确保您没有通往外界的任何“门户”。static无法使用。禁用别名。分析器无法通过公有字段引入job的引用类型。它也不会让您将指针潜入IComponentData其中。另外,存储器必须是线性的。 “共享”的概念听起来根本不像ECS。在ECS中,可以从chunk中获取任何用来工作的数据。您不会在任何地方跳转,这就是“默认情况下的性能”的来...












