自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 为什么说函数传递参数最好小于四个

有一个建议说时函数传递参数最好不超过四个,原因有一个是参数太多难以维护,另一个重要的原因就是函数传递小于四个参数时候效率会更高,其实这个说法也不全对其实那么下面将探究函数参数传递相关的问题。

2024-09-29 20:54:16 273

原创 从零简单实现一个线程安全的C++共享指针(shared_ptr)

shared_ptr主要是用来自动管理动态创建对象的销毁,记录对象被引用的次数,当引用计数清零的时候,把指向的内存区域自动释放掉。如果要手动实现一个共享指针的话就需要一个共享指针类,类中存着被指向的对象的指针。当对象被多个共享指针指向的时候,就需要一个共享的引用计数器counter。当都断的时候,引用计数器变为0,这时候清理对象A。当对象被共享指针指向的时候,引用计数器为2。当一个共享指针被释放后,引用计数器的值减1。

2024-03-23 12:18:19 1012

原创 在C++的union中使用std::string(非POD对象)的陷阱

union是C语言中的关键字,在嵌入式中比较常见,由于嵌入式内存比较稀缺,所以常用union用来节约空间,写一个简单程序来说明union的用途。将编译条件改为-std=c++11,编译通过,所以在后面可以在union中使用带构造方法的对象了;因为string不属于POD对象,有构造函数,所以在旧版中禁止了在union中使用非POD对象。union的三个变量公用一段内存,所以同时只能存储一个变量。由于内存对齐的原因,最后用了3*8 = 24字节。int占4位,double占8位,c占1位。

2024-02-06 18:48:31 1216 2

原创 游戏引擎的cpu/gpu粒子系统设计思想

网上有很多篇粒子系统源码解析,但是只是简单的接口罗列,没有从最原理出发去讲清楚粒子系统的来龙去脉,我将从粒子系统的本质去讲清楚它的设计理念,当理解了它的理念以后,很多粒子遇到的问题就会迎刃解决了,这篇文章主讲粒子的实现和一些框架级的优化方式,其实有很多优化细节就不赘述。简单说,就是几何着色器可以把单个顶点扩充成多个顶点,如果粒子的mesh都一样的话,只需要从顶点着色器中传入的单个顶点和扩展规则,就可以生成想渲染的粒子mesh,而并不需要每回传入大量的顶点了。这种情况试用语cpu对大量粒子计算和更新的情况。

2023-07-07 14:41:44 2793

原创 浅谈C++下观察者模式的实现

观察者模式中有一个称作“主题”的对象和若干个称作“观察者”的对象,“主题”和“观察者”间是一种一对多的依赖关系,当“主题”的状态发生变化时,所有“观察者”都得到通知。在许多设计中,经常涉及多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,也就是说当对象间存在一对多关系时,在这样的情况下就可以使用观察者模式。这时候猫作为被观察者,老鼠作为观察者,这时候执行“我来了”的事件,就不需要每次都修改执行的代码了,只需要在主函数中添加即可。

2023-07-06 17:06:27 860 1

原创 基于泰勒(Taylor)中值定理的低开销快速距离算法(Fast_Distance_2D)

最近看《3D游戏编程大师技巧(上篇)》的时候提到了一个重要的算法Fast_Distance_2D,旨在用低开销的方法去计算点和点的距离,这个算法在André LaMothe的代表作《Windows游戏编程大师技巧 (第2版)》中有着更详细的介绍,不过这种算法存在着不小的误差(2D版本的最大误差为3.5%,3D版本约为8%)完全可以用(x1-x2)的和(y1-y2)的平方和r的平方比较,而避免了开方操作,这就直接避免了开根计算。主要用到了泰勒/麦克劳林方程。

2023-06-21 14:30:11 289

原创 延迟渲染G-buffer所占显存带宽计算(解决移动端和抗锯齿的若干疑问)

延迟渲染需要在前面阶段,将计算的内容保留在N张G-buffer中,但是网上的文章只是提及了G-buffer应该压缩,并且尽量少用,没有说明G-buffer所占带宽应该是多少,我将在下面介绍G-buffer所占显存带宽的详细计算方法。

