自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GAMES202 作业1

下面是两种随机采样方式的对比这样乍得一看,两种随机采样方式得到的结果似乎差别并不明显,但其实不然。可以看到,uniform的模式下,阴影的过渡部分有明显的层级,而泊松则平滑许多...

2021-11-06 15:15:17 755 1

翻译 GAS 预测 PredictionKey 翻译

Ability Activation激活技能是最主要的预测行为,当Client预测性的激活一个技能时,该Clinet会显式地询问Server并且该Server会显式地回应,一旦该技能被Client预测性的激活了,进行预测的Client便拥有一个合法的“prediction window”,在该窗口内,允许没有主动请求过(因为请求自动发生在激活过程中)的预测产生的副作用发生。ASC提供一系列供Client和Server间通知技能激活的函数:TryActivateAbility -> ServerT

2021-08-25 15:34:17 376

原创 8.19 GAS的网络侧功能

预测客户端无需等待服务端的许可便可以释放GA和GE指client“预测”server允许其释放GA并预测GE将要施加到的目标,server将在之后释放技能并通知client其预测是否准确,如果client错误,其将会回滚之前做出的改变以与server同步。GAS的预测思路是:只预测你能躲开的事(predict the minimum amount of stuff you can get away with)可被预测的GA的释放触发Event应用GE:Modify Attribute,Mod

2021-08-20 11:25:30 323

原创 8.10学习记录,UE4官方GASdemo,ARPG

