- 博客(108)
- 收藏
- 关注

原创 采用前端技术开源了一个数据结构算法的可视化工具
VisuAlgoX是一个面向计算机科学和游戏开发的交互式算法可视化工具,帮助用户通过直观的动画理解各种数据结构和算法。尽管介绍如此,但是具体网站都会更新哪些方面的内容,这其实没有很明确的规划。因为规划只能锁死内容上限,当前的计划是,陆续涵盖基本数据结构和基本算法的动态可视化内容。其次,还有一些游戏开发、图形学、数学等方面的可视化内容,主打一个下限全,上限高。当然,如果各位有自己的需求并且有能力的情况下,可以拉取我们的项目进行新功能的开发并合并哦!
2025-04-01 18:43:07
444

原创 [游戏算法基础]:A* 寻路算法(博客端持续维护)
A*寻路算法是一种在图形平面上寻找最短路径的有效方法。它被广泛应用于游戏开发、路径规划、机器人导航等领域。和一些其他的最短路径搜寻算法不同,A星算法是一种启发式的搜索算法,通过评估每个节点的代价来选择最优路径。A星结合了知名的Dijkstra算法和贪心算法的优点,因此被广泛的应用在各个领域,尤其是游戏开发中,对于游戏中AI角色或者NPC角色以及一些自动寻路功能的开发中更是常客。
2025-03-26 10:40:35
1213