2023-06-16 13:17:36 1307

原创 深入理解侵入式容器与非侵入式容器(intrusive containers)

介绍了侵入式和非侵入式容器

2023-06-13 15:33:28 1363 4

原创 Gouraud Shading(高洛德着色法)和其优缺点详解

Gouraud是一种插值方法,Gouraud着色法是计算机图形学中的一种插值方法,可以为多边形网格表面生成连续的明暗变化。实际使用时,通常先计算三角形每个顶点的光照,再通过双线性插值计算三角形区域中其它像素的颜色。

2023-05-31 21:24:40 1681

原创 在unreal中的基于波叠加的波浪水面材质原理和制作

到现在的水体渲染已经从材质模拟到现在ue5的粒子模拟,可谓是进步十足,现在的主流水体渲染方案有几种,线性波形叠加方法,统计模型方法,波动粒子方法,基于物理的方法,预渲染方法等,各种五花八门的方法层出不穷,本文的方法主要是基于第一种方法。光线作用于法线的时候,物体的凹凸效果是通过XY的分量决定的,这里将RG(也就是法线向量的XY分量)提出来,乘一个系数Param,系数越大,波浪越明显。在同一介质中传递的两个波相遇时,重叠范围内会遵守波的叠加原理,当两波分开后,会维持各自原本的运动,称为波的独立性。

2023-04-11 13:46:59 1435 2

原创 兰伯特光照模型(Lambert Lighting)和半兰伯特光照模型(Half-Lanbert)

介绍兰伯特光照模型(Lambert Lighting)和半兰伯特光照模型(Half-Lanbert)

2023-04-07 11:28:12 1454

原创 从底层本质上解析java是值传值还是引用传值

关于java是值传值还是引用传值,在网上找了半天发现网上对于这个问题没有一个合理的解释,特地写了这篇文章,希望能给这个问题一个正确的解释这个问题设计语言层次的设计问题,所以我会列出从底向上的的所有结构,这个结构的合理性将不言自明。

2023-04-04 12:57:03 346

原创 利用CPU的分支预测(Branch Prediction)模型优化if-else

现代计算机和编译器的结构更加智能化,会想尽办法去把CPU所有部件全部利用起来,不想让CPU的任何区域出现空闲我前面的文章提到过simd优化,将CPU的数据位宽利用起来,CPU累加器在单个时钟周期里并行完成数据位宽/数据类型大小的计算,对32位操作系统而言,32位的宽度能放下4个float类型的数据,也就能一次完成一个四维向量的累加计算,大大利用了总线的宽度下面将介绍另一种能“压榨”计算机性能的优化手段。

2023-03-28 21:39:12 1084

原创 用两个程序说明为什么推荐使用内存池

内存池(Memory Pool)是一种内存分配方式,又被称为固定大小区块规划(fixed-size-blocks allocation)。通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能

2023-03-22 12:47:52 166

原创 C++11的explicit关键字

C++可以通过expliicit可以防止内置类型隐式转换。

2023-03-12 13:50:05 216

原创 哈希一致性算法(分布式服务器落点算法)

介绍了分布式服务器常用的哈希一致性算法

2023-03-02 11:57:10 312

原创 计算机图形学:详解法线与法线贴图原理

法线贴图 (Normal Map) 是一种凹凸贴图 (Bump Map)。它们是一种特殊的纹理,可让您将表面细节(如凹凸、凹槽和划痕)添加到模型,从而捕捉光线,就像由真实几何体表示一样

2023-02-06 11:31:59 4282

原创 在opengl中使用线段绘制一个圆

opengl使用线段绘制一个圆

2023-02-03 11:23:22 1823 2

原创 详解C++三种new的使用方法(在栈上用new生成对象)

new有三种使用方式:new operator,operator new()和placement new()

2023-02-01 11:28:34 1488

原创 从游戏存档角度理解序列化和反序列化