Debug正常了ARPGCharaterBase:启动编辑器前会先构造蓝图中实现的类,从basecharaterBP到playcontrolleerBP,goblin,spider等等,中间会有重复初始化的情况,后面 仔细看一下。ARPGCharaterBase:点击启动后,在播放过场动画的过程中会再次调用该函数,PlayerCharater_C_0PossessedBy:这是重载自ACharater的函数,这里会尝试设定初始的InventorySource背包来源,并初始化句柄(

2021-08-18 20:43:12 557

原创 8.9学习记录

问问题记录:打断点走一下流程看看各个事件是怎么发生的,一些细节的具体实现没必要看UE4 反射反射:运行时自检、蓝图和代码的同步,GC都依赖于反射UBT:UnrealBuildTool C#类型,编译由其处理,Target,Build是为其服务的。扫描头文件,记录每一个包含UCLASS,USTRUCT等等具有反射功能的模块,若上面的带有反射的头文件发生了变化则调用UHT。UHT:UnrealHeaderTool C++,代码解析生成工具,宏和include,generated.h信息都辅助其生

2021-08-09 20:50:58 88

原创 GAMES101-作业5

Render部分,这里的公式其实是经历了三次变换:光栅化空间,正交空间,屏幕空间,具体原理参照这篇博客的翻译,讲的很清楚 for (int j = 0; j < scene.height; ++j) { for (int i = 0; i < scene.width; ++i) { // generate primary ray directionS float x=(2*(float(i)+0.5)

2021-05-28 18:18:44 2299 2

原创 GAMES101-作业3

实验三难度骤升啊。先把投影矩阵复制过来,顺表修正了显示图像是颠倒的错误。Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar){ Eigen::Matrix4f projection = Eigen::Matrix4f::Identity(); // orthographic,正交投影 float t=-tan(eye_fov/2/180*

2021-05-12 20:16:49 1739 3

原创 GAMES101-作业2

作业链接放前面光栅化三角形void rst::rasterizer::rasterize_triangle(const Triangle& t) { auto v = t.toVector4(); std::vector<float> bb(4,INT_MAX); bb[0]=bb[1]=INT_MIN; for(int i=0;i<3;i++){ bb[0]=std::max(float(v[i][0]),float(bb[0]

2021-04-28 20:47:32 544

原创 C++ Primer P0~P72 字面值常量、引用指针和const、constexpr、decltype

看第一的章还觉得轻松,结果第二章开始就多了很多没学过的新内容,还是得做笔记。字面值常量形如42、‘h’、“str” 这类以字面形式存在,在编译时就能确定类型的值被称为字面值常量。通常对于十进制的整数字面值,其类型为int、long、longlong中由左至右能容纳其数值的第一个类型。对于浮点型字面值,默认类型为double。字符串的字面值要比其内容多一位空白符。可以通过前缀或后缀指定字面值的类型。初始化和赋值的区别: 初始化是在创建变量时赋予其一个初始值,赋值的含义是把对象当前的值擦除,然后赋

2020-10-10 15:51:39 256

原创 C++ Primer Plus P795~P结束 一些C++11的新功能

统一的初始化: 统一支持初始化列表语法,可以防止将数值赋给无法储存它的数值变量,即防止缩窄。返回类型后置: 在函数的参数列表后用指针指出返回类型,可以使用decltype语法模板别名:using= 可以替代typedef创建别名,也可用于模板部分具体化。nullptr: 防止空指针与0混淆。异常规范: 摒弃异常规范,但保留声明函数不会出现异常的noexcept作用域内枚举: 在同一个作用域内的不同枚举内的枚举成员不能同名,使用class或struct定义可以使其名称可以重复,因为其属于其本身的作用

2020-10-07 15:01:17 79

原创 C++ Primer Plus P731~P794 输入、输出、I/O

C++把输入和输出看成字节流,输入或输出时,先将内容读取到缓冲区中,到缓冲区填满或是输入或输出结束时,将缓冲区中的内容发送到硬盘或是屏幕。coutcout对所有基本类型进行了重载,使之能够输出基本类型。对于字符串的指针,使用cout将显示字符串,对于其他类型的指针,使用cout将显示地址的数值表示put(): 显示字符,若输入的是数字,则输出其作为ascii码对应的字符write(): 显示字符串,接受两个参数,参数一为字符串,另一个为输出长度,若长度超过字符纯成都,则会显示接下来的地址内的字符。

2020-10-02 17:00:07 143

原创 C++ Primer Plus P655~P730 String、智能指针、STL容器、迭代器、算法、函数对象

string类构造函数:string(const char * s):初始化为sstring(size_type n,char c):长度为n,将所有元素初始化为c。string(const string & str):初始化为sstring():默认string,长度为0string(const char * s,size_type n):初始化为s的前n个字符。template< class iter>string(iter begin,iter end)初始化为区间

2020-09-27 16:24:56 186

原创 C++ Primer Plus P602~P654 友元和类、异常、RTTI

友元友元类友元类的所有方法都可以访问原始类的私有成员和保护成员。但在实际情况中,并不是友元类中的每个方法都需要访问原始类中的成员,因此可以定义友元成员函数,在实际使用中,应先声明原始类名,再声明友元类以及成员函数,再声明原始类的成员函数,最后声明友元类的函数定义。可以将一个函数声明为多个类的友元,达到协同的作用。嵌套类将类声明放在另一个函数中,称为嵌套类。它遵循以下规则:包含类的成员函数可以创建和使用被嵌套类的对象仅当声明为公有时,才可以在类外用作用域解析运算符使用嵌套类。结构是一种其

2020-09-20 19:23:50 205

原创 C++ Primer Plus P535~P601 私有继承、多重继承MI、类模板

valarray: 定义类似vector,提供处理数值的基本操作,如取得最大最小值,所有元素的和等操作。在类中使用private的typedefine可以保证定义不会在类外被使用。使用一个参数的构造函数会被用作从参数类型到类类型的隐式转换函数,但这有可能在某些特殊情况导致错误,因此应使用explicit关闭隐式转换。当初始化列表中含有多个项目时,程序会按照参数列表的顺序初始化,而不是初始化列表的顺序。私有继承公有继承,基类的公有方法将成为派生类的公有方法(继承接口)私有继承,基类的公有方法将成为

2020-09-18 16:29:25 121

原创 C++ Primer Plus P480~P533 公有派生、联编、虚函数、抽象基类、继承和动态内存分配

类继承公有派生派生类对象包含基类对象,基类的公有成员将成为派生类的公有成员,私有成员也会成为派生类的一部分,但不能直接访问,需要通过公有方法或保护方法间接地访问。派生类的构造函数:派生类中,构造函数是必须的。由于不能够直接访问基类的私有成员,派生类的构造函数必须调用基类构造函数完成初始化。创建派生类对象时,程序首先创建基类对象,C++中使用成员初始化列表语法完成这种工作。形如Apple::Apple(int a,float b):Fruit(a),这代表将参数中的a作为实参传递给基类构造函数,若

2020-09-16 19:58:08 147

原创 C++ Primer Plus P425~P479 类的动态内存分配

类和动态内存分配类的所有对象共享同一个静态类成员,因此可以利用这个特性进行对象的计数等操作。不能在类声明中初始化静态成员 ,可以初始化枚举变量或const类型的常量。C++在没有定义时提供的成员函数:构造函数,析构函数复制构造函数当使用一个对象来初始化另一个对象,或在函数中返回临时对象,或生成临时对象作为参数时,都将调用复制构造函数。对于使用指针作为成员的对象,应该在复制构造函数中使用深度复制(deep copy) ,复制指针对应的地址中存放的内容,而不是仅复制指针。赋值运算符默认的赋值

2020-09-13 18:29:03 80

原创 C++Primer Plus P340~P424 对象、类、运算符重载、友元、类型转换

对象和类**接口:**接口是一个共享框架,公两个系统之间交互信息。类对象作为交互系统,接口由编写类的人提供的方法组成。构造函数当且仅当程序没有提供构造函数时,编译器才默认创建一个没有参数的构造函数,若定义了构造函数,就必须要为其加上默认值或再写一个无参的默认构造函数。析构函数程序提供默认析构函数,在类成员中有new分配的动态存储空间时,析构函数将使用delete来释放内存,如果类中只有自动变量,那么析构函数将什么都不用做。声明的对象将在其作用域结束后自动调用析构函数,若是用new分配的动态存储空

2020-09-12 19:13:49 95

原创 C++ Primer Plus P300~P339 编译,四种存储持续性,名称空间

内存模型和名称空间C++的编译C++鼓励将组件函数放在独立的文件中,可以单独编译这些文件。文件的三部分头文件:包含结构声明和使用这些结构的函数的原型源代码文件:包含与结构有关的源代码源代码文件:包含调用与结构相关的函数的代码不要将函数定义或变量声明放在头文件中头文件中一般包含的内容:函数原型使用**#define或const**定义的符号常量结构声明和类声明模板声明 因为模板声明是不会被编译的代码内联函数在 #include 头文件时,如果使用 ,编译器将在储存标准头文件

2020-09-11 21:34:29 103

原创 C++ Primer Plus P253~P299 函数探幽:内联,引用,重载,模板,decltype

内联函数inline在C++中,编译后的代码每一部分函数都有单独的代码块,在遇到执行其他函数的命令时,需要跳转到相应函数的位置执行代码,这样会在跳转时消耗一定时间,若将函数声明为内联函数,编译时会将函数的代码嵌入到函数被调用的位置,这样在使用时,就可以免掉跳转所花费的时间,对于大型程序中经常被调用的小型函数,声明为内联函数将节省一定的时间。引用变量在C++中,& 有声明引用的含义int & rush=rua; 将rua作为rush的别名,对rush和rua进行任何操作都是相同的。在

2020-09-10 21:10:51 176

原创 C++ PrimerPlus P201~P252 函数与指针,数组,指针数组

库函数是已经定义和编译好的函数。函数的返回值通常,函数会将返回值复制到指定的存储单元或寄存器中。随后,调用程序会查看该内存单元。函数原型指出函数的参数类型,需在被调用之前声明,或在被调用前定义完整函数。函数的参数用于接收传递值的参数称为形参,传递给函数的值为实参。c++使用参数表示实参,参量保存形参。在函数中声明的变量是私有的局部变量,在函数结束时,占有的内存将被释放函数参数中的数组在将数组作为参数时,函数实际传递的是数组的首地址以及长度,这意味着函数将能直接访问原数组而非复制的数组,当

2020-09-09 20:16:01 108

原创 C++ Primer Plus P125~P200

自加自减对于用户自定义的类型,++i比i++的效率高,因为一般的用户定义中,i++是先复制一个副本,副本+1,再返回值,++i则没有复制的过程,但对于内置版本,两者没有差别。基于范围的for对于数组或容器类,可以使用for(auto a:vector)如果需要进行修改,则需要使用&:for(auto& a:vector),使x成为引用变量。cin.get()**cin.get(char)**表示获取一个字符**cin.get(*char,size)**表示获取一段长度为size

2020-09-05 19:37:50 97

原创 C++ Primer Plus P55~P124处理数据&复合类型

浮点数float:至少32位double:至少48位,且不少于floatlong double:不少于doublefloat只能保存6位或7位有效数字,会丢失精度。算数运算符%为求余/求模,当其中一个为负数时,其结果满足**(a/b)b+a%b=a*...

2020-09-05 14:47:42 139

原创 重返C++ primer plus P0~P54

数字逻辑补考过后便恢复刷每日一题了,顺便还补上了前几天落下的题。现在题做的已经比之前熟练一些,但低级错误还是不停的在犯,是时候重新啃一遍c++ primer plus 了,计划25天内读完,因为之前大一暑假的时候粗读过大约一半,应该不会太吃力。开始吧。头文件带有.h的头文件为老的C语言头文件using命名空间在使用不带.h的头文件时,c++的标准组件都放在名称空间std下,因此需要用名称空间std以省略每次使用c++库中的内容都要std::的麻烦赋值语句从右到左执行类简介类是用户定义的一种数

2020-09-03 20:21:25 72

原创 LeetCode 109 每日一题 Day32.

今天的结果非常amazing这个月的主题是二叉树,这道题是平衡二叉树和搜索二叉树的结合,没记错的话应该叫AVL平衡二叉树用二分法的思想,将整棵树分为“根”,"左子树”,"右子树"三个部分,将中间的节点作为根,左右子树有分别取出中间的作为根,进行递归,比较简单。题目中给出的有序表是自己实现的有序表,为了方便我将其转化成了vector存储。再多的也没什么了,去看看和官方题解还有什么方法class Solution {public: vector<int> list; T

2020-08-18 17:12:13 150

原创 LeetCode 20 每日一题 Day31.

今天是easy的一天,有了surface,双设备的感觉真是好丝滑,等等攒一波钱换个lg屏,咱就是生产力完全体了不说了,讲下题,这个是真的蛮简单的,评论里有说这是昨天晚上bilibili笔试的原题,希望到时候也都是easy哈哈这题使用了栈,从左至右读取,左括号入栈,遇到右括号就pop出栈顶元素,看是否匹配,不匹配false,匹配继续,就是这样。若全部元素读取完了,则应该检查栈中是否有剩余元素。没有才true。并应当应对在栈空时直接输入右括号的情况。就是这样,明天hard见class Solution

2020-08-14 22:17:18 118

原创 LeetCode 43 每日一题 Day30.

第三十篇笔记!这题还是蛮复杂的,最初想做大整数惩罚,结果发现这题根本不是这个意思,要自己实现字符串相乘,先要实现字符串相加,相加的是前几天的题,我刚好手撸了一遍,大体思路是对的,细节上还是有点偏差。说复杂,其实也不复杂,就是手动实现一个竖式乘法,将num2的每一位单独取出来和num1整体相乘,结果累加,值得注意的是要在后面加上相应个数的0。最令人烦躁的还是要属字符ascii码转换的部分,疏忽了好几个地方,排除一个bug,结果还是不对,最后发现错误都是出在ascii码上了。大体思路就这些了,上代码吧

2020-08-13 22:38:53 118

原创 LeetCode 133 每日一题 Day29.

DeepCopy第一次见到,想了想就又自制哈希表了,但也顺便看了看map和hashmap的操作,大概了解了一点,例如find()在没搜索到对应元素时返回的是容器中最末尾的object.end()。下次有机会试用一下。DeepCopy就是深度复制,不是简单的将新的指针指向原来的地址,而是真正的创建新的内存,将一模一样的内容存到新的位置上。这里我选择的是广度优先搜索,visit作为hash数组记录该元素是否被访问过。没啥好讲的这个class Solution {public: Node* cl

2020-08-13 22:28:06 95

原创 LeetCode 130 每日一题 Day28.

比较简单的dfs,思路已经在题目里讲的差不多了:遍历矩阵四周的节点,每找到一个O,以其为起点开始dfs,将途中每一个可到达的点做标记。在全部搜索完成后,将所有做过标记的节点变回O,将所有仍为O的节点变成X这里记录一下今天的发现,if中的或||是按顺序执行的,若中间有一个结果是false则不会继续向下执行,如if(x>=m||x<0||y>=n||y<0||board[x][y]!=‘O’)在这段语句中,若执行到x<0时,返回结果为false,则不会执行board[x][

2020-08-11 21:32:49 84

原创 Leetcode 696 每日一题 Day27.

这道题我一看到就想要用dp做,但没思路,看了题解才发现这么简单。因为要找出的是0和1数量相同的子串,可以发现,相邻的0和1串能构成min(count0,count1)个符合要求的子串。比如00011,就能构成min(3,2)=2个符合要求的子串“0011”和“01”。遍历整个串,记录每一段0和1的数量,如“000110100111”的计数就是[3,2,1,1,2,3],然后将该数组中每一对相邻的数去最小值累加到结果中。class Solution {public: int countBina

2020-08-11 20:54:41 79

原创 LeetCode 93 每日一题 Day26.

前天科一过了,这几天把落下的题都补上。这道题说难倒不难,就是硬解法逻辑有点复杂。用dfs深度搜索,判断每一段是否可以符合0<=x<=255的条件,递归求解。其中值得注意的是:前缀数字不能为0,也就是不能有255.01.1.1这种情况,所以如果首个数字是0,下一段就只有一种分法。总是有这种状态,不知道怎样的解法是更好的,不参照题解,我反而不敢这么做,总觉得这样比较笨,还是该多练啊class Solution {public: string str; vector<

2020-08-09 19:50:58 146

原创 LeetCode 415 每日一题 Day25.

做了今天的题越发觉得我基础差了首先完全不知道string可以向数组一样访问元素然后对于ascii码的处理也是云里雾里,基础得赶紧补了啊。去图书馆就没法用电脑,所以说我想买一个surface带去用。看primer肯定得做笔记,很烦,另外开不开学都是另说,真的头疼,在家太难学了,再荒废半年,补就来不及了。写一下思路吧,全程使用int类型记录ascii码,这样长度不管如何都是够的。用两个index分别指向两个字符串的末尾,循环对每一位进行相加,用一个add保存进位,将所有结果从后到前依次存进string,在

2020-08-03 11:55:38 79

原创 LeetCode 114 每日一题 Day23.

我居然做一道前序遍历二叉树的题做了两个小时,越发觉得自己基础差了,下学期要重新啃一遍primer plus,然后去啃primer。指针相关的使用错的一塌糊涂,并且这次又忘记了特殊情况的处理。因为觉得递归的比较简单,所以决定用用迭代的方法去实现,结果很糟糕,现在我开始怀疑我是否能流畅的写出来递归解法了。迭代:class Solution {public: void flatten(TreeNode* root) { if(root!=nullptr) {sta

2020-08-02 15:01:50 68

原创 LeetCode 面试题08.03 每日一题 Day22.

easy,不过做起来没那么easy一开始的分析没有涵盖到全部种类,只是单纯的把左右丢进递归,返回较小的值,但这样显然是不对的,因为当没有搜到的时候应该返回-1,-1永远是比较小的。另外一个犯得错误是丢进递归时没有缩减搜索域,导致无线地柜,堆栈溢出,自己还傻傻的找数组的问题。整体思路:二分查找基本思想若nums[mid]==mid,此时只需要搜索左侧是否有魔术索引,若不存在,则当前索引就是结果否侧,先搜索左侧,若左侧存在结果,返回左侧结果,若左侧不存在结果,则转向右侧搜索class Solut

2020-07-31 12:10:51 101

原创 LeetCode 343 每日一题 Day21.

昨天的题是我做这半个多月以来最复杂的一道。摸了,今天这个midium还是凭借自己的实力摸索出来了!我真行!这个题还是照例dpdp[i][j]代表第前i个数分成j块的最大值,。得出状态转换方程:dp[i][j] = max(dp[i][j], dp[k][n] * (i - k))其中dp[k][n]代表前k个数分割可乘出的最大值现在结果是不是已经看似正确了,但并不是。题目中给了一个限制:将其拆分为至少两个正整数的和,因此,对于>3的数字,其最大乘积往往大于它本身。但对于2和3,其最大乘积并

2020-07-30 19:11:26 93

原创 摸鱼Day1. 实现毕导男厕尴尬定理算法

今天的hard题太难了呜呜呜,摸了,整好看了毕导的视频,笑的不能自已,整好这个算法简单,就小小的实现了一下#include <iostream>#include <list>#include <stack>#include <string>#include <vector>using namespace std;long Solve(long l, long r){ long mid = l + (r - l) / 2;

2020-07-29 23:15:46 603

原创 LeetCode 104 每日一题 Day20.

easy中的easy,没啥说的无脑把两个孩子丢进递归,加个对空值的处理,返回当前节点下最多的层数class Solution {public: int maxDepth(TreeNode* root) { if(root==nullptr) return 0; int res=1,l=0,r=0; if(root->left!=NULL) l=maxDepth(root->left); if(root->righ

2020-07-28 21:21:11 83

原创 LeetCode 410 每日一题 Day17.补档

补档补档,当天做的时候是大概看懂了思路的,但是实现还是出了点问题,今天又自己重新写了一下,补上。这道题的整体思路还是动态规划建立一个n+1*m+1的数组dp,dp[i][j]代表将前i个数分割成j个数组能得到的最小大值。循环对0~n每一个数的所有分割数量执行以下步骤:设置一个k,取值为0~i-1比较dp[k][j-1]和k+1~i的和,取较大的作为当前分割法中最大值比较上一步的取值和当前dp[i][j]的大小,取较小的一个最后的dp[n][m]就是结果了。写的太乱了,不知道写这个的意义是

2020-07-28 21:18:16 83

原创 LeetCode 329 每日一题 Day18.补档

hard题果然是hard题,昨天直接交的题解,今天自己写了一遍,还是犯了很多导致溢出的错误,不过也算理解了吧。用dfs的搜索方法,同时使用记忆化,避免走重复的路,节约时间。一般来说,dfs也好bfs也好,我都喜欢用stack和queue循环控制来实现,递归总是让我感觉不可控制,于是这道题我也自然而然地用stack来实现,结果很惨烈,想在循环中对每一个走过的节点进行计数太难了,只能牺牲空间,并且实现非常繁琐,以后还是尽量用递归吧。再回顾一下思路:建立一个二维数组,存储以对应位置为起点可以走出的最长路

2020-07-27 22:39:05 246

原创 LeetCode 392 每日一题 Day19.

简单题,但思路又错了,好难简单看了下题,字符串匹配,双指针好做,争取用动态规划做出来,但想了半天没思路,决定先用双指针做出来。但思路完全是错的,我还是按着普通的字符串匹配的想法做,但这道题并不强调顺序。按照贪心策略,先匹配到的永远是最好的选择,不需要所谓的回溯,kmp,而我像一个弱智一样在那记录第一次匹配到的位置。前天的代码看懂了,但昨天的还是没懂,今天一定补上class Solution {public: bool isSubsequence(string s, string t) {

2020-07-27 10:45:02 76

原创 LeetCode 1025 每日一题 Day16.

今天把简单题想的题太复杂了知道是动态规划,也想到了检查后面的数中是否有dp[i]=0且可到达的。class Solution {public: bool divisorGame(int N) { if(N==1)return false; if(N==2)return true; vector<int> dp(N+1,0); dp[1]=0;dp[2]=1; for(int i=3;i<N+1;i

2020-07-24 13:39:24 83

空空如也

空空如也

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

TA关注的人

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