自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 实现图形算法API[软光栅渲染器,C++]

我们这边和opengl一样,是通过变量名表意字符串进行索引的,大概思路和vertexbuffer差不多,一个push数据的方法,一个采样数据的方法,其外有两个不同的方法,一个是修改数据的方法,因为vertexbuffer中的数据一般都不会被修改,所以就没提供这个方法,但是uniform不一样,里面的数据是会被经常修改的所以提供了一个修改数据的方法;只暴露了两个方法,一个push数据,一个采样数据,push数据的方法模仿了opengl,给定对应的布局下标以及数据内存的大小和数据指针,然后将数据拷贝;

2023-05-21 10:25:27 937 2

原创 Log库和配置系统结构

主要是实现这两个函数,ListAllMember呢,是将root node中的所有节点都加入到一个list中,而且名字也有讲究,ConfigVar的name就root node展开的树中对应该ConfigVar节点的路径,路径名字的格式已经在代码中给出了,根据这个名字我们可以给每个ConfigVar设置数据;然后是ConfigVar了,这个类的话,是一个模板,存储不同类型的信息,对应不同的配置需要,比如存储一个vector或者map。LogFormat:存储格式信息,并根据LogEvent生成信息。

2023-04-09 18:14:56 560

原创 游戏引擎开发总结:节点编辑器实现思路

所有节点都继承至一个类Access,所有的节点都没BP_Node持有,节点相对于BP_Node称之为define。Access定义了一些必要的虚函数,,BP_Node是一个适配器,将具体节点与编辑程序隔离开,让编辑程序以统一的方式对待所有节点;

2023-04-03 21:17:04 619

原创 游戏引擎开发总结:权限系统、本地脚本系统

这种功能呢,是不适合作为脚本的,所以,我们就需要一个将这种功能组件系统相隔离,而且这种功能需要能进入脚本系统,即需要将这种功能抽象为一个唯一的组件,我们称这种功能为脚本,这个组件可以链接不同的脚本,这个组件我们称之为NativeScriptComponent。

2023-03-12 12:11:40 324

原创 游戏引擎开发总结:序列化系统

另外反序列话有点不同,序列话是类的数据流向文件,我们是知道组件类型的,但是反序列化是数据从文件流向组件,我们是不知道类类型,如果要调用成员函数的话,会比较复杂,所以我这边是用类静态成员,输入是Carrier和数据节点;到此为止,我们已经有两张表了,一张是运行时可动态增删的表,里面存储着每一个Carrier持有的可序列化组件指针,另外一张表是运行时确定的表,里面存储着每一个组件的反序列化函数;这边为什么是个模板,这个是另外一个组件依赖的系统,我称之为权限系统,作用是规范代码,这里不做介绍;

2023-03-11 19:03:48 378

原创 计算机图形学:liang算法和Cyrus-Beck算法

最后我还有一个发现,但应该也被人发现过,那就是P1P2与四条边界的交点为q1,q2,q3,q4的话,在P1P2与矩形有交集的前提下,对这六个点的x坐标[y坐标也行]进行排序,那么第3、4个点就是需要显示的线段的端点。这很容易理解,点积>0时就可能中内部嘛,这就限定了t[直线参数]的一个范围,每个这样的边限定的范围的交集就是t的范围;也是确定了上限组和下限组,这张图还好,起码给了上下限组的概念,有的书是完全不给这个概念的;其实上限组顾名思义,其中的线段给出的限定,可以确定t的一个上限,下限组也顾名思义;

2023-02-26 17:27:43 903 2

原创 杂谈ECS系统

well,最近写游戏引擎的时候,学到一个特别强的架构,ECS系统,其为DOP编程,不同于OOP编程,ECS系统中一个对象的本质是一个ID...right可以是一个unsigned int,嗯...其整个编程的模式是设计模式中的组合优于继承的极端,其一个对象都是由组件组成的[此对象不是OOP概念中的对象],那么一个对象本身不需要存储数据,只需要一个ID,通过这个ID将系统获取系统中的组件,其可以运行时插入和玻璃一个对象中的组件;...有点恐怖小说的味道了,不难发现,这是用了magic;

2023-02-07 22:51:50 591

原创 C++:实现从基类指针中获取子类的成员

看见标题...可能会觉得很简单...不就是一个static_cast嘛!但是如果我不通过子类的类型呢?那么static_cast就失效了;

2023-01-29 23:15:07 1061 1

原创 Litchi:同时渲染半透明和不透明模型