从游戏概念理解序列化和反序列化

2023-01-23 12:01:34 291

原创 关于编译器的自举实现(关于如何实现一门闭环语言)

关于编译器的自举实现(关于如何实现一门闭环语言)

2023-01-12 12:23:59 1042

原创 混合架构CPU下Visual Studio编译UE引擎时CPU吃不满的原因

可以发现在编译过程中,将CPU的四个能效核心吃满了,但是性能核心却基本没用着。由于CPU是i5-12600k,这个CPU有6性能核心和4个能效核心。在编译UE5引擎源码的时候发现CPU占用率不高。

2022-12-19 23:41:11 1679 1

原创 机器人逆向运动学(IK):问题分析

在游戏开发和机器人开发中进场需要用到的一个场景是,给机器人或者游戏角色末位置的位置和姿态,求解可到达给定位置和姿态的各关节的角度值,这里就需要逆向运动学去求解这个问题

2022-12-14 14:17:31 1112 1

原创 深度探究多线程的效率以及多线程的使用建议

随着时代发展,电脑的核心数慢慢增多,在开发程序的过程中,是否选择使用多线程这是个比较大的问题,下面我通过一个程序去深入理解多线程对程序速度的影响到底有多大

2022-11-18 17:03:53 850 2

原创 操作符=重载陷阱(赋值构造其实并没有执行赋值操作)

在对”=“执行操作符重载的时候,在main中=调用的时候并没有在操作符执行重载里面执行的输出语句

2022-11-10 18:06:18 211 3

原创 在构建 UE 项目时启用 AVX/SSE 优化

在构建 UE4 项目时启用 AVX/SSE 优化

2022-11-07 14:09:48 439

原创 计算机存储文字码的底层实现和JAVA选择UTF-16(谣传)存储char的原因

介绍了字符码在内存中的的存储方式

2022-11-05 12:00:36 651

原创 opengl教程之一:创建窗体

使用opengl创建窗体,对代码有着尽可能详细的解析

2022-10-11 17:46:37 825

原创 UE引擎开启DLSS(深度学习超级采样)

根据提供的几个版本去下载指定版本的压缩包(另外在上面也提供了Unity版本的压缩包)从下面的链接里面找到ureal版本的DLSS。解完压缩包后将其解压到插件目录下面去。首先打开·NVIDIA官方网站。开启插件,在设置里面打开。

2022-10-09 16:29:16 3830 1

原创 关于客户端和服务器的思考

现在如果花费在网络传输上的时间为0.5s,那么用C++写服务器处理时间可能花费0.03s,用java写服务器处理花费的时间可能在0.1s。现在如果花费在网络传输上的时间为0.5s,那么用C++写服务器处理时间可能花费1s,用java写服务器处理花费的时间可能在3s。后面硬件性能上去了,并且服务器出了分布式这一关键技术,服务器处理速度大大提高,甚至于花费的时间远远小于网络传输的时间。在几年前的时候,因为硬件性能确实不如现在强,服务器处理速度是瓶颈,阻止人们想看到想看到的信息的时间瓶颈在于服务器。

2022-10-07 22:34:18 303

原创 UE引擎通过代理几何体完成渲染优化

代理几何体工具的目标是帮助降低静态网格体及其相应材质和纹理运行时的渲染成本开销。代理几何体工具通过将多个静态网格体和它们对应的材质组合成一个带一组纹理和材质的静态网格体,从而实现这一点,这些纹理和材质仍然与原始静态网格体的形状和外观相匹配,但是三角形的数量减少了。如果质量上的差异是可以接受的,或者是不明显的,例如远离摄像机的结构,这种简化的结果可以作为原始几何体的代理。未使用代理几何体的效果。使用代理几何体的效果。

2022-10-07 22:11:59 507

原创 使用SIMD指令加速计算

