自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 好书-阅读

《软件设计的哲学》https://cactus-proj.github.io/A-Philosophy-of-Software-Design-zh/ch01.html

2024-03-01 11:09:34 333

原创 gtest学习

一般EXPECT是首选,因为它允许报告多个失败(比如在循环体中使用),但是如果断言失败后继续执行没有意义,则应该使用ASSERT。

2023-10-10 15:02:38 184

原创 C++学习6

joinable()函数用于判断线程是否可执行,如果线程已经被join()或detach(),则返回false。其中,func是线程要执行的函数,args是传递给函数的参数。detach()函数会将t线程与当前线程分离,使得t线程在后台继续执行,当前线程不再等待t线程执行完毕。std::thread是C++11标准库中的一个类,用于创建并发执行的线程。sleep_for()函数用于让当前线程休眠一段时间,ms是休眠的毫秒数。join()函数会阻塞当前线程,直到t线程执行完毕。

2023-09-01 11:02:38 725

原创 Linux基础学习2

需要注意的是,如果命令执行过程中没有输出,fgets函数不会读取到EOF,而是会一直阻塞等待输入。因此,在使用popen函数时,需要注意处理fgets函数读取到EOF的情况,以避免程序出现异常。注意上面的while (fgets)循环,相当于同步等待popen的子进程命令执行完毕,读到EOF或者命令执行出错。发生了错误,例如子进程意外终止或者popen函数调用失败,此时fgets函数会读取到EOF。子进程执行完毕,关闭了标准输出流,此时fgets函数会读取到EOF。

2023-08-31 13:05:41 241

原创 python学习2

使用。

2023-07-03 16:32:40 218

原创 C++ 学习5

总结:std::variant代表了类型安全的union类型,与union类似,std::variant的一个实例要么存储了可选类型中的一个值,要么没有存储。但与union比,其优势是可以判断当前真实的存储类型并且可以存储结构体这种复杂的数据结构。

2023-05-20 11:30:25 537

原创 kafka学习

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展能力……

2023-05-04 14:45:12 505

原创 yum、yumdownloader学习

