自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 c# 函数返回多个返回值的方式

class Program { static void Main(string[] args) { new Program().Start(); } void Start() { int i; float f; (i,f) = f1(); //或者这样写也行 //va

2021-11-08 21:39:19 1156

原创 利用数组实现lru

LRU主要包含两个函数,第一个插入一个页面,第二个获得一个页面主要思路如下,当插入页面的时候,所有的页面向后移动一个单位(若果多出来一个元素舍弃掉),然后把这个页面放到数组首元素当获得一个页面的时候,就便利数组,找到这个页面然后放到最前面代码如下://页面struct page{ int id; //...其他信息 page(int _id) : id(_id) {}};//LRU类class Array_LRUCache {private: vector<page*&

2021-10-12 20:28:36 335 1

原创 KCP协议探索

项目地址KCP的包头:|<------------ 4 bytes ------------>|+--------+--------+--------+--------+| conv | conv:Conversation, 会话序号,upd是无连接的,conv用来标识来自哪一个客户端,对连接的一种替代+--------+--------+--------+--------+ cmd: command,用于标识指令,例如:pus

2021-09-25 17:07:41 563 3

原创 unity 场景异步加载

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.SceneManagement;using UnityEngine.UI;public class LoadScene : MonoBehaviour{ public Button btn; public Slider slider; public Text text; v

2021-07-12 10:15:52 92

原创 关于transform.forward和Vector3.forward

transform.forward:是自身坐标的前方,是个变化的值,Vector3.forward : 是世界坐标的前方,永远都是(0,0,1)顺便记录一下采了一下午的坑:当物体没有发生旋转的时候,Vector3.forward = transform.forward当发生旋转的时候才是不一样的...

2021-07-10 19:53:58 193

原创 unity shader 复杂光照(前向渲染)

前向渲染在以往的shader编写中,都是只有针对一个光源,即平行光,对应的也只有一个pass当存在多个光源的时候,既有平行光,也有点光和聚光的时候,前向渲染会对每一个灯光进行一次pass的计算,所以当物体较多的时候,比较浪费性能之前的shader中总会有这么一段代码这就是告诉unity,该pass使用前向渲染的ForwardBase路径,前向渲染还包括一种路径叫做ForwardAdd其中ForwardBase是用来计算环境光,自发光,以及最重要的平行光(只计算一次,除非双面渲染)Forward

2021-06-18 18:31:42 337 2

原创 shader-透明效果学习

透明度测试一种比较极端的透明方法,它无法实现半透明效果,它的透明度要么为1,要么为0,也就是要么完全透明,要么完全不透明。透明度测试就是要判断一下,吧不满足条件的像素值剔除掉在shaderlab中,为什么提供了一个内置的函数,clip(float x)如果传入的参数小于0 那么该像素块就会被剔除掉Shader "Custom/AlphaTest"{ Properties { _MainTex ("Albedo (RGB)", 2D) = "white"

2021-06-17 17:29:42 274 2

原创 shader学习2-光照

漫反射光强和 物体表面法线与光的方向的夹角的余弦值有关我们需要知道 入射光线的颜色 物体表面的法线和光源的方向计算公式为:光的反射系数 * 光的颜色 * (法线和光线方向的夹角余弦)逐顶点漫反射计算都写在了顶点着色器之中Shader "Custom/DiffuseVertex"{ SubShader { // 逐顶点的漫反射 pass{ Tags{"LightMode"="ForwardBase"}

2021-06-11 10:12:54 185 3

原创 shader学习1-语法

shader初步认识在vscode里面装上 shaderlabvscode插件就可以写了Shader "Custom/Test"{//针对某个显卡的subshader subshader{ pass{ CGPROGRAM #pragma vertex vert //定义定点着色器的函数名称 #pragma fragment frag //定义片原着色器的函数名称 //输入的是模型空间的坐标,输出的是

2021-06-11 09:36:12 183

转载 win10 系统重置之后鼠标在桌面右键之后一直转圈圈的问题

因为毛病太多了,就把系统重置了,然后发现电脑桌面不能鼠标右键,我以为是系统问题,然后重启还是不行然后我又重置了一次,这次是下载的win10,还是不行,最后找了半个晚上终于搞好了win+R 输入 services.msc 命令找到这个选项把他设置为禁用就可以了...

2021-05-30 04:40:03 903 2

转载 RSA加密

算法思路:随机选择连个互质的整数p和q假设我们选择 43 和 59计算得到 p 和 q 的积 n,算出 n 的欧拉函数n的欧拉函数是指 [ 1 , n-1 ] 里面与 n 互质的元素的个数假设p和q都是质数,那么n的欧拉函数就是p的欧拉函数和q的欧拉函数的积φ(n) = (p-1)(q-1)得到 n=2537φ(n) = 2436随机选择一个整数e,使得 1< e < φ(n),且e与φ(n) 互质,n和e的值将作为公钥我们选择13,即公钥为(2537,13)

2021-05-28 19:33:26 118

转载 lua学习笔记

LuaEnv luaEnv = new LuaEnv();先构造lua的运行环境c#中执行lua执行一条语句 //执行一句lua语句 luaEnv.DoString("print('i love you 3000');");执行一个脚本//执行一个lua脚本luaText = Resources.Load<TextAsset>("ForMyTest.lua");luaEnv.DoString(luaText.text);luaEnv.DoString("require '

2021-05-15 16:41:40 225

转载 c++ 单列模式的写法

第一种 懒汉式,多线程操作会出问题,而且值负责new对象,没有删除class Singleton{private: Singleton(){} Singleton(const Singleton & s)=delete; Singleton & operator = (const Singleton &s)=delete; static Singleton* _instance;public: Singleton* get_inst.

2021-03-20 13:30:54 137

原创 贪心法 区间覆盖问题

记得大一的时候做过这个类型,当时在vj提交了40多次还是WA,后来还是看了答案,到今天为止都只是有思路,但是代码经常写不出来力扣的 1326题目就是这类型的这类问题就是把区间按照左边的值从小到大排序,然后遍历区间,找下一个的左值在这个区间内并且右值最大的那个点作为下一个区间,代码如下:class Solution {public: struct Range{ int left; int right; Range(int l,int r){

2021-03-19 21:54:55 149

原创 字节对齐

今天面试被问到什么是字节对齐:然后自己支支吾吾的说出了大概是个啥东西,然后具体也说不清楚那么什么是字节对齐呢?对于一个变量而言,假设其占有n个字节,那么该变量的起始地址就必须是n的整数倍,如果是结构体,那么结构体的起始地址也必须是最宽的数据成员的字节整数倍的字节对齐的目的就是为了提高程序执行的效率,使得cpu访问数据的时候不需要第二次访问class A{ char c1;};以上的代码之中,sizeof(A) 的结果为1 因为A只是占了一个字节那么再看下面的代码:class

2021-03-15 21:29:20 64

原创 二叉树的莫里斯(Morris)遍历

本文章转载来自:https://blog.csdn.net/danmo_wuhen/article/details/104339630莫里斯其实就是把空间复杂度优化到O(1)的二叉树遍历算法。Morris遍历的算法思想假设当前节点为cur,并且开始时赋值为根节点root。判断cur节点是否为空如果不为空如果cur没有左孩子,cur向右更新,即(cur = cur.right)如果cur有左孩子,则从左子树找到最右侧节点pre如果pre的右孩子为空,则将右孩子指向cur。pre.r

2021-03-10 20:44:30 158

原创 A*(A星)寻路算法

首先非常感谢唐老师的课程,讲的非常好添加链接描述三个变量:G值 = 父节点的G值 + 父节点到当前点的移动代价(父节点的G是0,如果斜着走就是根号2,直着走就是1)H值 = 当前点到结束点的曼哈顿距离寻路消耗公式 F:=G+H还有两个列表开放列表: 吧当前所有可以走的节点都放进开放列表关闭列表:每一次走过一个节点之后都把这个节点放到关闭列表里面具体步骤a、将开始点记录为当前点Pb、将当前点P放入关闭列表c、搜寻点P所有邻近点,假如某邻近点既没有在开放列表或关闭列表里面

2021-03-08 12:08:00 706 1

原创 排序算法总结

1冒泡排序:重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复地进行直到没有再需要交换的数据,也就是说该数列已经排序完成 ,这样,最小的元素会慢慢的浮到最前面时间复杂度:O(n²)空间复杂度:O(1)代码: void MaoPao(int[] arr) { for(int i = 0; i < arr.Length; i++) { for(int j = 0;

2021-03-06 11:31:37 100

原创 C++ static_cast、dynamic_cast

static_cast:类似于c++里面的强制类型转换,在编译器就完成,转型错误会报错原有的自动类型转换,例如 short 转 int、int 转 double、const 转非 const、向上转型等;void 指针和具体类型指针之间的转换,例如void *转int *、char *转void *等;有转换构造函数或者类型转换函数的类与其它类型之间的转换,例如 double 转 Complex(调用转换构造函数)、Complex 转 double(调用类型转换函数)。不能把const转成非co

2021-03-03 20:37:29 84 1

原创 c# foreach原理

要想使用foreach遍历就要使这个类继承自IEnumerabler接口,foreach的底部也是调用的这个接口里面的函数只有实现了IEnumerable接口的类(也叫做可枚举类型)才能进行foreach的遍历操作,集合和数组已经实现了这个接口,所以能进行foreach的遍历操作集合继承IEnumerable这个接口,而IEnumerable的 IEnumerator GetEnumerator()方法 可以获得一个可用于循环访问集合的 对象没有不知道怎么才能解释清楚,自己实现一个foreach就知

2021-03-03 18:09:44 287 1

原创 剑指 Offer 26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)刚开始的思路很简单 遍历A 对于A的每一个节点都当做根节点去和B比较,如果两个节点都为空 true如果两个节点有一个不为空 false如果两个节点都不为空,若val值不相等false 相等就继续递归下去代码如下:class Solution {public: bool flag=false; bool isSubStructure(TreeNode* A, TreeNode* B) {

2021-03-01 19:50:42 53

原创 设计模式学习 - GOF 23中常见设计模式

行为型模式命令模式:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,同时支持可撤消的操作。责任链模式:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止解释器模式:给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。迭代器模式:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节类比一下c++中的迭代器中介模式

2021-01-25 19:13:32 1080 2

原创 c# 容器探索

c# list底层原理:c#的list底层就是c++的vector 只不过初始内存为4个容量大小,每次扩容为2倍扩容,和vector一样申请新的内存,然后复制

2021-01-23 12:52:18 3481 6

原创 unity entity0.11 版本使用ecs

看了老版本的的视屏,这种写法一直报错,然后好长时间才搞定,终于不报错了在场景新建一个物体,加上 DOTS -> ConverttoEntity 脚本新建一个 移动component 脚本这个是组件 ,里面只有数据加上[GenerateAuthoringComponent] 就可以吧这个拖到物体上去, [GenerateAuthoringComponent] public class MoveDirection : IComponentData { publ

2021-01-10 21:35:54 187

原创 Unity ECS 学习记录

ECS这种老生常谈的话题就不说了,本次版本是用的Unity的2019.4的版本,因为Ecs的版本更新太快,api更新太频繁,所以学习起来是比较的麻烦,而且教程也是有限ECS快的原因需要去了解dots,推荐大家看一看这个视频 DOTS从原理到应用-雨松MOMO首先如果学过计算机组成原理或者操作系统应该知道,计算机的存储层次最快的为cpu寄存器,往下是主存,但是主存的访问速度与cpu的处理速度相差太远,于是在二者之间加了一个高速缓存来解决这个问题ECS所做的主要工作,就是来提高缓存的命中率...

2021-01-10 17:15:44 236

原创 c# 扩展方法

之前在用unity DoTween这个插件的时候,突然想到GameObject对象并没有哪些所谓的插件里面的方法,但是为什么每一个gameobject还能够调用dotween里面的方法呢后来一查资料才知道,c#有个东西叫方法的扩展格式:被扩展的方法一定写出静态 第一个参数为 (this 扩展的类名 变量名 , …)举个例子: interface IMyInterface { void Test1(); } class MyClass : IMyI

2021-01-07 21:19:10 129

原创 c#协变与逆变

逆变:子类变成父类协变:父类变成子类in和out:只能用来修饰委托和接口 类和结构体不行in:只能当做参数 逆变out:只能当做返回值,不能当形参 协变以下都是错误的:​ delegate T TestIn<in T>(T t); //不能返回T类型​ delegate T TestOut<out T>(T tem); //T类型不能当做形参作用:1 out修饰的的泛型类型,只能作为返回值类型,in修饰的泛型类型,只能作为参数类型2 遵循里式替换原则 用他

2021-01-07 20:56:09 189

原创 剑指offer-28-判断二叉树是否关于镜像对称

如何获得二叉树的镜像?其实就是把左右子节点swap一下就行了这题不用求二叉树的镜像,直接遍历一下就行了刚开始的想法很简单,第一个思路就是判断左序遍历二叉树和右序遍历二叉树的结果是否一样,但是WA了后来仔细一想确实不对,以下的情况不管怎么遍历结果都是一样的然后还是没忍住看了一下题解,其实只要判断左子树的左右节点 和右子树的右左节点是否一样就行了,以下是递归的写法: private bool IsNodeEqual(TreeNode t1,TreeNode t2) {

2021-01-06 11:59:35 104

原创 c++ 关于#define和typedef

#define是宏定义 直接替换,可以理解为字符串的替换typedef是对类型的一种封装举个栗子 char* a,b; cout<<sizeof(a)<<" "<<sizeof(b);其结果可知,a是指针类型,b是char类型 (指针一律 4|8 个字节 )还可以得知int* a int * aint *a三者是等同的 都等于int *a那么当我们使用typedef的时候(以下两种写法一样)typedef int *pint;ty

2021-01-04 22:32:50 91

原创 c++ STL set

set可理解为一个集合,因此set的插入的值是不能重复的set的底层是一颗红黑树,因此set的插入查找效率比较高,set的底层会对元素进行排序set自定义排序的方式重载 < 运算符号struct student{ int id; string name; student(int ID=0,string s=""):id(ID),name(s){} bool operator < (const student &s)const{ re

2021-01-04 12:24:38 68

转载 unity JobSystem(作业系统)

JobSystem :unity提供的一套多线程解决方案,使用这个东西可以极大的提升游戏的运行效率NativeContainerNativeContainer 是一种托管值类型,为本机内存提供了一个相对安全的 C# 封装器。它包含一个指向非托管分配的指针。与 Unity C# 作业系统一起使用时,NativeContainer 允许作业访问与主线程共享的数据,而不是使用副本。如何创建一个job首先创建一个结构体 实现IJob接口,在接口内部实现Excute()方法,作业的任务处理就放在这个函数之中

2021-01-01 18:21:36 5069

转载 剑指offer-65 不用加减乘除符号实现加法运算

两个数相加 在二进制中 只有1+1需要进位,进位之后这个位置结果为0,下一位的结果要加上1异或 运算是进行的是 不进位加法,但是所进的位该怎么表示因为只有1+1才能进位,而只有 1&1 的结果为1 ,用 与 运算符得到两个数的结果,1表示在这个位置要进位,0则不进,而进位要加在下一位上面,所以 a&b 的结果要左移一位这样a+b的结果就可以表示为 a^b + (a&b)<<1当b=0的时候,结果就是a 因此我们找到了递归条件计算机减法也是用补码进行加法来计算的

2020-12-26 16:41:23 75

原创 软件工程期末考试复习

软件工程期末复习填空题:1 可行性研究 的目的是用最小的代价在尽可能短的时间内确定关键项目是都能够开发,是否值得去开发2 软件工程于 1968 年提出3 软件工程三要素是 过程 方法 和 工具4 软禁危机的主要原因是 软件本身的特点及开发的方法5 CRC技术中 C R 和 C 分别表示 类 职责 和 协作6 当模块A调用B模块是,若两个模块之间传递的是数值类型参数,则这两个模块的耦合方式是 数据耦合7 结构化分析中,用于描述加逻辑的主要工具有三种,即:结构化语言 判定表 判定树8 程序的效

2020-12-23 19:56:47 10005 8

原创 c++ list

list是一个双向循环链表链表在每一次插入的时候,申请一块新的内存保存数据 删除的时候会释放这块内存,因此,相比较于deque来说,list不会造成内存的浪费但是链表内存消耗相对来说也是比较的大 因为每一个节点都保存了下一个节点和上一个节点的地址 众所周知,一个指针在32位操作系统中要占用4个字节(64位8字节)list不支持随机访问,vector和deque可以支持随机访问构造函数 list<int>l2; list<int>l3(10,1);

2020-12-23 17:09:46 78

原创 c++ stack和queue

stack 栈 先进后出 ,可以理解为一个桶。先进去的都是在桶底,后进去的在桶的顶部queue 队列 先进先出 可以理解为排队,谁先来谁就在前面底层实现:我们可以发现 ,其实stack和queue的底部就是一个deque,所有的操作其实都是在操作这个东西构造函数: ·deque<int>d; stack<int>s1(); 默认的构造函数 stack<int>s2(d); 传入一个deque,把deque的值复制进.

2020-12-22 21:58:44 107

原创 c++ STL deque

vector是一个单向的线性数组,只能在尾部进行插入操作deque 可以在头部和尾部都可以进行插入操作,deque采用分块的线性存储结构来存储数据,每一个块都是用map来管理,map中存储的是块的首地址,内存不够的时候去申请新的块内存,每一个块中都像数组一样线性存储大概类似这样:构造函数:deque<int> d(); //默认deque<int> d(5); //默认size为5deque<int> d(5,1) //默认长度为5 默认值为1dequ

2020-12-21 17:46:27 173 1

原创 c++ STL vector

vector是一个动态的数组vector -构造函数vector():创建一个空vector vector<int>v1;//v1.capacity()=0vector(int nSize):创建一个vector,元素个数为nSize vector<int>v2(10);//v2.capacity()==10vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t vector<int

2020-12-21 16:26:29 92

原创 c++重载new delete

当我们new 一个对象的时候,编译器会为我们做一下这些事情1:申请内存2:调用这个对象的构造函数当我们delete一个对象的时候,编译器会为我们做一下这些事情1:调用对象的析构函数2:释放指针指向的内存当我们重载new 和delete 的时候,我们可以改变第一步,(第二步该干啥还是就干啥)c++有默认的new个delete 当编译器找不到对应的重载的时候,会调用默认的new 和 delete重载有分为两种,一种是全局的,那么调用new任何对象都会调用这个函数另一种是局部的,写在类的内部(

2020-12-18 21:07:25 277 1

原创 c++虚析构函数

如果一个类被当做基类,最好吧析构函数协成虚函数,加入一个父类指针指向子类的对象,当delete其对象的时候,之后调用父类的析构函数,不会调用子类的析构函数如下例子所示#include<bits/stdc++.h>using namespace std;class A {public: virtual ~A(){ cout << "a"; }};class B :public A {public: ~B(){

2020-12-18 20:10:02 182 1

原创 两个链表的第一个公共节点(剑指offer 52)

输入两个链表的头结点,找出两个链表的第一个公共节点如果暴力解决的话,复杂度 n*m不用说了但是可以从后面开始遍历,因为既然是公共节点,从后开始都是一样的,然后知道找到第一个不一样的节点,他的前一个节点就是我们的答案下面附上代码:struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Solution {public: ListNode *

2020-12-11 20:45:40 88

空空如也

空空如也

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

TA关注的人

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