今天写Litchi的时候遇到了一个bug,简单来说就是半透明模型把另外一个半透明模型给遮蔽了。然后上网查了一下,找到了原因,是因为开启了深度测试。但这里还有一个问题,有的模型既有透明片段也有不透明片段,这该如何解决?然后找到了一个解决方案即:在渲染半透明模型时,开启深度测试,但不开启深度写入,渲染不透明模型时同时开启深度测试和深度写入;这两者在深度测试上是两个极端,前者中,深度测试没有意义,后者中深度测试是具体意义的;深度测试时直接将把遮挡的半透明模型的片段给丢弃了,然后在混合阶段就没有目标片段了;

2023-01-23 12:54:50 167

原创 Debug:一种奇葩的导致无法解析的外部符号的bug

今天想开个ImGui的入门项目,但是忘了glfw库是32位的,但我的环境是x64....不能用32位...所以就导致了bug,换一下环境到x86或者用64位的库。

2023-01-11 22:59:42 228

原创 C++:用宏实现信号广播功能

说白了就设计模式中的观察者模式,将不同的需要通知的函数抽象,最后放到一个类中,当要发送信号到调用这个类的播放功能,当然,要将对应的参数传递进去,然后通过存储的函数指针发送给需要通知的对象;之前在学QT的时候,印象最最深刻的就是信号广播功能,这个功能在Ue4中也有;实现信号功能可能有很多方法,这个方法是模仿ue4中的源码的;最后的功能呢,就是将发送信号的对象和接受信号的对象解耦。直接上代码,结构很简单,有大概思路,以后会做优化;就是利用宏来生成一个类;

2023-01-10 19:43:15 335

原创 Litchi 处理不同平台的按键

这样效率虽然是最高的,但是会有缺陷,在序列化的时候就会受到影响,Window平台的数据加入需要想Mac平台进行,这时由于数据中的按键码不同,所以不同平台之间交互可能会有问题。我们可以创建一个独属于自己程序的按键码,并写上自己的按键码转到不同平台的一个函数,这样的话就可以将依赖转到转码函数上了,而不是特定的平台,我们只要处理好了转码函数就行了;因为不同的库之间的按键码是不同的,如果自己写的重新需要与不同的库进行依赖与按键码的交互,那么就难免需要按键码的转换。2:创建一个转码函数。

2023-01-10 12:04:39 99

原创 Opengl: 一个非常操蛋的bug[glGetUniformLocation()]

举个例子,在vertex shader中声明两个变量,一个uniform ,一个out,out变量传入fragment shader,uniform不参与vertex shader的输出,中fragment shader中对应的in变量不参与fragment shader的输出,这个时候会优化掉vertex shader中的uniform变量。有的博客是说一个uniform变量没有被使用时将会被优化掉,这个时候cpu上是获取不了gpu上的buffer Location;

2023-01-07 17:12:00 264

原创 Opengl:设计处理Error的宏

_FILE__ 当前文件绝对位置的宏,类型为const char*__debugbreak();__LINE__ 当前代码行的宏,类型为int。

2022-12-29 19:37:38 133

原创 Debug error C1854: 无法覆盖在创建对象文件.obj的预编译头过程中形成的信息

1:将pch.cpp文件预编译头改为创建。2:其他.cpp文件改为使用。

2022-12-26 12:57:13 245

原创 c++ 用std::function包装类的非静态成员

利用std::bind();std::bind()类似函数之间的适配器,可以将封装不同的,但是可转换的函数指针的function转换;这里我们不探讨在函数适配上的功能;这里简单说一下std::bind的特性:1:返回值可以直接转换为std::function2:当适配器对接的两个参数之间有转换机制时,可以通过3:映射时允许出现非满射的情况,及适配函数有一个参数,但是被适配函数中有两个参数。

2022-12-25 21:17:55 203

原创 glfwCreateWindow return nullptr[glfw创建窗口失败]

可以推断,是glfw没有初始化,我们只需要在Create窗口之前掉用glfwInit()即可;发现是glfw.initialized变量为false;

2022-12-24 22:12:54 539

原创 pre compile header

打个比方:c++标准库,当我们在项目中调用一个c++标准库的时候,这个库一般是只读的,所以我们没必要每次编译项目的时候都recompile c++标准库;首先,在项目下创建pch.h和pch.cpp文件[vs2017默认是stdafx.h/cpp];这样,pch.h文件就只会编译一次,直到pch.h依赖的文件被改动;接着如果在项目中的其他.cpp文件中include pch.h文件;接着我们pch.cpp文件中include pch.h文件;如上设置,设置好预编译文件和是否使用预编译文件;

2022-12-22 19:29:34 633

原创 解决Git访问慢【Clone、Submodule】

在C:\Windows\System32\drivers\etc。然后试试在终端中试试ping github.com。

