- 博客(563)
- 资源 (119)
- 收藏
- 关注
原创 游戏引擎学习第198天
我们现在已经进入了调试代码的部分。从当前结构来看,我们使用了变量组来管理调试变量,而每个调试变量实际上保存着要编辑的数据。这些调试变量在当前实现中是直接存储数据的,问题在于这种结构让我们很难将一个调试变量放在多个地方进行引用。理想的做法是通过某种方式间接引用这些变量。我们希望每个调试变量能够在多个地方同时被引用,而不必重复存储其数据。为了实现这一点,我们只需要引入一个间接引用的列表。这种结构我们之前讨论过,但在游戏开发中并不常见,因为链表这种结构在游戏中并不像在编辑器或类似的应用程序中那样常见。
2025-04-01 23:26:26
515
原创 游戏引擎学习第197天
我们可以让分析器在指定的框内进行绘制,因此我们需要明确边界的定义。首先,我们不想沿用已有的边界构造方式,而是希望直接使用一个概念,即确定起始位置,这个位置默认是基准线。然而,由于基准线的存在,我们可能需要进行一定的偏移。当前状态下,这个位置作为左上角点是合理的,但由于基准线的关系,我们可能需要根据下降高度(descender height)进行调整。接下来,我们需要定义最小角(min corner)和最大角(max corner)。最小角的位置已经确定,而最大角应该对应屏幕的右边缘。
2025-04-01 14:36:10
506
原创 游戏引擎学习第196天
在继续开发调试界面时,接下来会进一步改进操作系统的结构。首先,目标是引入“操作发生的位置”和“操作本身”这两个概念,从而可以对浮动变量或其他交互元素进行操作。在实现过程中,将保持之前的方法:假设函数会提供一个信息,该信息指出当前鼠标悬停的位置。虽然这不一定每次都使用,但它是一个重要的信息。当前,代码中已经有了一个(热点变量),它会通过被设置。在这里,当检测到鼠标点击时,就会对进行相应的操作。接下来,目标是将系统从单纯的热点变量扩展到包括互动变量。和,这两个变量将成为UI系统的基础。由。
2025-03-31 22:57:35
759
原创 游戏引擎学习第195天
如果调试变量的头文件出现问题,是否可以轻松检查调试变量是否未定义,并为其设置默认值呢?答案是可以的,但需要注意的是,这样的做法可能会显得有些不太完善或“杂乱”。虽然能够通过检查变量是否未定义并设置默认值来处理这种情况,但这种方法可能并不是最理想的,可能还需要进一步改进处理方式。考虑到这种方法可能不够优雅,开发者觉得可能需要采取其他的解决方案。具体的解决方案还没有明确,但目标是找到一个更可靠、更清晰的方式来处理这个问题。
2025-03-31 17:11:53
536
原创 游戏引擎学习第194天
讨论了在使用printf时的问题,发现可能无法使用printf,而是可以使用带有下划线的版本,比如_printf。但这似乎并没有对其他人有太大帮助,所以决定暂时不解决这个问题,表示可能会在下周再处理这个问题,因为这并不需要太多的工作。
2025-03-30 18:49:21
1093
原创 游戏引擎学习第193天
为了方便定义所有调试变量,可以使用宏来简化这个过程。可以定义一个类似于“#define”这样的宏,它的作用是创建一个调试变量列表,并为每个调试变量指定名称和对应的值。通过使用这个宏,能够快速地将调试变量添加到列表中。例如,可以创建一个宏,在每次调用时,只需要传递变量的名称,就可以自动处理该变量的名称和对应值。这个宏会将变量名称转化为字符串,并且能够获取到变量的实际值。实现这个过程的关键是通过宏将调试变量名称和其值硬编码进去,这样每次变量的值变化时,可以直接获取并更新对应的输出。
2025-03-30 11:50:48
853
原创 游戏引擎学习第192天
是执行系统命令时最合适的函数。更适用于打开文件,而不是执行命令行指令。在使用时,必须正确设置和结构体。使用等待进程结束,确保执行完成。
2025-03-29 19:52:11
1852
原创 游戏引擎学习第191天
为了使文本处理更灵活,决定在代码中引入一个“文本操作”机制。在此机制中,首先定义一个,用于指定操作的类型,如“绘制文本”或“获取文本尺寸”等。这样,可以将操作作为参数传入,从而动态决定对文本的处理方式。具体来说,可以引入一个类似的函数,它接受一个操作类型参数以及其他必要的参数,然后根据传入的操作类型执行相应的逻辑。例如,若操作类型为“绘制文本”,则执行文本的绘制操作;若操作类型为“获取文本尺寸”,则执行获取文本尺寸的逻辑。
2025-03-29 13:38:45
1014
原创 游戏引擎学习第190天
在调试图表中,洋红色的尖峰可能出现得非常快,以至于无法及时点击查看,因此我们需要有效的方法来捕捉这些瞬时事件。1. 逐帧查看调试数据具有逐帧回溯(Step Frame)的功能将会很有用,这样我们可以手动检查每一帧,捕捉异常情况。这样可以确保我们不会错过那些发生得极快的尖峰,即使它们在屏幕上仅短暂出现。2. 调试文本的优化另一种方法是让调试文本停留在我们最后悬停的重复项上,这样即使尖峰消失,我们仍然可以看到对应的数据。这样可以减少因数据更新过快而导致的阅读困难,使我们有足够的时间分析异常情况。
2025-03-29 10:23:08
1219
原创 游戏引擎学习第189天
现在,在处理调试记录时,可以通过遍历事件数组的索引来优化。具体做法是,我们可以记住上一个处理过的事件索引,并从那个位置开始,而不是从无效的数组索引加一的位置开始。这样,在重启时,我们只需记住上次处理的索引,并从那个位置开始继续。这样可以减少不必要的处理时间。在重启时,我们可以通过存储无效事件的数组索引,并在下次开始时从下一个有效的索引处继续。通过这样的方式,避免了每次都从头开始处理,并通过使用while循环来简化流程。
2025-03-28 20:03:40
996
原创 游戏引擎学习第188天
为了实现鼠标按钮控制调试暂停功能,计划在平台层(Platform Layer)中添加一个鼠标按钮枚举类型,并使用这些枚举来检测鼠标按钮的按下事件,进而切换暂停状态。通过在平台层定义鼠标按钮枚举,并使用这些枚举来检测鼠标按钮的按下事件,能够更清晰地管理和控制调试暂停的功能。此外,通过检查鼠标按钮的状态变化,控制是否执行调试逻辑,提供了灵活的暂停机制。通过引入过渡计数和“按钮按下”判断的逻辑,可以更精确地控制鼠标按钮的按下事件,从而在调试过程中实现更加稳定和灵活的暂停功能。
2025-03-28 10:08:11
969
原创 游戏引擎学习第187天
昨天遇到了一个相对困难的bug,可以说它相当棘手。刚开始的时候,没有立刻想到什么合适的解决办法,所以今天得从头开始,逐步验证之前的假设,收集足够的信息,逐一排查可能的原因,最终找到罪魁祸首。然而,与其说是自己独自解决问题,不如说是通过观众帮助找到了bug。虽然我自己并不知道他们找到的具体问题是什么,但从论坛上看到有人发布了关于bug可能原因的猜测,他们的分析让我觉得很有道理。看完后,我认为他们的猜测很可能接近问题的核心。
2025-03-27 18:19:53
1233
原创 游戏引擎学习第186天
现在,我们站在了一个关键的时刻,准备突破,拥有一些优秀的性能分析代码。从目前来看,我们已经能够看到时间的消耗情况,我对这一点感到非常兴奋。昨天的直播中我们勉强让一些东西工作了,但我们发现了一些bug,且没有时间深入查看这些问题。因此,今天我认为是我们终于能够看到这些内容取得实质性进展的一天。我们将开始处理一些新的内容,这些内容应该会非常有趣,比如添加一些界面功能,让我们可以快速地在程序中导航,并深入挖掘具体的部分。这将是一个有趣的新尝试,也是对实际调试数据收集工作的一种突破。
2025-03-27 14:30:06
628
原创 游戏引擎学习第185天
为了能够处理更深层次的调试块,可以逐渐添加更多的规则来定义哪些块属于顶层。例如,若一个块的父块存在且该父块没有父块,这表明这个块是第二层深度的函数,依此类推。
2025-03-27 11:31:18
1110
原创 游戏引擎学习第184天
通过这一步,我们为后续的绘制准备了必要的数据结构,确保调试状态包含所有必要的参数(如帧数、线程轨道数、条形图缩放比例等)。同时,我们暂时关闭了一些不需要的功能,以便集中精力处理当前的绘制逻辑。最终,调试状态将能够提供所需的数据,并为图表的正确绘制奠定基础。在展示覆盖层时(Overlay):这时从调试状态中提取需要的数据进行显示。在更新记录时(Update Records):在更新过程中,调试数据被修改并保存。通过这些步骤,调试状态能够被适当初始化,并且内存池为接下来的数据填充和处理提供了空间。
2025-03-26 10:19:21
974
原创 游戏引擎学习第183天
问题出现在平台层正在写入不同的调试内存区域。由于在 DLL 边界的两侧分别声明了一个调试内存区域,平台层写入的内存和实际需要写入的内存完全不同。因此,平台层所写入的数据与预期写入的数据不在同一内存区域,导致了这个问题。
2025-03-25 21:59:40
1014
原创 游戏引擎学习第182天
线程索引是进行多线程调试和性能分析的关键,特别是在多个线程调用相同函数的情况下。为了确保准确的事件配对,必须依赖线程索引来标识每个线程的活动,并通过唯一标识符来避免线程间事件的混淆。这将帮助我们更精确地进行性能分析和调试工作。
2025-03-25 12:30:22
1281
原创 游戏引擎学习第181天
_rdtscp提供了高精度的时间戳计数器(TSC)和处理器核心 ID。时间戳计数器(TSC)提供了精确的低开销时间测量,适用于性能分析、基准测试等。核心 ID有助于在多核系统中识别处理该指令的 CPU 核心,特别在性能分析和调试中非常有用。该内建函数使开发者能够收集精细的时间测量数据,尤其适用于性能分析、基准测试以及低级别的时间测量。接下来,我们会写入数组索引。关于数组索引,实际上目前我们还不知道它的具体值,因为它还没有被定义得很清楚。然而,我们可以很容易地在构建过程中定义它。
2025-03-25 00:27:19
1078
原创 游戏引擎学习第180天
通过对现有代码进行重构和命名优化,调试系统变得更加模块化、易于管理。现在的目标是将这些调整实施,并在后续进一步优化和扩展调试功能,以便更好地进行性能监测和分析。
2025-03-24 16:15:39
1026
原创 游戏引擎学习第179天
接下来,我们来谈谈在Windows 7上的一些问题。我认为Windows 7可能是最后一个还能在字体渲染方面正常工作的Windows版本。谁知道呢,也许微软以后再也不会发布能够正确渲染字体的版本了,甚至可能会开始逐步从英语字母中删除一些,直到剩下它们能处理的字母为止。我们上次停留在一个地方,那里我们已经有了一些很酷的调试定时器,并且它们运作得不错。事实上,这些调试定时器现在可以显示出一些非常棒的信息。值得一提的是,它们使用的是我所谓的“Windows安全字母”,也就是新下划线。
2025-03-23 17:42:43
1395
原创 游戏引擎学习第177天
通过这种方式,整个问题就被解决了。现在,我们得到了调试记录数组的自动合并,就像是已经完成了一样。接下来,只需要执行写入操作,将数据写入一个已知的位置,这样就不会增加额外的数据量,也不会产生冗余。因此,整个过程变得非常简便且高效。具体来说,我们只需要关注行号等信息,并确保写入操作的执行。这种方法的优势在于它能够避免不必要的数据扩展,并确保整个过程的高效性,不会带来性能上的负担。using语句在 C# 中是一个非常强大的工具,它通过自动调用Dispose方法来简化资源管理,确保在使用完资源后能够及时释放它们。
2025-03-22 22:17:21
2177
原创 游戏引擎学习第176天
虽然测试驱动开发和先写使用代码的方式在某些方面相似,都涉及到某种程度的反向开发,但它们的核心目标和实施策略有显著的区别。TDD更注重代码的正确性和全面性,而先写使用代码则更注重代码的使用性和实际工作功能。因此,理解这两者的差异非常重要,以确保选择适合当前项目需求的开发方法。
2025-03-22 16:33:22
1849
原创 游戏引擎学习第175天
对于C语言没有局部定义函数的问题,实际上并不觉得这是个特别大的问题。尽管C语言没有内建的功能让函数仅在使用的地方定义,但在实际使用中,并没有发现这会带来太多麻烦。唯一可能遇到的问题是名称冲突,但这种情况其实也很少。自己并不觉得这种作用域限制是个问题,虽然如果能够像lambda函数那样在函数内部定义局部函数,且可以访问堆栈或外部函数的活动范围,那会更加方便。虽然C语言最近添加了类似的功能,但实现起来比较混乱。如果C语言最初就具备这种特性,可能会更加简洁和实用。
2025-03-22 12:29:14
1269
原创 游戏引擎学习第174天
总条目数:32768实际需要的条目数:500浪费条目数:32768 - 500 = 32268(大部分条目为空或为零)因此,使用一个包含32768条目的查找表来存储500个字符的数据是非常不合理的,因为它会导致巨大的空间浪费和性能开销。在这个过程中,首先会分配内存来存储字体的数据,并为表格分配足够的空间。接下来,会将表格中的内容清零,然后为字形表分配相应数量的字形 ID(bit map ID)。这些字形表的大小会根据最大能容纳的字形数量来决定。
2025-03-22 00:49:18
1297
原创 游戏引擎学习第173天
今天我们将继续昨天和前几天的工作,基本上已经完成了字体支持的功能,我们成功地把字体功能加入了游戏中,包括字距调整等基本功能。然而,我觉得整体还没有完全完成,感觉还有一些地方没有完全打理好,尤其是在定位和细节方面,代码还有一些“垃圾”需要清理。因此,我计划今天花时间对这些部分进行整理,确保一切都清理干净。此外,我还想确保我们有一个合理的方案来支持多语言。目前,我们虽然支持任意Unicode代码点,可以在游戏中显示多个字符,但仍然存在一些限制。这些限制其实并不是必需的,我们完全可以去掉它们,不会带来太多麻烦。
2025-03-21 21:20:58
1160
原创 游戏引擎学习第172天
启用符号服务器:在 Visual Studio 中启用 Microsoft 符号服务器,确保调试符号文件(.pdb)能够下载并加载。查找源代码文件是 C 运行时启动代码的一部分,你可以在 Visual Studio 安装目录的 CRT 源代码文件夹中查找。启用源服务器支持:通过 Visual Studio 设置启用源服务器,以便从 Microsoft 下载缺失的源代码文件。调试时查看符号和源代码:启用调试符号和源代码后,调试器将显示更多细节,帮助你定位问题。
2025-03-21 16:13:06
1373
原创 游戏引擎学习第171天
高动态范围(HDR)是指在表示光照强度时,能够处理非常宽广的数值范围。普通的8位RGBA色彩格式只能表示256个不同的色阶,这导致无法精确表达极亮的光源(比如太阳)和较暗的光源(比如蜡烛的光线)之间的差异,因为它们之间的亮度差距过大。当用256个色阶表示这些亮度时,图像会呈现出明显的条带感,无法保留足够的光照细节。高动态范围的核心概念就是能够捕捉并表示更广泛的光照范围。浮点数格式可以表示任意范围的数值,因此如果图像中的所有数值都使用浮点数格式,就可以实现高动态范围。
2025-03-20 23:49:12
990
原创 游戏引擎学习第170天
在实现过程中,可以假设“已加载字体”中包含了所有需要的内容,接下来会仔细确定这些内容是什么。这些内容将基于当前的例程进行处理。同时,由于需要处理更多内容,可以顺便实现一个获取“行间距” () 的功能。当字体被返回时,可以通过调用来获取该信息。只需要将其乘以字体缩放比例,即可得到正确的行间距。通过这种方式,不仅能处理字体信息,还能确保在不同的缩放级别下,行间距的调整也能正确处理。
2025-03-20 00:01:33
1125
原创 游戏引擎学习第169天
目前还存在另一个问题,就是对行与行之间的间距没有任何了解。这也是为什么会丢失顶部的行,因为我们不知道应该把文本移到屏幕的多远,也不了解行与行之间的移动距离。我之前只是随便设置了一个值作为假设,但这样做并不准确。我们需要获取准确的行间距度量。下周在继续处理字体相关问题时,应该重点关注这一部分。我们需要获得这些度量值,并以合理的方式使用它们,使得文本的显示效果更符合预期。
2025-03-19 17:19:13
1216
原创 游戏引擎学习第168天
从右到左开始:找到最右边的标识符(如数组[]或指针遇到括号:优先解析括号内的内容,把括号内的部分看作一个整体。逐步向左:结合类型(如int)和其他修饰符。反复跳转:必要时从左到右再确认整体结构。练习是关键:多看复杂声明,熟悉语法规则。希望这些例子能帮你更好地理解C语言声明的解析过程!如果还有其他声明需要解析,可以告诉我,我会一步步帮你拆解。
2025-03-19 13:36:39
894
原创 游戏引擎学习第167天
我们不使用引擎,也不依赖库,只有我们自己和我们的小手指在敲击代码。今天我们会继续进行一些工作。首先,我们会清理昨天留下的一些问题,这些问题我们当时没有深入探讨。除了这些,我觉得我们在资产系统方面的工作差不多可以告一段落了。虽然我们在处理资产时遇到了一些小bug,但今天的主要目标是继续实现字体相关的功能。之前我们已经完成了字体字形的获取部分,但我们还没有开始处理字体的度量(metrics)问题,也就是如何计算字母的尺寸、如何对齐字母等。今天我们会集中精力做这些工作。
2025-03-18 23:52:08
917
原创 游戏引擎学习第166天
我们不使用引擎或新的库,完全是自己做的。虽然我之前提到过,节目中有个部分是讲解如何将某个库集成到资产打包器中。如果有兴趣使用这个库,可以去查看。不过,今天我们正在修复资产系统中的一些错误,这些错误是昨天提到的,我希望能尽快解决它们。我们还没完全修复这些问题,仍然有一些工作要做,所以我希望今天能够把这些问题解决掉。
2025-03-18 19:13:39
881
原创 游戏引擎学习第165天
今天的主要工作是修复代码中的一个问题,同时优化锁机制,以确保资源不会在渲染过程中被意外驱逐(evicted)。1. 发现的问题当前的代码中,在加载新资源时,会调用一个用于分配新内存的函数,该函数可能会驱逐已有的资源。然而,这个过程可能发生在渲染执行过程中,而渲染所需的资源是基于先前加载的bitmap进行的。如果这些bitmap在渲染完成前被驱逐,屏幕上可能会绘制出一堆无效数据,导致渲染错误。这种情况不仅影响视觉效果,还显得非常不专业,需要加以修正。2. 解决方案:引入。
2025-03-18 11:55:17
899
原创 游戏引擎学习第164天
我们可以选择使用Windows中的字体,或者选择使用STB TrueType库。为了实现这一点,可以在代码中通过条件编译来决定是否包含Windows的相关头文件。具体来说,如果选择使用Windows字体,我们会包含windows.h,否则将使用STB TrueType库。在STB TrueType的部分,我们会修改函数,使其不依赖STB TrueType。这样做的目的是如果选择使用Windows的字体,那么会走Windows相关的路径;如果选择使用STB TrueType,就会走相应的路径。
2025-03-16 19:11:05
781
原创 游戏引擎学习第163天
因为我们的资源处理器并不是游戏的一部分,所以它可以使用库。我说过我不介意让它使用库,而我提到这个的原因是,今天我们确实有一个选择——可以使用库。
2025-03-16 16:25:04
2099
3
原创 游戏引擎学习第162天
当讨论字体时,需要了解字体系统包含的内容。从最基础的概念开始,无论是否了解**排版(Typography)**或相关知识,都可以逐步理解字体的构成和工作原理。所有计算机用户都会对字体有所了解,它决定了文本在屏幕上的显示方式。常见的字体文件格式包括,这种格式在 Windows 系统中广泛使用。此外,还有,这种字体格式曾导致微软遭遇严重的安全漏洞,攻击者可以通过网页中的 Adobe Type 1 字体文件入侵系统。其他字体格式还包括MetaFont(用于 LaTeX),以及多种不同的字体文件格式。
2025-03-16 11:09:14
841
原创 游戏引擎学习第161天
目前的内存分配方案采用了一种链表管理方式,其中每个内存块都通过双向链表进行链接。这种方式在合并内存块时非常高效,因为合并操作可以通过简单的指针调整瞬间完成。然而,这种方案在搜索可用内存块时可能会遇到效率问题,特别是在资产数量增加的情况下。当前内存分配机制基本结构资产的内存块以双向链表的形式组织,所有空闲块和已使用的块都链接在一起。每次加载新资产时,都会遍历链表,寻找合适的空闲块进行分配。当释放内存时,相邻的空闲块会被合并,以减少碎片化。合并操作的优势由于采用双向链表,合并操作是即时完成。
2025-03-16 00:19:11
786
原创 游戏引擎学习第160天
在实现这样一个内存管理系统时,我们可以从一个最基本的思路开始:首先,我们假设有一块巨大的空闲内存区域可供使用。然而,在实际情况下,尤其是在 32 位 Windows 系统上,我们可能无法获取一整块连续的 1GB 内存。因此,我们可能需要从操作系统获取多个较小的内存块,而不是依赖单一的大块内存。例如,我们可能会得到多个 64MB 或 256MB 的内存区域,这些区域共同构成我们的资产存储池。为了管理这些内存区域,我们需要维护一个空闲列表(free list),它记录当前可用的内存块。
2025-03-15 18:00:34
1343
原创 游戏引擎学习第159天
我们在完成一款游戏的制作。这个游戏没有使用任何引擎或新库,而是从零开始编写的完整游戏代码库,您可以自行编译它,并且它是一个完整的游戏。更特别的是,这个游戏甚至没有使用显卡,所有的渲染工作都由我们自己处理,虽然听起来有些疯狂。但实际上,不那么疯狂的是我们的资源加载系统。昨天我们做了一些工作,需要继续完善。今天的任务是完成昨天没有做完的部分,主要是为资源加载系统提供基础功能,保持资源系统中内存的稳定使用,同时确保游戏运行流畅。昨天我给大家展示了如何将操作系统作为内存管理的工具,我们展示了这个过程,但有一个关键点
2025-03-15 13:14:31
817
OpenCV Computer Vision Application Programming Cookbook Second Edition.pdf
2018-06-17
OpenCV 3 Blueprints.pdf
2018-06-17
OpenCV 2 Computer Vision Application Programming Cookbook
2018-06-17
Learning Image Processing with OpenCV.pdf
2018-06-17
A Practical Introduction to Computer Vision with OpenCV.pdf
2018-06-17
OpenCV Computer Vision with Python.pdf
2018-06-17
Arduino Computer Vision Programming.pdf
2018-06-17
OpenGL Programming Guide, 8th Edition
2018-06-17
OpenGL ES 3dot0 Cookbook
2018-06-17
OpenGL Data Visualization Cookbook
2018-06-17
OpenGL 4 Shading Language Cookbook, Second Edition
2018-06-17
Real-Time C++, 2nd Edition.pdf
2018-06-17
Procedural Content Generation for C++ Game Development.pdf
2018-06-17
Learning Boost C++ Libraries.pdf
2018-06-17
Functional Programming with C++
2018-06-17
Data Structures & Algorithm Analysis in C++, 4th Edition.pdf
2018-06-17
Data Clustering in C++.pdf
2018-06-17
C++ for Engineers and Scientists, 4th Edition.pdf
2018-06-17
OGLPG-9th-Edition.zip OpenGL编程指南代码(包括资源文件)
2019-10-23
OpenGL 4.5 Reference Pages API + GLSLangSpec.4.60 + glspec46.core
2019-10-22
OGRE 3D 1.7 Application Development Cookbook.pdf
2019-04-20
UNIX网络编程卷1:套接字联网API(第3版) (1).pdf
2019-04-14
Multicore and GPU Programming An Integrated Approach.pdf
2019-03-21
Game Programming Using QT.pdf
2018-06-17
Practical Algorithms for 3D Computer Graphics, Second Edition.pdf
2018-06-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人