SIMD即单指令多数据流(Single Instruction Multiple Data)指令集,是通过一条指令同时对多个数据进行运算的硬件加速技术,在传统计算,中使用标量运算一次只能对一对数据执行乘法操作,但是如果使用了SIMD加速,可同时对多对数据进行执行操作,最常见的有sse/avx等。在一些情况下,使用了流水线加速后可能计算速度会变得比原来更慢,原因在与现代编译器完成了大量优化工作,可能一些计算被编译器已经处理为了SIMD,所以会变得非常快。

2022-09-28 15:30:35 2219

原创 正交相机和透视相机的区别

计算机里面的正交相机和透视相机的区别

2022-09-27 14:46:05 2908

原创 计算机图形学:光线追踪原理(ray tracing)

大致介绍光线追踪原理

2022-08-05 11:16:54 1475

原创 C语言多线程编程之一

在C语言中可以使用pthread.h的API来创建线程,pthread.h符合POSIX标准,意味可以在Unix和Linux下运行,WindowsNT也提供了相应的支持。

2022-07-18 15:51:34 637

原创 从零开始写一个图像处理程序之五(手撕边缘检测终章)

前四篇的铺垫:从零开始写一个图像处理程序之一(BMP彩色图转灰度图)_星空_MAX的博客-CSDN博客从零开始写一个图像处理程序之二(提取灰度图通道)_星空_MAX的博客-CSDN博客从零开始写一个图像处理程序之三(卷积原理简介)_星空_MAX的博客-CSDN博客从零开始写一个图像处理程序之四(Prewitt 算子分析)_星空_MAX的博客-CSDN博客定义Prewitt算子(convolution kernel)简称CK:先定义Gx:边缘处理:由于经过一次卷积的话,图像会缩水一个像素,所以在原本的c

2022-07-07 19:23:31 775

原创 从零开始写一个图像处理程序之四(Prewitt 算子分析)

卷积核为什么能够得到图像信息呢先看Prewitt算子的结构 分别过滤出来横向边缘和纵向边缘:先模拟一个边缘图像,0代表白色,1代表黑色000000000000000000000000000000000011111111111111111111000000000000000000000000000000000000当Gx扫过去的时候,得到-3-3-3-3-3--3-3-3-3-3-3-30000000000000000000033333333333333333333可见边缘加强了,都从1变成3了如果横线为竖着

2022-07-07 15:32:17 748

原创 用C语言从零开始写一个图像处理程序之三(卷积原理简介)

卷积这个概念其实非常简单,先从一维卷积谈起,在信号采集的过程中会有噪音干扰,信号是会随着时间进行波动的比如说一条曲线(拿画图板画的): 要采集T点的数据的时候,要考虑旁边的权重,离中心点T越近,则权重越大,比如上图的三个点,T的权重为2,旁边的点离中心远一点,则权重低一些,那就设为1呗那么最简单的一个一维卷积核就产生了[1,2,1]键入上述图片是一个巨大的集合,那么可以写一个集合:[1,2,3,2,1,2]卷积核运动到T(2)的时候,就会产生 [1,2,1][1,2,3,2,1,2]上下数字一乘

2022-07-07 15:14:41 1484

原创 从零开始写一个图像处理程序之二(提取灰度图通道)

在上一篇文章主要讲解了如何将一张彩色图片处理为灰度图从零开始写一个图像处理程序(BMP彩色图转灰度图)_星空_MAX的博客-CSDN博客这次将讲如何将灰度图中的通道提取出来 依旧通过读出图像的长和宽上次处理的灰度图中由于每一个点存储的值变为了0-255的灰度值,所以每一的比特数据发生了改变定义int去存储cahnnel数据 注意,有可能会造成return 3221225477 (0xC0000005),即访问越界 由于C语言没有下标越界报错,造成return 3221225477 (0xC

2022-07-07 14:34:07 841

原创 C/C++ with return value 3221225477

3221225477 (0xC0000005): 访问越界,一般是读或写了野指针指向的内存。3221225725 (0xC00000FD): 堆栈溢出,一般是无穷递归造成的。3221225620 (0xC0000094): 除0错误,一般发生在整型数据除了0的时候。

2022-07-07 00:53:46 6076

空空如也

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

TA关注的人

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