2022-12-08 18:18:23 344

原创 URadialForceComponent

#include"PhysicsEngine/RadialForceComponent.h"源码分析:对于FireImpulse大概可以理解为先判断组件拥有者是否受力,然后按照半径,获取半径内的Actor【这个要碰撞类型符合】,然后按照给定的设置【比如是否考虑物理】,最后受力

2022-12-07 19:14:41 284

原创 IgnoreActorWhenMoving

这个是定义在UPrimitiveComponent类中的一个函数,意思是在移动中忽略指定Actor,即不与其发生碰撞和Overlap事件;比如一个Actor[A]内部生成一个另外一个Actor[B],且不希望两者发生碰撞,则我们可以将A设置为B的instigator,然后通过B->GetInstigagtor方法获取AB的GetInstigator是通过A生成B之前将A传递给FActorSpawnParameters实例来实现的

2022-12-07 16:02:46 270

原创 OnComponentBeginOverlap

这个函数的出发时刻为:指定组件与另外一个碰撞体产生Overlap事件时处罚我们可以将另外一个函数绑定到指定组件的OnComponentBeginOverlap触发绑定,借此可以做文章;

2022-12-06 21:34:14 822

原创 TimeLine

现在只知道一种用法:将数据的变化绑定到一段时间上,我们可以在时间推进的任意一个时刻,来获取这个时间点的数据并进行输出 左上角F+的添加一个数据绑定到时间段上,我们可以编辑右边的坐标系,来编辑数据与时间段的绑定关系

2022-12-06 17:44:23 97

原创 GetWorldTimerManager()->SetTimer()

延迟一个函数的触发Para1:FTimeHandle:获取句柄,及执行的控制权Para2:调用者指针Para3:调用者的成员函数Para4:延迟时间长度

2022-12-06 11:07:48 293 1

原创 The following modules are missing or built with a different engine version”错误

原因是代码错误,编译器不能正常编译,进入sln,然后解决报错即可

2022-12-04 21:30:17 2295

原创 Qt学习笔记:Demo1[练习属性和信号和槽机制]

: 这边我设置了一个property为age,当我们setage的时候,会处罚一个信号,这个信号我设置与testApp的一个onAgeChange相连接,其会在text上显示最新的消息,这样的好处是将改变Age的代码与接受信号的代码相隔离,减少了耦合;-:还有一个就是showClassInformat里面的循环部分,其中QMateObject并不是继承自QObject的,我们要调用其mateobject函数还获取,换句话说,QObject是持有QMateObject的;-:对属性的书写更加熟悉。

2022-11-27 17:08:36 276

原创 Qt:信号与槽机制

说实话,Qt给我的感觉像一种魔改版c++,不纯粹,看不到内部的源代码,也不知道一些宏是怎么实现的...

2022-11-26 19:46:52 588

原创 Qt:debug日志—关于继承QObject类的无法解析符号

知道对应的头文件的属性页,将项类型改为自定义生成工具即可。然后就可以在文件下面知道moc_XXX.cpp文件了。

2022-11-26 18:14:50 510 1

原创 QT:debug日志—打不开头文件以及qDebug和Q_CLASSINFO的使用

这个是因为链接器在给定路径上搜索不到对应的头文件,而大多数的Qt相关的头文件都集中在一个include文件夹里:我电脑上的路径是:C:\Qt\Qt5.9.7\5.9.7\msvc2017_64\include然后我们在项目设置里: 注意,这边要加上\*,因为include里的文件才是我们想要的: 我们可以看到qDebug其实是一个函数的宏,我们会发现,这个函数是返回了一个QDebug类: 我们继续跟踪这个类: 发现这个类里面有一个内部类为Stream,大概作用应该是对接到C++的标准流上面,在上面做一些处理

2022-11-26 11:58:11 1731

原创 java报告:小不点超市售货系统类图设计

由于不是我自己的作业

2022-11-20 16:04:15 481

原创 C++ 多线程 线程安全关联性map设计

2:当一个线程结束访问哈希表是,进入exit函数,判断是否能哈希表是否能进行访问,如果不能,则说明哈希表正在等待扩张,这再判断此刻是否已经没有线程对哈希表进行访问,如果是的话,则唤醒哈希表,进行扩张;但是要注意,当我们的哈希表扩张时,要保证此刻哈希表没有线程进行访问,且要保证在进行扩展的这段时间,线程能够进行访问的,为此我利用了两个环境变量和两个原子对象来控制这个流程,下面简单描述一下逻辑;:效率底下,每次访问树都需要经过根节点,这说明我们要拿一个互斥量来保护根节点,这很不好,因为访问根节点的次数太多了;

