- 博客(136)
- 收藏
- 关注
原创 内存地址在加载时才确定
灵活性:允许操作系统高效管理多进程内存。安全性:ASLR增加攻击者利用内存错误的难度。抽象性:程序员只需关注虚拟地址,物理地址由OS和MMU处理。理解这一点是掌握动态链接、内存保护和系统安全的基础。
2025-03-30 01:09:34
642
原创 【Godot】Camera2D
Camera2D是Godot中非常强大的工具,能够帮助你轻松实现2D游戏中的视角控制。通过合理设置Camera2D的属性,并结合代码控制,你可以实现各种复杂的摄像机行为。
2025-03-16 11:30:00
434
1
原创 【Godot】Window类
Window是 Godot 4.0 中用于管理应用程序窗口的核心类,提供了对窗口大小、位置、标题、模式等属性的控制。通过Window,开发者可以实现多窗口应用、自定义窗口样式以及处理窗口事件等功能。它是构建现代 GUI 应用程序和游戏的重要工具。
2025-03-15 19:30:00
1109
1
原创 使用【Godot】做游戏前你必须知道的一些概念
Node是 Godot 中所有类的基类。Viewport和CanvasItem是两大分支:Viewport分支用于渲染管理和窗口控制。CanvasItem分支用于 2D 渲染和对象管理。具体的功能类(如)继承自Node2D或,提供了更具体的功能。# Game.gd信号是 Godot 中用于实现节点间通信的强大工具,它允许节点在特定事件发生时通知其他节点,而无需直接引用或硬编码连接。通过信号,开发者可以实现松耦合、灵活且事件驱动的游戏逻辑。
2025-03-15 16:05:52
1224
1
原创 【Godot】Viewpoint
Viewport是 Godot 中用于管理渲染内容和场景显示的核心组件。它支持 2D 和 3D 渲染,可以用于实现分屏、画中画、渲染到纹理等高级功能。通过灵活使用Viewport,开发者可以实现复杂的渲染效果和优化游戏性能。
2025-03-15 14:25:06
865
原创 【Godot】CanvasItem
绘制一个红色矩形CanvasItem是 Godot 2D 系统的核心类,提供了 2D 渲染、变换、绘制和输入处理等功能。它是Node2D和Control等类的基类,广泛应用于 2D 游戏和 UI 开发中。通过CanvasItem,开发者可以实现复杂的 2D 图形和交互效果。
2025-03-15 14:09:25
1043
原创 【Godot】检查器的作用
在Godot游戏引擎中,**检查器(Inspector)**是一个非常核心的工具。按类别分组(如Transform、Physics、Rendering等)。别再跟着教学视频依葫芦画瓢了,你必须清楚检查器的作用到底是什么。可编辑的字段(如输入框、下拉菜单、颜色选择器等)。它用于查看和编辑场景中选定对象的属性和资源。它能够帮助开发者快速调整和管理对象的设置。变量,并允许直接修改。
2025-03-15 13:34:49
632
原创 【C/C++】文件句柄
什么是文件句柄?(File Handle)是操作系统中的一种抽象概念,它用来表示一个打开的文件或输入/输出设备。文件句柄是程序与文件之间的,程序通过文件句柄来访问和操作文件的内容。
2025-03-14 21:00:00
859
原创 【C++】分清cerr、perror、cout
std::cerr 和 perror 是 C++ 和 C 标准库中用于输出错误信息的工具,但它们在用法、功能和应用场景上有显著区别。
2025-03-14 12:00:00
522
原创 【C++】抛异常vs未定义行为
抛异常和未定义行为在实践意义上有显著的区别,主要体现在程序的行为、调试难度、代码健壮性和安全性等方面。抛异常:当程序检测到错误(如越界访问)时,抛出一个异常对象。异常可以被捕获并处理,程序可以选择恢复或优雅终止。示例:std::vector::at() 在越界访问时抛出 std::out_of_range 异常。未定义行为:当程序执行了某些非法操作(如越界访问数组)时,C++ 标准未定义其行为。程序可能崩溃、产生错误结果,或者表现出不可预测的行为。
2025-03-13 15:53:17
950
原创 【C++11】移动语义
在这里,main函数里调用了函数Func1,调用结束后Func1的栈帧是要回收的,下次调用Func2还占用的是这块空间,所以怎么可能将Func1中的str单独延长生命周期呢?这里前两组的构造+拷贝构造是"11111"与 "2222"的,最后的两个拷贝构造一次是str去拷贝构造临时对象,一次是临时对象去拷贝构造ret。总结就是C++11之前很依赖编译器的优化,有了移动拷贝和赋值之后,对编译器的优化的依赖很小,只是锦上添花不再是雪中送炭。这一般指的是临时对象、匿名对象。的c是可以被取地址的,尽管是常量。
2025-03-11 16:27:14
996
1
原创 【Godot】实现对话系统
在 Godot 中实现对话系统(Dialogue System)是游戏开发中的常见需求。Godot本身自带的的灵活性和轻量级脚本语言 GDScript 使得实现对话系统变得相对简单。以下是实现一个基础对话系统的示例。(语言为GDScript但高亮选择Python因为类似)通过 Godot 和 GDScript,我们可以给我们的游戏实现一个对话系统。从简单的文本显示到复杂的分支对话,Godot 提供了足够的灵活性来满足我们的需求。如果需要更高级的功能,可以尝试使用现成的插件如 Dialogic。
2025-03-09 14:28:18
1415
3
原创 【Godot】@export_multiline
export_multiline 简化了多行文本的编辑,适用于需要处理大量文本的场景,如对话、描述等。
2025-03-09 14:16:07
501
原创 C++11之右值引用
(小补充:为什么要设计有左值还要右值?因为可以在一些地方进一步提高效率)• 左值是⼀个(如变量名或解引⽤的指针),⼀般是有持久状态,存储在内存中**,可以获取它的地址**,左值可以出现赋值符号的左边(可以修改),也可以出现在赋值符号右边。定义时const 修饰符后的左值,不能给他赋值,但是可以取它的地址。• 右值也是⼀个,要么是字⾯值常量、要么是表达式求值过程中创建的临时对象等,右值可以出现在赋值符号的右边,但是右值不能取地址。
2025-03-03 15:00:32
665
原创 C++11之列表初始化
C++11是C++的第⼆个主要版本,并且是从C++98起的最重要更新。• C++11列表初始化的本意是想实现⼀个⼤统⼀的初始化⽅式,其次他在有些场景下带来的不少便 利,如容器push/inset多参数构造的对象时,{}初始化会很⽅便。匿名对象和临时对象的区别:匿名对象是我们手动创建的,临时对象是编译器生成的,共同特点是都具有常性,都只能给给const引用,不能给普通引用。• 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最后优化 了以后变成直接构造。
2025-01-30 10:42:40
969
2
原创 链地址法(哈希桶)
开放定址法中所有的元素都放到哈希表⾥,链地址法中所有的数据不再直接存储在哈希表中,哈希表 中存储⼀个,没有数据映射这个位置时,这个指针为空,有多个数据映射到这个位置时,我们把这些冲突的数据链接成⼀个链表,挂在哈希表这个位置下⾯,链地址法也叫做拉链法或者哈希桶。
2025-01-06 22:16:37
964
10
原创 哈希表的实现(开放定址法)(万字)
哈希表的整个设计逻辑围绕着减少哈希冲突,直接定址法,局限性强,现实中不好用;开放定址法有很多种方法(实践中除留余数法用得多)难以避免冲突,本质还是一种“内耗”,去占其他人的位置;链地址法(哈希桶)比较好。
2025-01-04 16:34:31
1112
8
原创 封装红黑树实现map/set
因为RBTree实现了泛型不知道T参数导致是K,还是pair,那么insert内部进⾏插⼊逻辑 ⽐较时,就没办法进⾏⽐较,因为pair的默认⽀持的是key和value⼀起参与⽐较,我们需要时的任 何时候只⽐较key,所以我们在map和set层分别实现⼀个MapKeyOfT和SetKeyOfT的仿函数传给 RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数取出T类型对象中的key,再进⾏⽐较,具体 细节参考如下代码实现。,这哨兵位头结点和根互为⽗亲,左指向最左结点,右指向最右结点。
2024-12-21 19:56:44
1025
10
原创 【进程篇】理解进程
proc目录里记录的是当前系统里所有进程的信息,而当前目录下以数字命名的文件就是特定进程的pid,目录里面包含的是进程在运行时的动态属性,进程一旦退出,该目录会被系统自动移除。也看不懂这些众多属性里我们可以先看两个。
2024-12-20 19:47:50
1407
55
原创 【进程篇】操作系统
先描述就是可以用class或者struct包含被管理对象的属性集,再组织就是用数据结构将其管理起来。组织起来后我们就可以将对结点的管理转化成对算法的设置。所以大部分语言提供类和容器,类解决描述问题,容器解决组织问题。操作系统与底层硬件不直接打交道而是拿到底层硬件的数据,将其先描述再组织,转化成对链表等容器的增删查改。预言:操作系统内一定会存在大量数据结构以及与该数据结构匹配的算法。(这也是学懂数据结构的意义——为了学操作系统,网络等所有基于数据结构的所有学科。操作系统如何对进程做管理?
2024-12-20 19:30:22
1035
33
原创 【C++】红黑树(万字)
(建议先学完avl树再来看红黑树嗷)比avl树更抽象?但从实现角度反而更简单一些。在实践中,红黑树的使用更多。这是一种更松散的控制方式。
2024-12-17 19:00:00
1415
14
原创 【C++】AVL树的旋转等
关于这几个旋转涉及到的结点,在命名时我们可以遵循一定的规律,最好不要随意命名。比如subL就是parent的左孩子的意思,L代表left;subLR就是subL的右孩子的意思。但是,我们的结点现在是三叉链的,所以_parent也要进行修改,而现在我们还没有改。这样还不对,因为subLR可能为空,其他两个则不可能。因为这种情况是h为0的情况。这样还是不行,因为如果parent的parent不为空,我们还没有将它的孩子结点更新为subL。
2024-12-16 13:46:00
807
11
原创 【C++】AVL树
AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且。AVL树是⼀颗, 通过。AVL树得名于它的发明者G.M.Adelson-Velsky和E.M.Landis是两个前苏联的科学家,他们在1962 年的论⽂《Analgorithmfortheorganizationofinformation》中发表了它。AVL树实现这⾥我们引⼊⼀个(balancefactor)的概念,每个结点都有⼀个平衡因⼦,任何结点的平衡因⼦等于。
2024-12-11 13:00:00
3333
53
原创 【C++】map
这是一个库中自带的函数模版。因为pair写模版参数很烦所以这个函数就是用来简化这个的。我们往map中插入时无论是第一种有名pair还是第二种匿名pair写起来都不够简单。我们传参数它会自动推导出类型,构造对应的pair然后返回。可以看到返回值就是一个pair对象它的底层实现大概是:看看这俩其实是等价的,对于dict来说都是插入pair对象C++11还支持多参数的隐式类型转换//4.多参数隐式类型转换dict.insert({ "fourth","第四个" });
2024-12-10 19:00:00
1689
25
原创 【C++】隐式类型转换
隐式类型转换是指在 C++ 程序中,编译器自动将一种数据类型转换为另一种数据类型,而不需要程序员显式地使用类型转换操作符(如static_cast、dynamic_cast等)进行转换。这种转换通常在赋值、运算、函数调用等场景中发生,目的是使操作数的类型符合操作的要求。
2024-12-10 11:30:00
1186
20
原创 【进程篇】冯诺依曼体系结构
所以输入输出设备属于外设,输入输出效率低,假设它们的运算效率都是毫秒级别,cpu的运算速度是纳秒级别的,1s=1000ms,1ms=1000μs,1μs=1000ns。通过网络,对方网卡接收,读到内存,再解包解密写回内存,还能帮我们打开对应的目标文件,然后把数据写到输出设备也就是对方的磁盘。后来随着时代发展有了操作系统这种东西,操作系统在内存里,加载的时候就在内存里,它用算法可以将外设中的数据提前搬到内存里,就可以让CPU直接去读了。**而是谁在运行我们的软件呢?是CPU执行我们的代码,访问我们的数据。
2024-12-09 16:00:00
1292
18
原创 【linux】gdb
软件发布的模式有debug和release。linux下我们编译好的代码,无法直接调试。因为gcc/g++默认的工作模式是release模式。我们在Makefile里翻译的时候加上-g选项:这样我们也能生成一个可执行程序,且对比之前生成的release版本,可以看到体积变大了一些。而如果是release版本:可以看到不包含调试信息。程序要调试,必须是debug模式。也就是说编译时要加-g选项gdb未来调试程序必须调试携带调试信息的exegdb的学习分为三步走:快速认识gdb;gdb命令的学习;解决一下gdb
2024-12-09 11:00:00
357
24
原创 【Linux】Git
Gitgit讲解文章内容大纲:1.如何理解版本控制->git gitee github2.git历史简介3.git的操作(要做到Linux和Windows之间能互相传输起来)如何理解版本控制一般在企业中,一个项目的开发是由多个人构成的。所以需要一个集中式的工具,把所有人写的代码进行合并。有时我们被要求比如拿出第一个版本,这就需要版本控制,备份下以前的版本,面对善变的**“甲方”**。可以“回滚”。git不仅做了版本控制。git是什么?将备份、回滚等操作通过程序自动化完成,写出来的
2024-12-08 10:45:00
637
1
原创 【C++】迭代器失效
定义 迭代器失效是指在使用迭代器遍历容器(如vectorlistmap等)的过程中,由于容器内部结构发生了变化,导致原来的迭代器不再有效,不能正确地指向它原本所指向的元素或者不能按照预期的方式进行遍历。 当在vector中插入元素时,如果插入操作导致了内存重新分配,那么所有指向该vector的迭代器都会失效。这是因为vector的存储是连续的内存空间,当插入元素使得当前容量不够时,vector会重新分配一块更大的内存空间,将原来的元素复制或移动到中,原来的迭代器所指向的内存地址就不再有效。
2024-12-03 10:45:00
1445
61
原创 【C++】sort
默认情况下,sort函数按照元素类型的小于(<)运算符定义的升序规则进行排序。,这是因为它在排序过程中可能需要一些额外的栈空间来进行递归操作(基于快速排序的部分实现)。sort函数适用于各种可以通过随机访问迭代器访问的容器,比如std::vector、std::array等。,这里arr相当于first,arr + 5相当于last,因为arr + 5指向数组最后一个元素之后的位置。其中first是指向要排序范围的起始位置的迭代器,last是指向要排序范围的结束位置(,如果要对整个数组进行排序,可以使用。
2024-12-02 17:20:24
1495
30
原创 【C++】set的使用
注意源码这里用的是class T,而不是class K;然后它支持一个仿函数,跟优先级队列类似。不支持比较大小,或者比较大小的方式不是我们想要的,我们就可以写一个仿函数。比如以前我们遇到的,存储类型是一个date*,是按地址比较的,但我们想要date *指向的日期进行比较,我们就可以自己写一个仿函数传过去。一般情况不需要我们传,因为默认用库里的less;
2024-12-02 10:45:00
1278
23
原创 【Linux】Make/Makefile
这个3/4行的语法和1/2行是一样的。也是依赖关系和依赖方法。make命令扫描makefile文件时,从上向下扫描,默认形成一个目标文件。指定make clean的时候才回去执行对应的清除。为什么要给我们的clean声明它是伪目标呢?PHONY类似一种建议性的关键字。伪目标,表示对应的依赖方法和依赖关系总是被执行。什么叫不被执行?我们上面的这组可执行程序没有被修饰,所以我们如果make完又make,是不会执行的。但如果用为目标修饰了,就会发现也可以执行。
2024-11-27 11:00:00
1118
33
原创 【Linux】gcc/g++使用
编译我们知道,gcc只能编译C,g++既能编译C,也能编译C++。由于两者的选项是相同的,这里我们使用gcc来说明。这就是一个我们在linux中gcc编译一段代码后会自动生成一个a.out为名的可执行文件,然后我们./a.out,就可以执行这段代码。
2024-11-24 14:15:14
2483
58
原创 【Linux】vim的使用
进入vimvim是一款编辑器。自带,使用成本较高。我们创建一个普通文件,然后vim code.c,进入vim。想要退出vim,怎么做?(因为当前我们不知道在什么模式下),我们先按下键盘最左上角的Esc,然后再按冒号,最后再打出一个q,然后回车。还有另一种方式也可以退出vim:把键盘切成大写,然后快速按两下Z。多模式编辑器vim是一款多模式编辑器,将行为分类。最常见的为3种模式。命令模式、底行模式、插入模式。首次打开,处在命令模式。它是默认的模式。命令模式怎么切换插入模式?输入一下i。
2024-11-23 20:00:00
1890
38
原创 【Linux】开发工具(yum)
为什么要用包管理器?(yum等)安装的步骤1.网络下载2.安装(就是往系统拷贝),必须使用root权限,安装到系统里,安装一次,任何人都能使用。(因为没有装到home里,而是装在系统里!普通用户要使用软件,不论是可执行程序还是配置文件等,有r或x权限就行了。所以即使是拥有者和所属组都是root,whb也能进行ls -ld这样的操作。可以看到,给other开放了r和x权限。有x权限普通人就能进来.自动解决依赖问题什么是软件包?
2024-11-20 11:00:00
2387
20
空空如也
谁能帮我解答一下这个vc调试问题?
2024-03-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人