20250714-C++多线程
Mutex 线程锁避免C++多线程对同一数据写入和读取,产生的错误 1. 锁 std::mutex1.创建std::mutex mtx 对象 用mtx.lock()上锁 mtx.unlock() 解锁 12345678910111213141516171819202122232425262728#include <iostream>#include <thread>#include <vector>#include <mutex>#include <chrono>#include <stdexcept>int counter = 0;std::mutex mtx; // 保护countervoid increase(int time) { for (int i = 0; i < time; i++) { mtx.lock(); // 当前线程休眠1毫秒 ...
20250714-线程池和jobSystem
C++ 最小线程池实现下面是一个简洁易懂的 C++11 线程池最小实现示例,并附详细注释: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include <vector> // 用于存储线程对象#include <queue> // 任务队列#include <thread> // std::thread#include <mutex> // std::mutex#include <condition_variable> // 条件变量用于线程同步#include <functional> // std::function 封装任务#include <future> ...
20250711-Aura-UE5_GAS
Gas 1 .Player state class2.Ability System Componet3.AttributSet Aura.Build.cs 添加 “GameplayAbilities” “GaemplayTags” “GameplayTasks” 3.Attribut Set: C++ class AuraAbilitySystemComponent class AuraAttributeSet class
20250708-渲染管线
渲染管线 1. ApplicationCPU计算出需要显示的顶点,以及这些顶点的属性(颜色、法向量、纹理坐标等)。 材质属性,光源属性,Uniform变量。 DrawCall提交准备阶段。 2. Geometry Processing1. 顶点着色器 顶点变换:顶点从World、View、Clip Space转换。 GPU蒙皮。 UV计算。 顶点光照。 2. 曲面细分,几何着色(可选)3. Rasterization1. 屏幕映射 齐次除法,归一化设备坐标。 视口变换将投影变换得到的坐标XYZ[-1,-1,-1] -> [1,1,1] 映射到屏幕XY[0,0] -> [1,1],Z 0->1(OpenGL为-1到1)。 2. 背面剔除3. 光栅化 将连续的3D物体转化为离散的屏幕像素过程。 三角形组装,三角形遍历。 确定图元覆盖的片段,顶点插值。 4. Pixel Processing1. 片段Shader 逐像素操作。 光照计算。 Alpha测试。 Discard Clip。 2....
20250708-C++lamda
C++ Lambda 表达式是 C++11 引入的一个强大功能,允许你定义内联的匿名函数对象(也称为“Lambda 表达式”),使得代码更加简洁、灵活和易于维护。Lambda 表达式可以用在许多场景中,尤其是当你需要传递一个小的匿名函数到标准库算法或其他函数时。 1. 基本语法Lambda 表达式的基本语法如下: 1[捕获列表](参数列表) -> 返回类型 { 函数体 } 各部分说明: 捕获列表:决定 Lambda 函数是否可以访问外部作用域的变量,及如何访问它们(值捕获、引用捕获等)。 参数列表:定义 Lambda 函数的参数,就像普通的函数一样。 返回类型:指定 Lambda 表达式返回值的类型,如果省略,编译器会自动推导。 函数体:Lambda 函数的实现部分。 2. 示例代码2.1 简单的 Lambda 表达式12345678910111213#include <iostream>int main() { // 定义一个简单的 Lambda 表达式 auto greet = []() { ...
20250708-抽卡概率实现
1.题目:C++使用srand(seed)实现一个抽卡概率1.题目描述实现一个抽卡逻辑。传入的是一个数组,数组的每一位的索引代表这个卡的类型,数字代表这个卡的概率,举例,如果[1,1,1] 数组,就代表0,1,2 三种卡的,抽中的概率分别是30% ,30% ,30%。 2.基础知识1.srand()和 rand()srand() 函数用于设置随机数种子,rand() 函数用于生成随机数。srand() 函数需要传入一个种子,种子不同,生成的随机数也不同。如果这个种子是固定的话,则生成的随机数也会是固定的。所以我们需要使用时间作为种子,这样每次运行程序的时间都不同,生成的随机数也不同。srand(time(0)) 2.概率计算:累积概率法实现概率计算:假设我们有 3 个卡片,概率分别为 30%、40%、30%,对应输入(3,4,3)。累积概率:卡片 0:30% ,权重3卡片 1:40% ,权重4卡片 2:30% ,权重3 如何实现卡片对应的概率:如果随机数在 1 到 3,抽中卡片 0。如果随机数在 4 到 7,抽中卡片 1。如果随机数在 8 到 10,抽中卡片...
20250706-C++常用函数类型
1.实现C++ string 类1.C++ 中动态内存管理2.深拷贝和浅拷贝3.预算符重载4.移动语义,右值引用5.智能指针1.实现C++ string 类 https://cloud.tencent.com/developer/article/2456266 12345678910111213141516171819202122232425262728293031323334353637383940414243namespace W{Class String{public: size_t capcity; char* _str; size_t _size; //构造函数 String(const char* str = ""){ _size = strlen(str);// capcity = _size; _str = new char[_size+1];//多开一个空间,用来存放'\0' ...
20250701-Aura UE5 leraning
1 .Create project项目设置 2.类AuraCharacter.cppTObjectptr:UE5新增的指针,相比原先的UObject* 实现GC,序列化c++ 类AuraCharacterBase 锁有Character的基类,创建了一个Wepon的骨骼网格组件,同时声明了Weapon 挂接点 AuraCharacter Class 主角类AuraEnemy class 敌人类的父类,继承与AuraCharacter 蓝图 BP_Aura_CharacterABP_Aura_Character ABP_Enemy 敌人动画蓝图模板基类,不需要指定骨骼。不同敌人复用里面的动画播放速度计算逻辑ABP_Goblin_SlingShot 设置指定敌人持有SlingShot的动画ABP_Goblin_Spear ...
20250616-C++学习
内存池1.避免内存的分配开销,和内存碎片 示例: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110#include "iostream"#include <cstddef>#include <string>template<typename T,size_t PoolSize>class ObjectPool { //Slot结构体表示对象池中的一个槽 struct Slot { alignas(alignof(T)) char data[sizeof(T)]; // 存储对象的内存 ...
2025-06-14-C++游戏中智能指针应用
智能指针是什么?智能指针对已有C++指针的封装,方便内存管理,一个有三种智能指针,但是使用中主要分为两种场景:1.unique_ptr 的独占所有权特性,无法复制只能移动move()2.shared_ptr 和weak_ptr共同使用.shared_ptr的引用计数机制,多个指针共享同一资源。weak_ptr 的弱引用特性,不增加引用计数,通过 lock ()...