2022-11-19 21:34:49 1688 1

原创 C++ 多线程 线程安全队列设计

这是看《C++并发编程实战》这本书学的,这里我要为这本书辟谣一下,虽然是这本书前面翻译得很烂,但是从第6章开始,应该是换了个人翻译,虽然还是能难懂,但是难懂的是代码逻辑,而不是语言逻辑;实现,我先说明一下我自己的一个感悟,即对大多数线程错误的感悟:1:我设定一个“信息有效期”这个概念,这个概念是值我从一个信息源获取一个信息,这个信息相对这个信息源是正确的时间段,比如一个线程获取一个队列是否为空,如果得到的结果是true,那么从获取这个信息到队列中添加一个元素这段时间就是获取到的信息的有效期;

2022-11-19 11:53:42 1657

原创 C++ 异常处理 重新throw变量时的事件

直接说结论:throw的表达式创建出来的变量会被拷贝下来【通过拷贝构造函数,后面会证实这一点,且是放在堆里的】,然后沿着调用路径去搜索最近匹配异常的catch语句,在沿途,传递给catch语句的是堆中的异常变量的拷贝;我们知道,c++的存储空间可以分为栈空间和堆空间,当我们的能在不同函数之间安全传递的变量只能是堆空间上的变量,所以我们也有充分的理由信息,这个变量是在堆上的;可以看到,虽然我们在g中修改了x,但是并没有影响到main中的异常,所以上一级的环境并不是拷贝下一级环境的异常;

2022-11-18 17:50:45 707

原创 std::atomic<>

这个输出结果并不是1e7,而是一个随机值,其原因上面已经描述了;当然,为了保证这个工程的准确性,我可以用一个锁来完成,但每次要显示的调用锁,这很麻烦,也不是我们希望做的,我希望有一个将锁与临界区这些晦涩的概念与我隔离的抽象,c++有所回应;在c++在标准库中添加了atomic库,里面提供了一些工具可以做到我所说的期望;

2022-11-12 10:54:28 1156

原创 Java学习笔记:异常处理

我们不必拘泥与java库中的异常,我们可以自定义匹配我们程序的一个异常,只要我们实现对应的接口,我们就可以像使用库中的异常那样使用我们自己自定义的异常了;在上面的代码中,我们就实现了对应的Exception接口,该接口是所有exception类的父类,其实现了Throwable接口;}}}这边当我们new出一个myException的的时候我们就可以输入错误信息了,当我们想要知道知道错误信息是什么的时候就可以知道是啥了;

2022-11-08 21:10:52 309

原创 Java 程序设计报告[对接java的迭代器接口]

因为deque和stack都可以用list来实现相应的需求,所以我们考虑用接口来封装list,使之完成对应的需求,在java的标准库容器中,这样的设计也是非常常见的,对于map这种关联性的容器,我们可以封装平衡树和hash表来实现对应的需求,而且我们可以根据程序环境的不同来更改底层实现,可以拥有更好的灵活性;-:观察到队列、栈都可以用链表进行模拟,故在设计一个链表为底层类,设计队列的接口和栈的接口,并且链表继承这两个接口,从而实现写一次代码多次使用。-:采用继承与内部类来提高程序的拓展性、安全性、简洁性。

2022-11-02 15:28:06 340

原创 condition_variable.wait()的第二个参数-Predicate

这个很简单,就是传递一个可执行对象,然后这个对象有一个返回值,当线程被wake时,调用可执行对象,并接受其返回值,如果为false,则继续wait。

2022-10-31 19:47:36 269

原创 C++ std::unique_lock,以及处理锁

实现std::lock_guard能干的活,std::unique_lock都能干,且std::unique_lock的灵活性是比std::lock_guard高的;-:因为std::unique_lock重载了lock和unlock方法,它可以作为std::lock的参数;

2022-10-29 14:59:14 2571

原创 C++ hierarchical_mutex 的实现

this_thread_hierarchical变量[HTH]和每个实例都有的previous[P],hierarchical_value[HV];这个类的最大且唯一的作用呢,是规定锁的顺序,《c++并发编程实战》这本书中给了一个避免死锁的建议,那就是用规定的顺序来将多个锁进行上锁,这样就可以避免顺序带来的死锁问题;线程中lock一个锁,HTH就会被赋值为该锁的HV,然后下次上锁的时候就只能给比HTH小的HV锁上锁了,否则就会throw error;

2022-10-29 11:16:06 373

原创 C++ 多线程 线程池的实现

【代码】C++ 多线程 线程池的实现。

2022-10-28 18:47:26 404

空空如也

空空如也

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

TA关注的人

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