- 博客(76)
- 收藏
- 关注
原创 C++性能优化
在日常开发中,我会先用工具(比如perf)定位真正的性能瓶颈,再有针对性地优化,而不是过早优化。如果你的类很小(比如只有1个int),对象大小就从4字节膨胀到16字节(还要考虑对齐),Cache效率立马下降。“一个类有10个虚函数,创建100万个对象,虚函数机制带来了多大的额外内存开销?(32位CPU是4字节,64位是8字节)分块读取。虚函数是实现多态的机制,但它的“代价”在CPU层面是实打实的。多了两次内存访问,CPU流水线可能被打断,分支预测更难。:对齐规则是每个成员的偏移量必须是其自身大小的整数倍。
2026-08-30 09:07:22
224
原创 计算机组成原理
学科领域伪共享的角色典型问题计算机组成原理根本原因“为什么CPU这么设计?“为什么修改一个字节会影响另一个?操作系统调度环境“OS怎么分配线程到不同核心?“内核里的计数器怎么优化?编译原理布局优化“编译器怎么安排变量内存地址?“能不能自动加Padding?高性能编程/游戏开发应用实践“我怎么避免掉帧?“怎么用SoA架构重构数据?
2026-06-17 21:53:14
371
原创 RAll思想解决C++编程中内存泄漏问题
RAII是的缩写,中文译为“资源获取即初始化”。将资源的生命周期绑定到对象的生命周期上资源(如内存、文件句柄、锁、网络连接等)在对象构造时获取,在对象析构时自动释放。RAII 是 C++ 实现确定性资源管理、异常安全和零成本抽象的基石。
2026-06-03 19:07:51
397
原创 内存对齐原理
这张图在技术面试讲解或笔记中比模糊的截图更清晰、更专业。当指定了打包对齐数n时,所有成员的“有效对齐值”变为。作为AI,我无法直接生成图片文件,但我可以为你绘制一张。假设当前环境为64位系统,编译器默认对齐数为8。下,double的有效对齐值是2而不是8。:“有效对齐值”不是成员自身大小,而是。,而不是嵌套结构体本身的大小。嵌套结构体的有效对齐值 =内存对齐不是语言特性,而是。,整体对齐也受n限制。
2026-06-03 09:04:45
372
原创 UE之网络同步
epollIOCP性能监控接入热状态回调;动态分辨率/LOD降级;避免持续满载触发温控阈值这是一个非常精准的底层问题。但关键在于:UE 的网络同步,它是通过调用 OS Socket API 间接触发中断的。真正决定中断是否成为性能瓶颈的,是三者的耦合关系。
2026-10-24 10:16:00
299
原创 三、计算机网络
利用 NAT 对"已发起出站连接"的放行规则,通过一个公网协调服务器交换地址信息并同步打洞时机,使双方的 NAT 误以为入站包是对合法出站的回应,从而实现端到端直连。核心词不是"不用公网",而是"欺骗 NAT 的状态表"。
2026-08-12 06:12:07
310
原创 4、UE的GAS框架
UE 的 GAS 指的是 Gameplay Ability System(游戏玩法能力系统)。它是 Unreal Engine 中一套高度模块化、数据驱动的游戏逻辑框架,最初由 Epic Games 为《堡垒之夜》和《虚幻争霸》开发,后来集成到引擎中供所有开发者使用。
2026-08-05 16:02:55
188
原创 迷宫路径搜索问题:BFS与DFS算法详解
迷宫路径搜索是图论中的基础问题,BFS 和 DFS 都是有效的解决方法。BFS 更适合需要最短路径的场景,而 DFS 代码更简洁。在实际解题时,可以根据题目要求和数据规模选择合适的算法。
2026-07-05 11:10:59
240
原创 4、排序算法(C++)
冒泡排序的核心思想是比较相邻元素,如果顺序不对就交换,每一轮都会把一个最大的元素放到数组末尾,因此总共需要 n-1 轮。它的平均和最坏时间复杂度都是 O(n²),空间复杂度是 O(1),属于稳定排序。实际开发中由于效率较低,很少直接使用,C++ 的。冒泡排序的思想是不断比较相邻两个元素,如果前面的元素比后面大,就交换它们的位置。每完成一轮遍历,当前最大的元素都会被交换到数组末尾,就像气泡不断往上浮一样,所以叫冒泡排序。核心是计算字节数,int是4个字节,5个数就是20个字节。
2026-06-27 12:05:22
234
原创 SIMD指令集
建议这样回答:“SIMD是单指令多数据流的并行计算技术,通过宽寄存器一条指令处理多个数据。在游戏开发中,它主要用于加速数学密集型的热点函数,比如我项目中的AOI批量距离计算。但SIMD不是银弹,它要求数据连续对齐、避免分支,且需要考虑跨平台兼容性和尾部元素处理,必须配合Profile验证才有实际收益。
2026-06-25 21:55:07
350
原创 UEC++开发(游戏客户端)
显式在EndPlay中解绑委托是处理“短生命周期对象监听长生命周期对象事件”的黄金准则。即便 UE 的动态委托提供弱引用保护,主动清理能消除对象销毁顺序不确定性带来的隐患,确保系统稳定性。
2026-06-25 12:55:09
312
原创 UE5 C++(多线程编程)
这段代码的价值不在于“视线检测”这个具体功能,而在于它提供了一个UE C++多线程编程的安全脚手架。在射击游戏中,凡是涉及“批量、独立、CPU密集”的任务(弹道预测、AI寻路预处理、网络序列化、骨骼动画混合),都可以套用这个“主线程提数据 → 后台并行算 → 弱指针安全回传”的模式。这是一个可以直接集成到UE5 C++射击游戏项目中的生产级完整实现。相比之前的教学示例,它修复了UObject线程安全问题、物理查询安全性以及内存生命周期管理。
2026-06-21 16:54:02
510
原创 C++(防止数组下标越界)
范围for / STL算法 > std::array/vector + .at() > std::span > 原生数组+手动校验将"避免越界"视为设计决策而非事后补救:在项目初期就约定使用标准容器,比后期逐个修复越界 bug 成本低几个数量级。
2026-06-20 19:29:43
454
原创 UE5—游戏引擎开发
我在项目中实际遇到过两个性能瓶颈:一是透明物体排序的微卡顿,二是体积雾降噪的 GPU 开销。前者我用无分支三数取中解决了分支预测问题,后者我用排序网络+Shader min/max 消除了线程束分化。这两个经历让我深刻体会到,引擎底层的位运算技巧不是用来手写的玩具,而是指导我们在正确抽象层级做架构决策的思维模型。
2026-06-20 18:32:18
488
1
原创 2、数据结构与算法(C++)
红黑树是一种自平衡二叉搜索树。它在每个节点上增加了一个存储位来表示节点的颜色(红色或黑色),通过对任何一条从根到叶子的路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长出两倍,从而实现近似平衡。日常开发:直接使用std::map或std::set,无需关心底层红黑树的具体实现。性能需求:如果你需要有序的键值对或集合,且数据量较大,红黑树是实现的最佳选择之一。学习目的:理解红黑树有助于深入掌握 C++ STL 的机制以及平衡树算法。
2026-06-13 08:25:47
222
原创 和平精英开发
作用:控制引擎清理“待销毁对象队列”(Pending Kill Queue)的时间间隔。单位:秒(Seconds)。默认值:通常为60.0秒(不同 UE 版本略有差异)。机制:当你调用或将对象标记为时,对象并不会立即从内存中移除,而是进入一个等待队列。只有当距离上次清理的时间超过该变量设定值时,GC 才会在下一次 Tick 中真正执行 Purge 操作,释放这些对象的内存并重置引用。
2026-06-10 06:37:43
345
原创 计算机网络之——TCP/UDP协议
在射击游戏(FPS/TPS)开发中,TCP 和 UDP 的选择从来不是“二选一”,而是。大厂面试时,如果你只回答“射击游戏用UDP因为快”,会被认为缺乏工程深度。
2026-06-04 08:09:18
400
原创 Python——研发效能工具
AI 帮你写自动化工具时,高频调用的都是 Python 的内置标准库。看懂这几个,你就能指挥 AI 搬运资产、执行命令行。不管是调用虚幻引擎的编译命令行(RunUAT/UHT),还是调用 SteamCMD 上传包体,AI 绝对会用这个模块。当你有了这份基础概念后,这两天面试或者以后入职,遇到复杂的自动化需求,你只需要给 AI 喂这样的。AI 写脚本时,最喜欢用以下几种方式来存取数据(比如游戏资产路径、NPC 列表、打包配置)。捕获异常,并提取报错行前后的 5 行上下文。有序的集合,相当于 C++ 的。
2026-06-03 11:18:35
207
2
原创 C++ 内存
在面向对象编程中,类是创建对象的蓝图,而对象则是类的具体实例。每个对象都有自己的内存模型,用于存储其数据成员(属性)和指向其方法的指针。
2025-01-01 16:49:41
605
原创 C++内存泄漏检测
不过,你可以通过定义一个具有相同名称的新函数来实现类似的效果,这种技术通常被称为函数隐藏或函数替换。### 2. 使用包装函数创建一个新的函数来封装`malloc`,并在其中加入你想要的功能。3. 替换全局操作符new/delete对于C++对象,更推荐的方式是重载全局的`new`和`delete`操作符,这可以让你控制所有对象的内存分配与释放过程。这种方法简单直接,但会影响整个程序中的所有`malloc`调用。- 当覆盖默认的内存管理函数时,请确保你的实现是线程安全的,特别是当你在多线程环境中工作时。
2024-12-01 11:06:57
327
原创 游戏客户端开发——网络性能优化
以上代码示例展示了如何在网络游戏中进行数据压缩、使用UDP协议、发送心跳包、数据包合并以及异步IO操作。这些技术可以显著提高网络性能,提升玩家的体验。对于实时性要求高的游戏,使用UDP协议可以减少延迟。UDP是无连接的,不会保证数据包的顺序和完整性,但可以通过应用层实现必要的可靠性机制。在网络游戏中,网络性能优化是一个至关重要的环节,因为它直接影响到玩家的体验。以下是一些常见的网络性能优化技巧及其对应的C++代码示例。只发送必要的数据,避免发送冗余信息。例如,只发送玩家移动的方向和速度,而不是每帧的位置。
2024-11-21 18:09:51
1254
原创 UE5-----MenuSystem
如果菜单系统中包含了一个可见的角色,那么 AMenuSystemCharacter 可能负责管理这个角色的动画状态,例如闲置、选择动作或其他视觉反馈。:此类可能重写了输入处理函数,以便响应用户的键盘、鼠标或控制器输入,使用户能够在不同的菜单项之间导航。:它还可能包含了一些状态管理的功能,比如跟踪用户当前在哪个菜单页面,或者记录用户做出的选择等。:该类可能包含了与用户界面(UI)进行交互的逻辑,比如处理菜单选项的选择、游戏设置的调整等。要加*SessionName。
2024-11-11 16:41:33
534
原创 UE的两种网络架构
客户端-服务器架构,其中一个中央服务器处理所有玩家之间的通信和数据同步。这种架构更常见于大型在线游戏,因为它可以提供更好的控制、安全性和可扩展性。点对点网络,其中每个玩家的游戏客户端直接与其他玩家的游戏客户端通信。这种架构通常用于小型或中型规模的多人游戏。
2024-11-02 13:07:54
527
原创 Stm32单片机
通过上述代码和说明,你可以实现一个简单的智能机械键盘,能够检测按键按下并发送相应的键盘报告。process_key_event 函数创建一个键盘报告,并通过USB HID发送该报告。去抖动处理:在实际应用中,可能需要增加去抖动处理,以消除由于机械振动引起的误触发。如果检测到压力值超过阈值,调用 process_key_event 函数处理按键事件。MX_USB_DEVICE_Init 函数初始化USB设备,确保可以进行HID通信。在主循环中,遍历所有的行和列,读取每个按键的压力传感器值。
2024-09-23 16:06:19
1377
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