原创 IDEA自动补全&提示功能消失的几种解决方案
此外,智能补全功能还可以提供关于代码的上下文信息,帮助开发人员更好地理解代码结构和功能。我也是最近才遇到的一个情况,在编写代码时IDEA的智能补全功能莫名其妙的失效了,虽然这个功能本质上不会影响我们代码的运行逻辑和程序的功能性,但在编码效率上却是很重要。第一次遇到这种情况也是去网络上找了一些文章,内容也是大同小异,但遗憾的是这些文章中提到的方法都没能解决我的问题,最后实在是走投无路,只好自己。所以说,智能补全功能可以帮助开发人员更高效地编写代码,减少错误,提高代码质量,是编程工具中非常重要的功能之一。
2024-03-31 00:06:36
17818
24
原创 游戏开发必备:高效的 AABB、球体和 OBB 碰撞检测算法
本文系VIP文章,如果你还不是VIP,请移步免费阅读!在游戏开发中,碰撞是一个常见且基础的术语,也是绝大部分3D游戏避不开的技术点。本文基于3D/2D游戏中物体碰撞的基本数学原理、计算实现等方面进行展开,时间关系,关于碰撞检测可能涉及到的物理部分的内容可能会在后续的维护中进行更新。
2025-04-03 11:48:45
891
1
原创 游戏开发中的贝塞尔曲线:感受丝滑的数学之美
贝塞尔曲线是计算机图形学中最重要的概念之一,以其在表示曲线时的灵活性和精确性而闻名。广泛应用于计算机图形学、动画、路径规划等领域的数学曲线。贝塞尔曲线的数学原理基础是1912年成立的伯恩斯坦多项式。简单来说,贝塞尔曲线是通过可变数量的点定义的。当控制点只有两个时,绘制出来的是一条直线,也称为线性贝塞尔曲线。具有三个控制点的贝塞尔曲线是 二次贝塞尔曲线,四个点控制的则是三次贝塞尔曲线,以此类推。其中,二次和三次贝塞尔曲线比较常用,也是比较受欢迎的两种。因为他们在计算简单性和能够表示无限范围的曲线之间取得了平衡
2025-03-30 21:41:46
819
原创 关于兄弟叫砍我一刀这件事,商业欺诈背后的逻辑
这些抽奖活动并非真正的随机,而是精心控制的骗局。你永远差一点提现,是因为系统在操控中奖概率,让你不停抽,甚至拉人进来。平台赚钱的方式是广告、数据、充值,而用户大多只是被利用的工具。不要相信“轻松赚钱”的承诺,远离这类骗局,避免浪费时间和精力!如果这篇文章对你有帮助,请转发给更多朋友,让大家都能识破这些套路,不再上当受骗!
2025-03-28 18:11:25
769
原创 [C++游戏开发基础]:深入解析this指针的应用与技巧
这是一篇VIP文章,如果你还不是会员,请移步免费阅读。如果你没有其他面向对象的编程语言基础,比如Javac#等,那么你在学习C++面向对象时可能会好奇,当一个成员函数被调用的时候,C++是如何跟踪它被调用的对象的?对于上述代码,当我们调用时,C++知道函数setID()应该对对象simple 进行操作,并且m_id实际上引用了。为什么会这样?这因为C++使用了一个名为this的隐藏指针。
2025-03-26 19:43:33
744
原创 [C++游戏开发基础]:关于范围for循环的使用
都知道,使用普通的for循环容易产生问题,第一是索引越界的问题,其次是索引符号的问题。所以一般情况下,在 C++ 编程中,尽量避免使用形式的来访问数组或容器的元素,而是推荐使用或来进行遍历和操作。
2025-03-26 16:14:59
729
原创 [C++游戏开发基础:嵌套类型]
考虑下面程序:目前为止,我们已经介绍过具有两种不同类型成员的类类型:类类型还支持另一种成员,那就是 嵌套类型(也称为成员类型)。创建嵌套类型很简单,只需要在类内部选择一个合适的访问修饰符下进行类型定义即可。下面的例子在功能上和上面的是一样的,但是它采用了嵌套类型的定义方式:嵌套类型 已在类的顶部定义。嵌套类型名称必须在使用之前完全定义,因此通常先定义它们。嵌套类型遵循正常的访问规则。是在修饰符下定义的,这样类型名称和枚举就可以被公开访问。类类型充当在其中声明的名称的作用域,就像命名空间一样。因此
2025-03-25 16:51:27
408
原创 [C++游戏开发基础]:构造函数浅析,8000+字长文
当使用值初始化一个类时,如果该类具有用户定义的默认构造函数,对象将会进行默认初始化。但是如果该类有一个未由用户提供的默认构造函数即,一个隐式定义的默认构造函数,或者使用= default定义的默认构造函数),那么在默认初始化之前,该对象将被进行零初始化。// 注意:没有默认初始化值int m_b {};// 默认初始化为 0public:User() {} // 用户定义的空构造函数private:int m_a;
2025-03-22 22:48:51
974
2
原创 [C++游戏开发基础]:数据封装(隐藏)的好处
在编程中,接口(interface)和实现(implementation)的分离是非常有用的概念。让我们先明确在类(class)类型中,这两个术语的含义。
2025-03-20 20:35:07
900
原创 [通俗易懂C++]:范围枚举(枚举类)
在之前的文章中已经介绍了,虽然他属于C++中的特殊类型,但并非类型安全,在某些情况下会出现一些比较抽象的结论。如你所料,程序会打印:显然,这样的打印在语义上是没有意义的,因为颜色和水果是来自不同的枚举,这样的比较很抽象。为了解决类似的问题以及命名空间污染的问题,C++中还设计了另外一种枚举,那便是范围枚举。
2025-03-15 13:39:42
482
原创 [通俗易懂C++]:std::optional
如果调用者传入一个语义上无效的值(例如y0),此函数无法计算一个返回值(因为除以 0 在数学上是未定义的)。在这种情况下我们该怎么办?这种情况下,通常的做法是让函数检测错误,然后将错误返回给调用者以适当的方式处理。比如;以下示例中,函数在用户为x传递语义上无效的参数时返回值0.0(这种情况在其他情况下不会发生)再考虑我们上面的函数。如果用户传入0作为y的值,它可能返回什么值?我们不能使用0,因为0除以任何数都不会得到0作为有效结果。实际上,并不存在我们无法返回且无法自然出现的值。
2025-03-07 18:15:21
1009
6
原创 [通俗易懂C++]:引用返回和地址返回
在之前的文章中已经提到过,当使用按值传递时会创建参数的一个副本到函数中。对于基本类型(复制成本较低),这是可以的。但对于类类型(如),复制通常成本较高。我们可以通过使用(const)引用传递(或按地址传递)来避免进行昂贵的复制。这篇文章主要介绍一些在关于使用引用返回和地址返回的基础知识。
2025-03-03 19:38:27
709
原创 [通俗易懂C++]:指针和const
那么,如果我们想指向的值是const呢?这段代码会出现编译错误,因为我们尝试将一个指向const int类型的指针赋值给一个普通的int*指针,C++中不允许这样做。具体原因是const修饰符确保该变量的值在程序运行期间不能被修改,而普通的int*指针允许修改所指向的内容,所以会发生类型不匹配。
2025-02-23 00:09:34
1136
原创 浅谈C++中的函数重载解析和不明确匹配
先简单回顾下函数重载需要借助函数中的哪些属性来作为是否是重载函数的依据:但是,这只是我们定义函数重载概念中的一部分,编译器在实际的函数重载过程中,还会进行一系列的二次判定和相对繁琐的规则匹配,这, 就是本文的内容。对于非重载函数,也就是具有唯一名称的函数嘛,只有一个函数可能与调用匹配,可以说,这样的函数一调一个准,因为唯一,所以没有选择,因为没有选择,所以无需过多的匹配流程。所以这种情况下,调用该函数只有两种 结果:匹配不匹配(编译错误)但是对于重载函数来说,可能存在多个函数与调用匹配的情况。由于函数调用只
2025-01-21 11:19:40
1034
1
原创 C++编码实践,邪恶的非常量全局变量
在编程过程中,避免使用全局变量是一个良好的编程实践建议。当然,这里的全局变量主要是指;尽管在小型项目中,这一点似乎看起来人畜无害,但是在大型项目中往往会出现很多问题。新手程序员往往比较喜欢使用大量的全局变量,因为这样使用起来方便直接,特别是当设计到不同函数的多次调用传递参数时。若无特别说明,本文后续内容中提到的全局变量均指。
2025-01-12 20:06:42
905
原创 高质量C++小白教程:2.10-预处理器简介
define指令可用于创建宏,在C++中,宏是定义如何将输入文本替换为输出文本的规则。类对象宏类函数宏类函数宏的行为类似于函数,并具相似的用途,他们的使用通常被认为是不安全的,几乎他们能做的任何事情都可以通过普通的函数完成。顶部定义没有替换文本,而底部定义有。因为这些是预处理器指令(而不是语句),所以请注意,这两种形式都不以分号结尾。宏的标识符使用与普通标识符相同的命名规则:可以使用字母、数字和下划线,不能以数字开头,也不应该以下划线开头。按照约定,宏名称通常全部大写,并用下划线分隔。
2025-01-03 21:25:34
829
1
原创 虚幻引擎游戏开发系列专题-官方编码标准或规约
遵守既定标准和最佳实践来编写可维护的代码。在虚幻游戏引擎中,存在着一些既定的编码标准和约定 ,养成良好的编码规范是写好一份优雅代码的第一步,并且在虚幻官方也强调了,某些编码标准的遵循是强制性的。
2024-12-20 23:55:26
1363
1
原创 虚幻引擎游戏开发专题-类前置声明,让你的代码更清晰、更快速
类的前置声明指的是在头文件中只声明类的名称,而不提供它的具体实现。通常,前置声明是通过这样的形式来实现的。这种方式通常用于只需要知道类的类型(例如指针或引用)而不需要访问类的具体成员的场景。为什么说这种声明方式在虚幻引擎中属于高频使用呢?中的代码结构非常庞大,类和组件之间的依赖非常复杂。合理地使用前置声明可以提高编译速度:避免在头文件中包含大量的完整头文件,减少不必要的依赖,降低编译时间。减少循环依赖问题:通过前置声明,你可以避免直接包含某些头文件,尤其是在两个类互相依赖的情况下。
2024-12-19 22:44:34
846
原创 虚幻引擎游戏开发专题-1-引擎术语
Pawn 是Actor的子类,作为游戏内的形象或人像(例如游戏中的角色)。在多人游戏期间,服务器具有游戏中每个玩家的玩家控制器的一个实例,因为它还必须对每个玩家进行网络功能调用。类定义了虚幻中特定Actor或Object的行为和属性,类是分层的,意味着类从其父类(即派生出类的类,或"子类"的来源)中继承信息并将该信息传递给其子项。类型转换不同于简单地检查Actor是否是给定的类,它将返回一个二选一的答案(是或否),但不允许你与该类的任何特定功能进行交互。是计划用作玩家角色的Pawn Actor的子类。
2024-12-08 18:00:53
1151
4
原创 MySQL千万级查询从190秒优化至1秒
首先需要明确,处理数千万条数据通常不是MySQL的最佳使用场景。分片(拆分表和数据库)创建汇总表修改查询使用多个子查询本文讨论的场景是单个MySQL表中包含数千万条记录的情况。假设表设计较差,且业务规则不允许将SQL查询拆分为多个子查询。在这种情况下,开发者可以尝试通过优化SQL来实现查询目标。尽早命中索引,使用小表驱动大表。处理IN子句的低效性时,可以尝试强制索引。使用覆盖索引避免表查找。使用表分区(如按用户ID取模)。使用汇总表替代子查询。冗余连接字段直接放入单表。
2024-12-04 23:16:37
581
1
原创 Rust vs Java:后端开发应该选哪个?
后端技术的发展迅速。根据JetBrains 2024年开发者调查,尽管Java仍然占据约34.5%的市场份额,但Rust在高性能应用中的应用逐渐增多。过去四年中,Rust在企业中的采用增长了240%(根据Stack Overflow 2024开发者调查)。随着组织更加注重效率和可扩展性,选择Rust还是Java已成为一个常见的讨论话题。本文将探讨这两种语言的优势、性能指标及实际应用案例,以帮助你做出决策。
2024-12-01 12:21:34
510
2
原创 游戏算法专题之PRD算法:听说你想凭运气抽中荣耀水晶?
PRD算法全称。是概率分布中的一种常见算法,在游戏开发领域中很常用。PRD用于控制随机事件的触发概率,使其表现得更加符合预期,相比于传统得随机数生成,PRD算法可以平滑得控制随机事件的触发次数,确保不会出现过于极端的情况,比如长时间未触发或者频繁触发。如果你觉得它离你很远,那么举个栗子,玩“王者荣耀”的多少都知道其中有一个道具叫,这玩意就是靠抽奖的方式获得的,而根据官方抽奖的方式与概率公布等信息来看,抽取荣耀水晶的算法大概率也是PRD或者它的变种算法。在游戏中,PRD。
2024-09-15 22:28:36
1368
1
原创 位运算:带带孩子吧,孩子很强的!
实现这个需求的方法很多,比较常见的做法是后端处理完之后将红点状态以表的形式存起来再通过请求发送到前端,但是这样做会加大前后端交互过程中数据传输的数据量,可能会导致数据传输超上限、服务器压力增加、后端计算成本提高等潜在的问题,毕竟一个游戏功能的界面的红点数是有可能多达几十上百个的,而且每次都需要后端不断的进行存表读表的操作,确实不够优雅。这些是常规的计算方法,可能大部分人在开始学习的时候多少都接触过,但我们的诉求是尽可能的通过心算的方式快速进行二进制十进制之间的转换,这样才能在使用位运算时得心应手。
2024-09-08 10:27:44
1107
1
原创 你应该使用的 10 个鲜为人知的 C++ 功能
性能优化不论在什么开发场景中都避不开的话题,尤其是游戏开发领域,大型高耗的大作对于性能的处理非常重要,这直接决定了游戏品质,如果你正在考虑学习C++,那么请一开始就保持一个良好的编码习惯,理解并使用这些精辟的语法非常重要哈。当然,如果你觉得C++太难学了,那么学Python吧,现在AI时代,还能干一波大的,之前用过的一个不错的人工智能学习网站这里直接贴地址,供各位有需要的点击传送,直达智能未来!
2024-08-28 23:13:58
933
1
原创 借题《黑神话悟空》,聊聊UE5 游戏开发中基本的 C++ 概念
最近火的一塌糊涂的《黑神话悟空》就是用UE5引擎开发的。借题发挥,今天讲讲UE游戏开中的一些C++基本概念;编写代码与蓝图(可视化脚本)相结合具有独特的功能,您需要利用这些功能来实现两全其美。编程可以帮助创建更复杂的游戏机制,因此成为一名高级 C++ 程序员是任何认真的独立游戏开发人员的必备条件。
2024-08-24 17:14:48
3738
16
原创 Java 22 中的4个永久特性
经过超过 10 年的工作,通过在 Java 22 中最终确定 JEP 454(外部函数和内存 API),我们现在有了一种比 JNI 更好的方法和 API 来与 Java 运行时之外的代码和数据进行交互。实际上,这是向 Java 编程语言添加新功能的新过程,Java 社区使用这种过程来在 API 和工具处于早期实验阶段时从社区获得反馈(孵化功能)或已经完全指定但尚未永久的阶段(预览功能)。这个功能是 JShell 的一个补充功能,也是 Java 11 中引入的启动单文件源代码程序功能的补充。
2024-07-23 22:03:16
1108
1
原创 Rust代码优化的九大技巧
性能分析工具对于任何性能优化任务都是必不可少的,提供了明确的方向以集中精力进行优化。:Cargo 是 Rust 的包管理器,带有内置工具来分析代码性能,以识别性能瓶颈。这样的工具提供了程序在大多数时间中运行位置的可视化表示,帮助识别性能热点。:Rust 中的切片和数组操作经过高度优化,提供了高效操作集合的方法。:在性能关键的应用中,尤其是处理大数据集或实时处理时,使用这些技术。:最小化锁和其他同步原语的使用,以减少争用并在多线程应用中提高性能。:切片减少了显式边界检查的需求,利用 Rust 的安全保证。
2024-07-11 23:07:46
1540
2
原创 顶级5款有用的免费IntelliJ插件,提升你作为Java开发者的旅程
在本文中,我们将深入探讨IntelliJ IDEA插件——那些可以提升你生产力的神奇附加组件,并微调你的代码以达到卓越。我们将探索5款免费插件,旨在将你的开发水平提升到一个新的高度。
2024-07-04 21:48:19
822
原创 放弃 VS Code:新代码编辑器 Zed 的时代已经到来(附使用感受)
版本,当然,出于简单考虑,我并没有编译全部的功能,但是核心的编辑和插件、主题系统以及代码提示等功能还是有的,编译还是比较简单的,只要环境没问题,按照官方提供的步骤自己就可以完成。确实还是不少的,这一点无可厚非,毕竟做开发的都能理解,如果你追求完善的体验,那还是建议你安心等官方发布吧,这是一款非常。全部的功能上面也介绍了,但由于我编译的并不是完整的功能版本,因此很对功能还是没能体验到,不过就已有的功能来说,的速度确实很快,不管是启动还是日常使用中的响应,写代码的多多少少都用过好几款不同的编辑器,比如。
2024-06-25 20:22:50
10947
4
原创 C++ 基础:指针和引用浅谈
动态内存分配可以提高内存管理的效率,尤其是对于数组而言,很多时候我们可能要到运行时才能知道数组的大小。引用传递是一种在函数中传递参数的方法,其中将实际参数的引用而不是它们的值传递给函数。我们在程序中声明的每个变量在内存中都有一个关联的位置,我们称之为变量的内存地址。请注意,我们没有声明单独的指针变量,而是使用数组名称 arr 作为指针表示法。在上面的程序中,我们分别使用普通方式和指针的方式打印了数组元素的地址信息;一旦我们不再需要使用动态声明的变量,就可以取消分配该变量占用的内存。
2024-06-25 19:41:01
1037
原创 10分钟部署一个个人博客
确保到这一步之前,你的项目可以通过命令成功跑起来。首先,自定义我们能看到的首页一切,比如:下面是我自己博客的截图示例修改主页按钮信息找到项目中的那个README文件,修改其中的内容,效果如下,根据自己的需求修改之后,再次运行项目查看效果,你就知道具体改动了哪些东西。修改主页logo和名称找到项目中一个名为config.js的文件,这里可以修改右上角的功能导航栏、主页名称和座右铭;
2024-06-15 17:25:52
1795
2
原创 Rust基础学习-Modules&Package
在Rust中,可以使用mod// code这里,是模块的名称。看下面的例子;println!("config!");上面的示例中,我们使用mod定义了以config为名称的一个模块。在模块内部,我们定义 了一个简单的函数print;
2024-06-13 09:40:27
1097
2
原创 Rust基础学习-标准库
栈和堆是我们Rust代码在运行时可以使用的内存部分。Rust是一种内存安全的编程语言。为了确保Rust是内存安全的,它引入了所有权、引用和借用等概念。要理解这些概念,我们必须首先了解如何在栈和堆中分配和释放内存。
2024-06-11 21:21:53
1352
3
原创 Rust基础学习-Rust宏
Rust中的宏是生成另一段代码的一段代码。可以根据输入生成代码,简化重复模式,使得代码更加简洁。比如我们一直在用的都是宏。
2024-06-08 09:24:36
975
3
原创 Rust基础学习-Rust中的文件操作
方法来打开一个指定文件,函数接收一个文件路径作为参数并返回一个文件对象,如果文件不存在,将会返回一个。文件 I/O 是通过提供与文件系统交互的功能的。中的文件读写相关的内容,掌握了文件处理中的读写删追等基本操作,怎么样,你坤哥厉不厉害!变量进行模式匹配,如果打开文件时出现错误,就会调用。这种方式写入文件,新的内容会将之前文件中的内容覆盖。运行程序会打印读取到的文件对象,如果存在的花。)的所有字节,并将其复制到一个可变字符串。如果打开文件没有错误,我们将输出。方法,该方法将一个空的可变字符串。
2024-06-06 10:16:06
1788
3
官方助力:SpringAI快速尝鲜体验(SpringBoot3+Gradle8+JDK17) 项目源码
2024-04-17
Java语言编写的带GUI界面的只能计算器,可以用来学习JavaFX界面编程以及Java语法练习,大学课程设计等
2024-03-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人