ysd和yumdownloader都是用于下载软件包及其依赖的软件包的命令行工具。它们的区别在于,ysd支持从多个源下载软件包,而yumdownloader只能从一个源下载软件包。此外,ysd还支持下载指定架构的软件包,而yumdownloader不支持。使用该命令,Linux系统管理员只需要告知其要下载的软件包名称,该命令便会自动分析出所对应的依赖关系,并将全部的软件包都下载到本地。]:0}: 指定要下载的软件包及其依赖关系,0表示函数的第一个入参,arr[指定下载目录(若不指定则下载到当前目录);

2023-04-27 17:01:53 780

原创 python学习

在Python脚本中,if name == 'main’的含义是:当Python文件被直接运行时,if name == 'main’之后的代码块将被运行;当Python文件作为模块被导入时,if name == 'main’之后的代码块不会被运行。sys.exit()是Python内置的函数,用于退出程序。当程序执行到sys.exit()时,程序将会立即退出,并返回一个指定的退出状态码。通常情况下,我们可以在if name == 'main’之后的代码块中使用sys.exit()来退出程序。

2023-04-24 15:35:28 134

原创 Linux基础知识、设置进程自启动、进程间通信

虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合一个或多个计算机配置环境,并重新分割、重新组合,以达到最大化合理利用物理资源的目的。该命令其实就是为一个其它目录下的xxx.service文件,创建一个指向/etc/systemd/system/xxx.service下的软链接。

2023-04-24 15:32:25 452

原创 Bash Shell学习

这句话得到shell脚本文件所在完整路径(绝对路径)并把结果赋值给DIR,并得到文件名(无论source, sh, . 三种调用方式),且不改变shell的当前目录。与上面的类似,获取shell脚本所在目录的绝对路径。不能直接用pwd,因为如果在脚本目录之外调用该脚本,返回的是调用命令所在的目录而不是脚本所在目录。

2023-04-20 10:11:25 209

原创 cmake和cmake install学习

cmake - DCMAKE_INSTALL_PREFIX = < 你要的安装路径 >或者在cmake中SET(CMAKE_INSTALL_PREFIX < 你要安装的路径 >)

2023-04-18 19:25:22 548

原创 C++ 学习4

(2) 如果是右值引用,由于被引用的对象是右值,它一般都是"临时对象",更不能长期保存。(1) 如果是左值引用可以视具体情况而定,左值引用。一般不行,除非能确定被引用的对象是长期存在的。

2023-04-13 15:08:56 551

原创 C++学习3

右值:不能够取地址、没有名字的值就是右值。右值不能用&获取内存地址,而且生命周期短(只在定义的这一行语句内有效),在构造、使用后立刻就释放了。左值:可以取地址的、有名字的值就是左值,左值可以放到赋值语句的左边(没有被const限定的情况下)。左值引用:左值引用能绑定左值,但不能直接绑定右值,只有const的左值引用才可以绑定右值,不能修改。右值引用:右值引用的定义方式为type&& r。右值引用可以直接绑定右值,但不能绑定左值。

2023-04-06 10:26:12 232

原创 Plantuml使用

参考:

2023-03-28 14:32:31 37

原创 SSAA、MSAA和FXAA区别

都以4x为例,简单地说:SSAA中每个像素点有4个子采样点,每个三角形对每个像素点的4个子采样点各着色1次(共4次),再把计算结果根据深度和覆盖信息保存到对应的子采样点,最后对4个采样点取均值作为最终的像素颜色;MSAA中每个像素点有4个子采样点,每个三角形对每个像素点只在中心点着色1次,再把计算结果根据深度和覆盖信息保存到对应的子采样点,最后对4个采样点取均值作为最终的像素颜色;FXAA只是一个后处理技术,对原图绘制完成后,通过算法识别边缘,然后以像素级别进行混合;SSAA的抗锯齿效果最好因为

2021-12-12 14:00:41 9418

原创 TBR架构的一些理解

现在移动侧的GPU渲染架构(Bifrost、valhall)是按照job的方式来进行的,共有3类job:vs-job、tile-job、fs-job;它们都是在shader core中执行的;tile-job主要负责把图元加到Tile-list中(由于三角形众多,所以这也是个大规模并行任务);G77采用的是valhall架构:a. 一个shader-core可以执行1024个threads (注:thread可以理解为streaming processor(sp): 最基本的处理单元),但它们不是同时.

2021-12-01 11:01:37 2807

原创 learnopenglcn-透明物体

对于半透明物体如果半透明物体跟不透明物体在同一个pass中一起渲染,而且开启了深度测试,那么由于半透明物体也会改写depth值,前面的半透明物体可能会遮住后面的半透明物体和其它物体,所以对渲染顺序有要求:a. 先渲染不透明物体;b. 对半透明物体由远及近进行渲染;但是由于对半透明物体进行排序非常困难,更好的办法是将不透明物体和半透明物体分成2个pass分别进行渲染,而在渲染半透明物体的时候,关闭深度测试,这样就不用担心顺序的影响了!对于完全透明物体(如草的贴图)渲染时FS中如果发现其al..

2021-11-29 20:41:39 2678

原创 向量点乘、叉乘含义

点乘v¯⋅k¯=||v¯||⋅||k¯||⋅cosθ结果为一个值,可以看出两个向量点乘结果的正负值取决于它们的夹角,这个非常有用;比如通过这个夹角可以判断摄像机向量和物体顶点法线向量的点乘结果,如果为正说明顶点在正面,如果为负说明顶点在反面(可以剔除!);叉乘结果为一个向量,叉乘只在3D空间中有定义,它需要两个不平行向量作为输入,生成一个正交于两个输入向量的第三个向量。...

2021-09-10 14:29:41 738

原创 MVP矩阵和视口变换

经过MVP变换之后,物体变换到裁剪空间(clip space),在裁剪体(clip volume)里的即会显示在屏幕中。

2021-08-17 09:09:37 194

原创 关于GLES Hook图层

参考链接:https://developer.android.google.cn/ndk/guides/rootless-debug-gles若想添加一层hook,需要实现以下2个函数:void* AndroidGLESLayer_Initialize(void* layer_id, PFNEGLGETNEXTLAYERPROCADDRESSPROC get_next_layer_proc_address))void* AndroidGLESLayer_GetProcAddress(const c

2021-08-13 15:32:50 498

原创 关于glVertexAttribPointer的pointer

void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);分以下几种情况:如果当前绑定的GL_ARRAY_BUFFER的bufferId为0时,pointer可以理解为vbo的起始地址;实际游戏运行中一般不会遇到这种情况;如果当前绑定的GL_ARRAY_BUFFER的bufferId非0时,pointe

