抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Clustered Shading 《Clustered Deferred and Forward Shading》阅读笔记 Cluster:组,簇,一堆物体的群集,将一个个零散的小物体整合为一个Cluster,可以加速剔除 Cluster的思路跟TBS思路很像,也是将view进行切分,但是每一个Cluster拥有一个固定的三维边界(坐标和法线),于是解决了Tiles退化的问题 光照计算...

视锥剔除 《Optimized View Frustum Culling Algorithms for Bounding Boxes》阅读笔记 剔除的目的是减少要绘制不可见的物体,视锥剔除(View Frustum Culling,VFC)是使用一个平头四棱锥和场景中物体做可见性测试,实现快速剔除 为了加速视锥和场景物体的相交测试速度,我们会使用Bounding Volume(比如AA...

C++20下spdlog使用踩坑 spdlog是一个开源的被广泛使用的C++log系统,于是我模仿Piccolo引擎写了一个Log系统,结果由于C++不允许连续进行两次及以上的用户自定义的隐式构造,使得spdlog的log函数无法正确推断匹配Args...,最后在公司C++高手的帮助下成功解决了问题,于是在此记录一下踩坑历程 最初的版本 我参考开源项目的实现,使用spdlog写了一个简易的L...

glTF入门 glTF介绍 DCC生成的模型往往不能直接被渲染引擎使用,比如包含冗余数据、缺失场景数据、缺少动画状态机、压缩率不足等。许多引擎拥有一个Asset Pipeline,负责将不同DCC导出的各类数据转化为引擎可以直接使用的资源文件,比如UE的Cooking操作 glTF是一种表示3D场景的模型格式,它的目标就是尽可能保留3D场景相关的数据(使用json描述场景),为渲染引擎提供无...

无状态方法 线程安全 同事经常跟我强调线程安全的重要性,比如下面这段代码,id是一个静态成员变量,被所有Student类的对象共享,在多线程环境下可能会造成不确定行为 class Student{private: static int id = 0;public: int getId() { return id; }}int Student::i...

内存分配 最近看了一些关于内存分配的分享,发现操作系统相关的知识都忘光了,于是打算借助Linux内核的内存分配机制,简单复习一下内存分配相关的理论知识 程序运行时不断进行内存的申请与释放,高效的分配方式不仅能提高内存的利用率,还能提高性能。 Linux内存分配原理 地址 程序需要装入内存才能运行,程序开始的位置相较于内存0地址会有一段偏移,这个偏移被称为物理地址。 在程序内部,以程序开头...

C++函数调用 C++支持两种函数调用方式,__stdcall和__cdecl,两者对栈帧(stack frame)的处理方式不同,__stdcall是由被调用函数来清理栈帧,__cdecl是由调用函数来清理栈帧。一旦混用,容易引发错误 两者混用可能会导致栈帧没有被释放或者被连续释放两次 stack frame 栈帧用于维护函数调用的上下文信息,在函数调用时,会在栈上分配一块内存,用于存...

文明6like 4X游戏 文明6是一个经典的历史类4x游戏 explore(探索) expand(扩张) exploit(开发) exterminate(消灭) 文明6的体验 游戏体验 最近玩了几百小时的文明六,感觉意犹未尽,却又索然无味,想抽掉一些内容,自己做一个简易版的文明6,个人希望加强塔防、改良、贸易等元素,减少兵种操作、城市铺设。 我玩文明6,最让人兴奋的就是地块高额的产出(尤...

Git 使用记录 记录一下平时使用Git的记录 为什么使用Git 程序开发的第一步,就是做版本管理。频繁提交,可以便于环境恢复和Bug查找。分支开发,也能便于合作与多设备协同。配置Review规范,你还可以知道你的合作者在干什么,有效避免了因为开发者习惯能力差异导致的项目丑陋。配合CI的编译预检查,还能提高代码的稳健性。总之版本管理十分重要。 版本管理工具有很多,游戏开发由于拥有大量会频...

Unity ECS 入门 曾经待的项目使用了Unity ECS 0.5,那时候功能很不完善,几乎所有功能都从头写了一遍。现在Unity ECS 1.0发布了,有点失望。看了一圈感觉系统复杂性提高了很多,而且不能保证系统的稳定性(尤其是有错的代码编译),非常不适合独立游戏制作 数据驱动 ECS的本质就是数据驱动的编程,随着守望先锋的爆火进入大家视野,结果现在守望2都凉了,Unity才把ECS...