- 博客(97)
- 收藏
- 关注
原创 Pytorch进阶训练技巧
当pytorch提供的内置损失函数无法实现需求时,可以通过自定义损失函数来实现目标。内置损失函数定义在torch.nn中,常用的有MSELoss(),L1Loss(),CrossEntropyLoss()等。自定义损失函数常通过类实现,像自定义神经网络一样,继承nn.Module()并且实现__init__()和forward()函数,在使用时,直接实例化类对象即可,这样实现的好处是全程用pytorch内置的数据结构进行处理,规范统一。动态调整学习率的目的是让减少网络训练中震荡,是loss继续下降,模型
2022-03-18 16:54:08
1079
原创 在C#方法中使用using的意义
在C#函数方法体中使用using,表明一个类只能在当前方法体中存在,出了方法体就会调用该函数的析构函数。但是该类必须实现了IDisposable接口,并且除非该类的析构函数定义为虚函数且子类重写了,否则都只会调用该类的析构函数,并不会像C++释放全部内存,依然还是要CLR去管理。与C++基类定义为虚函数了,子类析构则自动调用子类析构再父类析构不同,C++基类析构定义为虚函数则是后绑定,动态联编,会释放全部内存。C#: class A : IDisposable {
2021-02-27 15:31:43
760
原创 关于sizeof()空间计算和索引-1的记录
问题一:结果为4,4,1;如果去掉虚函数func2(),则结果为1,1,1说明两个问题,加了虚函数则有了虚函数表,则父类和子类都变为4个字节(一个指针大小),如果为空类,则占用一个字节。静态数据放在静态区,不参与sizeof的运算。如果将静态换为非静态,无论是public还是private,结果都为8,8,1问题二:[-1]表示指针向前移动一位,如果未定义则是野指针,否则会正常输出值结果返回ed计算过程为 str指针移动4位到hi,再回退一位到ed...
2020-09-18 20:27:00
279
原创 关于位运算的记录
正数的位运算就是转二进制后直接运算,包括与或非和左右移等。负数的位运算,要先转二进制:最高位为1,然后剩余7位按正数处理,然后取反,得到反码,然后加1,得到补码。利用补码进行二进制运算,如果得到结果最高位为0,则输出结果。如果最高位为1,则逆向运算,先减一,再取反,得到负数值。对于左移和右移的操作,不管该数为正或者负,都是增大或减小2^n倍(溢出位舍弃)...
2020-09-18 18:23:05
141
原创 C++类型转换
静态转换:static_cast,最常用的转换,用于基础数据类型和子类父类之前的引用或者指针转换。动态转换:dynamic_cast,最安全的转换,对于转换要求很严格,例如丢失精度等都不允许。常量转化:const_cast,只能对指针或者引用进行操作,将数据在const和非const之间进行转换。...
2020-08-22 13:04:59
111
原创 C++类模板的基本使用
类模板与函数模板最大的区别在于类模板不支持类型推导,需要显示指定参数类型:当模板类作为参数传递时,有如下三种方式:模板类的继承时,如果子类不是模板类,则需要显示指定基类类型(否则子类实例化时不知道基类的类型),如果子类也是模板类,那么可以设置模板参数来分别标识子类和基类的成员。模板类不要做分文件编写,都写在一个文件中,最后将该文件改写为.hpp后缀,然后主文件就include该.hpp文件。原因是模板类的声明和实现分文件编写不能链接上...
2020-08-22 11:28:46
533
原创 C++函数模板的基本使用
函数模板类似于C#泛型,使用时编译器优先寻找普通函数。//类或者方法(表示模板类或者模板方法)template<class T>void InsertSort(T nums[],int len){ for (int i = 1; i < len; ++i) { int tmp = nums[i]; int j; for (j = i - 1; j >= 0; --j) { if (nums[j] > tmp) { nums[j
2020-08-16 18:01:11
459
原创 C++向上向下类型转换的安全性问题
向上类型转换是指子类对象转为父类对象,向下类型转换是指父类对象转换为子类对象。(父辈在上)如果没有发生多态(父类指针指向子类对象),那么向下转换是不安全的,向上转换是安全的。Animal* anim = new Animal;基类转派生类Cat* cat = (Cat*)anim;这样是不安全的,因为Cat所占大小比Animal更大,而申请空间只有Animal大小,指针转换后可能会导致越界。如果发生多态,Animal* anim = new Cat; Cat* cat = (Cat*)ani
2020-08-16 17:17:19
1357
1
原创 C++抽象基类和纯虚函数、虚析构和纯虚析构
C++中抽象基类的定义与C#中的abstract描述的类相似,只不过C++中没有abstract关键字,而是通过在类中声明一个纯虚函数,从而达到该类是抽象基类的目的。所谓纯虚函数,就是只有声明而没有定义,所有继承该类的子类都必须重写该函数,在C++中的写法就是 virtual void func01() = 0;虚函数等于0表示是纯虚函数。...
2020-08-02 21:02:11
468
2
原创 C++菱形继承、虚继承和虚基类
所谓菱形继承,就是一个父类有两个子类对象,然后又有一个类继承了这两个子类对象。这样会导致该类中有两份数据,造成数据的浪费,一个解决办法就是使用虚继承。让两个子类virtual继承父类,那么则会保留两个虚基类指针,在类继承这两个对象时,则会保留这个虚基类指针,同时数据也会只有一份,可以通过虚基类指针在虚基类表中找到数据的位置。...
2020-08-02 20:43:48
205
原创 C++虚函数指针与虚函数表
当父类中某个方法有virtual关键字修饰,则该方法被放入虚函数表中,同时,有一个指针指向该父类的虚函数表。 当子类继承父类后,子类会继承父类的虚函数指针和虚函数表,(在子类构造函数调用时)会将自己的虚函数指针指向自己的虚函数表,但是如果子类重写了该方法(加virtual或者不加都可以,但是方法必须完全相同包括返回值),那么子类的虚函数表中的函数则会改变。 父类指针指向子类对象时,发生动态联编,如果虚函数表被重写,则调用父类虚函数会指向被重写的方法,否则父类指针指向自身的方法,是静态联编。当父类.
2020-07-30 22:22:44
1189
原创 C++继承方式、继承中的对象模型、继承中的同名处理
继承方式共有继承、保护继承、私有继承 继承中的对象模型,子类会继承基类全部内容,而且包括私有成员,但是编译器不会让我们看到。 继承中的同名处理 同名的属性 调用子类属性时会默认调用子类的,如果想访问父类的属性,则需要调用父类然后用作用域运算符得到父类属性。 同名的方法 调用子类的方法时会默认隐藏父类的方法,如果想调用父类的方法,一样需要调用父类然后使用作用域运算符获取 son.MyBase::show(10); 继承中静态成员同名的处理 类似非静态的属性和方法,默认也是隐藏了父类的方法.
2020-07-28 22:40:14
120
原创 C++常函数、常对象、单例模式、友元、引用的本质、this指针的本质
用const修饰类的成员函数,那么该成员函数就不能修改类中的属性值,该函数又称常函数。原因是类的成员函数有隐式的this指针,this指针本质是指针常量,加了const变为常量指针常量,不允许修改指针所指向的内容。用const修饰类的对象,那么该对象不允许修改其属性值,同时也只能调用该对象的常函数,该对象又称常对象。C++中写单例模式需要将默认构造函数、默认拷贝构造函数设置为私有,并设置私有的静态指针然后再设置共有的静态方法,用来获取其中私有的静态指针,然后再在类的外部实例化出静态指针。.
2020-07-26 20:59:03
131
原创 SP专场问题整理(一)
1.C#中协程的原理是什么?线程和协程的区别是什么?协程的底层实现原理是什么?如果同时运行多个协程需要注意什么?进程是系统资源分配的最小单位,线程是任务调度的最小单位,可以理解协程是一种用户态的轻量级线程,它提供了由程序员来控制的何时开启并在何时暂停的机制。协程拥有自己的寄存器上下文和栈,协程调度切换时,会将当前的寄存器上下文和栈保存在另一个地方,在切换回来的恢复之前的寄存器上下文和栈,由于是直接操作栈,所以性能高效。线程的执行涉及到同步与锁的问题,然而协程本身不是多线程,它和update函数一
2020-07-09 22:07:31
771
原创 C++ 野指针、指针悬挂以及内存泄漏的概念
野指针:指针没有做初始化操作,从而不明确指针所指向的位置,成为野指针。指针悬挂:指针所指向的内存空间已经被删除,从而该指针所指向的空间就不确定了,容易导致错误或者崩溃。内存泄漏(Memory Leak):是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。...
2020-06-29 15:56:31
615
原创 C# 值类型和引用类型的性能比较
值类型都继承自System.ValueType,引用类型的继承链上没有System.ValueType,但是System.object是所有类的基类。C#的结构类型,比如int32等。结构类型不能继承,但是可以实现接口。为什么说结构不能继承,但是又继承于System.ValueType,而结构是值类型,其根基类是引用类型?这主要是因为微软对值类型进行了特殊的处理,CLR会自动给值类型分配栈上空间,引用类型分配堆内存。在介绍值类型和引用类型的性能之前,我们需要先知道堆和栈空间:对于一个32位操
2020-06-29 14:59:05
959
原创 C# 引用类型和值类型的堆栈分布
一、引用类型一定放在堆上吗?面试官提到这个问题的时候,我第一反应当然说不是,然后我就说引用类型可能持有值类型的对象,而该对象存放在栈上……然后我开始觉得不妥……面试官接着问,那么在方法体结束后,栈上的临时空间释放了,那么该引用类型所持有的对象去哪里了呢……这时候意识到可能回答错误了,但是我就着这个问题回答,如果引用类型持有了某个值类型对象,那么会将其装箱在引用类型的堆内存中,当栈上空间释放后引用类型的值类型对象还是存在只不过其值为空……(那么该引用类型所持有的值对象不是一样在堆上了吗)可能面试官就是
2020-06-29 12:38:00
288
原创 C#实现对象的深拷贝与浅拷贝(正确打开方式)
首先吐槽一下部分CSDNer,不要照抄,要有自己的思想,网上传的C#四种实现深拷贝的方法都属于比较偏的方法了,然而C#有内置的实现深拷贝和浅拷贝的方法,大家何必另辟蹊径,还全部都不加思索的就复制粘贴……1.实现默认的拷贝构造函数(复制构造函数)这一部分请看官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/how-to-write-a-copy-constructor
2020-06-28 17:59:00
2063
1
原创 记录3-C++拷贝构造函数的意义
拷贝构造函数的目的就是完成对一个对象的拷贝,一般在一下三种场景下会调用该对象的拷贝构造函数:1.函数返回类型是类的对象时2.函数的参数是类的对象,调用该函数时会调用该类的拷贝构造函数3.使用一个对象去初始化类的另一个对象时 F a = new F(1,2); F b = a; / F b(a) 注意必须要在类的初始化中使用,不是类的赋值拷贝构造函数的关键意义在与可以实现深拷贝,即实现申请新的内存空间并复制其值。默认拷贝构造函数实现的是浅拷贝,即完成对象的一一辅助但该对象还是指向堆中同一个对象
2020-06-28 17:25:18
1929
原创 记录2-C++将析构函数定义为虚函数的意义
虚函数是实现多态的基础,我们可以使用基类指针指向派生类对象,如果没有将基类定义为虚函数,则在释放该对象时,仅仅会调用基类的析构函数,而不会调用派生类的析构函数,导致析构不完全而产生内存泄漏。将基类析构函数定义为虚函数,并在派生类中重写了该析构函数,当我们使用基类指针指向派生类对象,释放该内存时,则会先调用派生类析构函数,再调用基类的析构函数,从而完成对该对象内存的完全释放。...
2020-06-28 16:51:04
224
原创 记录1-C++虚函数的实现原理
虚函数是实现多态的基础,在定义基类虚函数时,会为该基类分配一个虚函数表,虚函数表记录了虚函数的地址。子类继承基类时,如果重写了虚函数,则会覆盖这个地址,形成新的虚函数表,否则就继承基类的虚函数地址。当实例化子类对象时,虚函数指针则指向该对象的虚函数表中该虚函数的地址,并执行相应的方法。...
2020-06-28 16:44:01
146
1
原创 机器学习算法小节
一、机器学习的分类传统的机器学习分类可以分为监督式学习、非监督式学习两大类,目前已经扩充并包括强化学习等。二、监督式学习:回归 分类 两大类1.线性回归:线性回归是最简单的回归模型,其损失函数为平方代价函数,且为一个典型的凹函数,可以通过梯度下降收敛到最低点。对于多元问题,原理是一致的;对于高次问题可以通过提前处理特征值来完成。2.分类问题:二分类问题的关键在于我们希望特征输入后输出值为0-1之间的值,因而我们可以采用一些激活函数来完成对输入的处理,最简单的一个就是sigmod函数,该函
2020-06-04 18:01:45
245
原创 Unity机器学习——让小球控制速度并自动追踪目标
一、环境配置如下:1.TensorFlow 2.0.12.CUDA v10.03.cuDNN v7.6.54.ML-Agent 0.15.0二、实现步骤1.链接ML-Agents库 通过修改项目Package中的manifest文件,新增增加库名称和对应的库地址"com.unity.ml-agents": "file:*这里填库地址*/com.unity.ml-agents"2.实现场景,基础的小球、平板和目标3.实现小球的RollAgent脚本(1)引入命名空间,M
2020-05-18 15:52:26
950
原创 Unity制作RPG游戏——按键功能的分类与实现
这一部分跟大家分享一个游戏开发中一个必须明白的问题,那就是怎么设计按键,有哪几种按键,怎么实现?一、按键的种类简单来说,一般有三类,press signal :键位输入等,按下时获取并更新输入 once trigger signal:跳跃、(非蓄力)攻击等,当玩家按下按钮时,只执行一次便结束 double trigger signal:连击打combo,按键较少需要区分按下一次和短...
2020-05-04 14:52:39
2307
原创 Unity制作RPG游戏——相机的设计与实现
本文将详细介绍Player的相机设计,不适用任何插件,如何制作类似RPG游戏的相机。首先,设置正确的Hierarchy层级关系:将camPos的position和euler传递给Main Camera即可其次,设计思路:视野左右旋转调节Player的rotate,上下旋转调节cameraController这样设计的好处是符合我们实际的操作习惯,例如玩家要向前移动,默认是希望向前...
2020-05-04 11:04:25
741
原创 Unity制作RPG游戏——碰撞检测
这一节主要介绍相机控制,怎么去实现一个类似剑灵RPG的freemode相机,通过鼠标移动来调节视野范围并给予相机一定的可视范围,最终会实现LockOn效果,类似流星群侠传中的锁定敌人的相机。...
2020-05-04 09:36:40
993
原创 Unity制作RPG游戏——补充
为了让动画更加可控,这里补充介绍一个小技巧:在从Input中获得用户输入并转化为椭圆映射坐标系下的速度向量(Dvec)和大小(Dmag)后,应当给定一个变量叫planarV作为平面上的移动速度:同时给出lockplanar变量,当且仅当lockplanar为true时才会更新planarV,这样做的好处是给程序带来很多可控性,例如角色跳下悬崖后就不应该再继续获取速度变化了,但是跳出的时候需...
2020-05-03 22:01:59
323
原创 Unity制作RPG游戏——Animator Controller常见问题2
上一篇文章主要介绍了Animator中的一些常见问题,这里将会更深入的去完善它,主要涉及一下几个方面的问题。1.如何解决Trigger累积问题(unity动画控制器臭名昭著的bug)2.如何在进入动画时触发相应的方法3.如何获取根据动画获取某些变量值4.如何设置多个动画层级,并实现层级之前的流畅切换5.什么是Avator,如何针对不同的动画设计不同的Avator6.如何脚本...
2020-05-03 21:36:42
663
原创 Unity制作RPG游戏——Animator Controller常见问题1
上一篇文章主要讲述了实现3D游戏物体的PC端输入,其中关键就是做好平滑和椭圆映射。这篇文章主要介绍如何结合上一节的输入做好人物的动画控制器(Animator)诚然,unity动画控制器中有许多坑,包括骨骼错位、trigger累积等,后面会介绍一些解决方案。一、动画的获取动画获取一般从免费的mixiamo网址上获取,下载的时候注意选择FBX for unity,科学上网下载更快。二、...
2020-05-01 18:40:09
1631
原创 算法解析之滑动窗口——解决子数组、子串问题
滑动窗口本质上是一种非常好理解的算法,用一道例题来展示:如何在一个字符串中找到包含另一个字符串的最短子字符串?这个题目看着有点绕,是leetcode一道Hard题。下面来写一下滑动窗口框架:public string MinWindow(string s,string t) { Dictionary<char, int> ne...
2020-04-29 15:18:14
479
原创 bresenham算法模拟游戏中的追踪路线
游戏AI中我们的怪物需要追击我们的玩家,那么怎么样的追击方法更好呢?对于一般的3D游戏,基本都是动态改变start到target的朝向,然后对转向做一些平滑的插值或者调整,最后再对这个朝向施加相应的速度来实现追击,实现这个过程需要一定的计算量。但是对于2D游戏,尤其是砖块地板的2D游戏,每一个人物角色只能在地砖的中心移动而不能移动到边界线等位置,这样对于如何实现追击就有一定的要求——如何让...
2020-04-28 11:06:12
479
原创 Unity制作RPG游戏——按键输入与处理
对于一个RPG游戏,一个无法逃避的问题就是怎样获取输入并相应转化为适当的角色行为,我们都知道通过Input方法获取按键输入信息,并且可以通过rigidbody给角色速度,但是我们需要对按键的数据平滑,同时需要根据按键改变角色的方向等,只有这样才可以让我们的角色看起来更加灵活。下面部分我将介绍这个过程。一、获取按键输入先设计按键,在Inspector留下字段方便更改tip1:获取输入...
2020-04-24 10:32:13
1703
原创 广度优先搜索算法框架(Breadth-First-Search)
一、算法框架int BFS(Node start, Node target){ Queue<Node> q = new Queue<Node>(); HashSet<Node> visited = new HashSet<Node>(); q.Enqueue(start); visited.Add(start)...
2020-04-23 12:18:28
436
原创 IP地址分类总结1
IP地址的组成:由四部分组成,每一个部分是一个字节,最大为255IP地址的含义:IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。包括主机地址和网络地址两部分。IP地址由主机地址和网络地址两部分组成。A类适用的类型为大型网络,A类网络地址数量较少,有12...
2020-04-09 17:14:08
623
转载 狗屁不通文章生成器(可用于UI文本测试)
https://suulnnka.github.io/BullshitGenerator/index.html?转自:https://github.com/menzi11/BullshitGenerator
2020-04-06 15:21:21
16204
原创 对Unity中AssetBundle的理解
1.什么是AssetBundle?谈谈你对AssetBundlen内存分配情况的理解(1)AssetBundle是一个压缩包,其中包含模型,贴图,预制体,声音甚至整个场景,可以在游戏运行时被加载AssetBundle自身保存着互相的依赖关系,也就是说不同的包之间可以相互联系压缩包可以使用LZMA和LZ4压缩算法,减少包的大小,更快的进行网络传输可以把一些下载内容放在AssetBun...
2020-04-03 15:51:43
986
原创 对unity中DrawCall的理解
1.什么是DrawCall,有什么方法可以减少DrawCall?DrawCall的理解:DrawCall就是CPU对图形回执接口的调用,CPU通过调用图形库(Directx/OpenGL)接口,命令GPU进行渲染操作DrawCall过多会导致性能降低,但是其中的关键在与CPU,每一次回执CPU都要调用DrawCall,而在调用DrawCall之前,CPU还要做很多准备工作:检测渲染状态...
2020-04-03 15:51:31
725
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人