2021-06-26 14:57:51 179

原创 求解二维网格面积类题目

最大的以 1 为边界的正方形给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。示例 1:输入:grid = [[1,1,1],[1,0,1],[1,1,1]]输出:9示例 2:输入:grid = [[1,1,0,0]]输出:1提示:1 <= grid.length <= 1001 <= grid[0].length <= 100grid[i][j] 为.

2021-05-14 21:46:27 133

原创 set自定义结构体,主要是用到它的自动排序功能,可以替换优先队列

关键:如果想用它的自动排序功能,需要重载结构体的“<”符号函数;map也是类似;最多可以参加的会议数目给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。请你返回你可以参加的 最大 会议数目。示例 1:输入:events = [

2021-04-30 23:03:56 327 1

原创 不同数据类型的lower_bound, upper_bound用法

使用二分查找法:lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。1. 对于vectorvector< int> t = {1,2,3,4,5,6,7};int lowIdx = lower_bound(t.begin(), t.end(), 5) - t.begin(); // lowIdx为4,是一个下标int upIdx = up

2021-04-18 20:18:06 188

原创 leetcode----优先队列

优先队列学习:https://www.cnblogs.com/huashanqingzhu/p/11040390.html优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。//升序队列,小顶堆priority_queue <int,vector,greater> q;//降序队列,大顶堆(默认)priority_queue <int,vector,less> q;常用方法:top 访问队头元素empty 队列是

2021-04-11 22:54:59 102

原创 知识普及----光栅化时阴影是如何生成的

某一帧绘制的时候,一般按照如下顺序进行:先绘制ShadowMap,绘制的大小实际上是由光源这个视椎体决定,ShadowMap负责记录每个点离光源的最近非透明物体的距离;绘制主pass:a. 绘制的时候ShadowMap会作为输入texture,对每一个DrawCall一般会在这个pass的Vertex Shader中计算出当前顶点离光源的距离记为Distance,并计算这个顶点对应到ShadowMap中的深度信息DeepVal(比如将这个点通过光源视椎体的MVP矩阵变换过去),将Distance和D

2021-04-10 18:22:38 247

原创 leetcode----归并排序

剑指 Offer 51. 数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5思路:采用归并排序算法(n*log(n)),边排序边更新逆序对;归并排序算法中用到了分治+递归的思想;核心代码块为:key0、key1、key2、key3class Solution {public: int SortAndGetCount(vector<int>&

2021-04-10 18:03:13 197

原创 leetcode--链表

删除排序链表中的重复元素 II存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]思路:对于删除链表类型的题目,由于链表头部可能会变化,所以引入“哑节点”的概念;另外还有个关键点是进行删除操作时不要直接操作当前节点,而是.

2021-03-26 20:30:30 32

原创 常见的Culling方式

常见的Culling方式有:视椎体裁剪、背面裁剪、遮挡剔除、细节(Detail)裁剪;前3种culling一般游戏引擎都会支持。

2021-03-16 09:12:33 48

原创 leetcode-回文串

分割回文串 II给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。示例 1:输入:s = “aab”输出:1解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。示例 2:输入:s = “a”输出:0示例 3:输入:s = “ab”输出:1提示:1 <= s.length <= 2000s 仅由小写英文字母组成思路:根据回文串的状态转移方程得到所有子串是否是回文串;利用dp记录遍历.

2021-03-08 20:18:31 184

原创 opengl蒙皮实现

参考知乎链接:https://zhuanlan.zhihu.com/p/115223309由于“动态”物体会不停变化,即蒙皮对应的vbo会不停变化,采用Feed back方式将VS的计算输出到vbo中,再在CPU测计算碰撞检测等,所以蒙皮的开销一般会比较大;比较核心的代码:glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_TransFeedbackBufId);glBindTransformFeedback(GL_TRANSFORM_FEEDBA

2021-02-26 10:59:16 237

原创 glDrawArrays和glDrawElements区别

glDrawArrays = DrawPrimitiveglDrawElements = DrawIndexPrimitiveglDrawArrays只需要bind vbo信息;glDrawElements需要同时指定ibo和vbo信息;对于复杂模型,一般顶点会被多次重复使用,用glDrawElements比较合适;对于顶点很少重复使用的模型,用glDrawArrays更好;比如对于蒙皮,它的很多三角形是分离的,顶点重复使用较少,经常会用glDrawArrays绘制;...

2021-02-26 10:27:28 234

原创 opengl中的program

Vertex Shader和Flagment Shader是挂在program上的,因此program也包含VS的输入描述;一次draw就是将本program对应的VS和PS执行一遍;不同的RenderPass下有很多draw,每个draw可能使用不同的program,它们可能会对应不同的VS和PS;...

2021-02-26 09:33:26 412

原创 图形学习--理解stencil test、depth test

共同点:它们的目的都是为了丢弃片元!!!1. **模板测试(stencil testing)**:FS处理完一个片元之后,通过模板测试决定是否要丢弃它,可简单理解stencil就是个mask掩码,1表示通过,0表示丢弃;此过程发生在渲染流水线的合并阶段中,具体在片元着色器之后,深度测试之前;2. **深度测试(depth testing)**:深度测试可以从一个特定角度达到最近物体的排序的效果,与之相关的深度缓冲(Depth Buffer)里的值始终保存离摄像机最近物体的深度值(透明物体除外)

2021-01-18 10:25:54 767

原创 leetcode刷题之路--贪心

用最少数量的箭引爆气球在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所.

2021-01-16 22:26:53 65

原创 leetcode刷题之路--括号相关

注:一个有效的括号必须符合以下规律:a. 从左至右遍历时,任意位置必须满足“左括号的数量”大于等于“右括号的数量”;b. 从右至左遍历时,任意位置必须满足“右括号的数量”大于等于“左括号的数量”;有效的括号字符串给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:任何左括号 ( 必须有相应的右括号 )。任何右括号 ) 必须有相应的左括号 ( 。左括号 ( 必须在对应的右括号之前 )。可以被视为单个右括号 ) ,或单个左括

2021-01-16 16:36:25 55

原创 leetcode刷题之路--拓扑排序

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/course-schedule-ii课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例

2021-01-07 19:49:13 117

原创 LeetCode刷题之路--递归

递增子序列给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明:给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。class Solution {public: .

2020-12-30 11:13:38 132

原创 LeetCode刷题之路--二分法

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/divide-chocolate分享巧克力你有一大块巧克力,它由一些甜度不完全相同的小块组成。我们用数组 sweetness 来表示每一小块的甜度。你打算和 K 名朋友一起分享这块巧克力,所以你需要将切割 K 次才能得到 K+1 块,每一块都由一些 连续 的小块组成。为了表现出你的慷慨,你将会吃掉 总甜度最小 的一块,并将其余几块分给你的朋友们。请找出一个最佳的切割策略,使得你所分得的巧克力

2020-12-27 12:51:20 144

空空如也

空空如也

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

TA关注的人

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