无论如何,我们今天有一些调试工作要做,因为昨天做了一些修改,结果没有时间进行调试和处理。我们知道自己还有一些需要解决的问题,却没有及时完成,所以我们想继续进行这些调试。对我们来说,拖延调试工作总是很烦人。
一些论坛上的人已经猜测了可能存在的错误,他们的推测或许是对的,但我们并不确定。正如之前提到的,我们昨晚停下来了,没能抽出时间来逐步调试,因此我们不清楚实际情况以及具体的错误在哪里。
修复 IsInRectangle 剪切/粘贴错误
有人报告了一个错误,肯定是一个问题,无论是不是我们自己引起的,但确实是个 bug。昨天在进行剪切和粘贴操作时,我们没有检查矩形三的 Z 坐标。这个问题显而易见,但我们的数学库可能还有很多问题。为了澄清,我们目前并不太关注这些 bugs,主要是想在架构方面做一些实验,等一切都准备好之后,再进行更多的测试和修正。
当有问题被指出时,及时修复是很好的。这次问题是我们在处理矩形时没有考虑 Z 坐标,尤其是在从二维变成三维时,矩形的维度发生了变化,导致了这个问题。其他的内容似乎并没有太大变化,主要还是在潜在的向量处理上,没有什么需要改动的地方。
修复 ChunkPositionFromTilePosition 错误
有一个错误被报告了,出现在世界代码中。昨天的更改涉及到将所有操作转换为三维,但在处理临时世界构建时,我们使用了错误的坐标系统。具体来说,在计算瓷砖空间中的物体位置时,错误地使用了“ChunkDimInMeters”,而实际上应该使用“TileSideInMeters”。这种错误导致了世界变得更加稀疏,因为我们错误地将物体放置在了瓷砖边界处,而现在没有瓷砖的概念了。
此外,这个问题暴露了一个更深层次的错误,虽然这只是一个定位辅助工具,用来帮助我们在处理更复杂的世界时做一些瓷砖相关的操作,但它显然是个 bug。幸运的是,大家在论坛上指出了这个问题,让我们能够修正它。通过这种方式,仿佛拥有了一大批代码审查员,可以实时帮忙寻找并指出错误,这对调试过程来说是一个非常有价值的补充。
尽管修复了这些问题,我们不确定它们能否完全解决最初的问题。可能并不会完全修复,还需要进一步的检查和修正。
调试 MapIntoChunkSpace 精度问题
出现了一个问题,似乎在更改代码时,导致了地图切分的错误。特别是,我们在将地图坐标映射到大块空间时,存在精度问题。当数字变得较大时,精度下降,导致难以准确确定物体应该位于哪个瓷砖或哪个大块区域。这种问题本来是可以预料到的,尤其是在处理大规模世界构建时。
为了解决这个问题,未来我们可能会采用将世界分割成局部区域的策略,并在浮点坐标系统中进行处理。这样,在构建较大的世界时,可以通过移动焦点来优化处理,而不是让世界变得过于庞大而难以管理。我们将继续在本地坐标系下进行操作,并将整个区域移动到新的位置,以确保精度问题不会影响到整个世界的构建。
这意味着,我们的目标是能够构建更大的世界,而不仅仅是将所有内容都放入一个浮点系统中,从而避免让世界变得过于复杂或庞大。这个方法将使我们能够处理更大、更复杂的虚拟世界。
目前,关于构建一个庞大的游戏世界,虽然我们面临精度问题,但并不特别担心。通过增加局部坐标原点附近的精度,我们希望能够在将来解决这些问题,尤其是在不依赖大范围世界构建的情况下。虽然当前存在一些问题,但我们计划在未来通过调整epsilon值,使其趋近于零,避免这些问题影响最终效果。
我们遇到的一些错误,如世界构建时的精度问题,其实并不算严重。尽管地图的计算误差可能较大,但这并没有阻止世界的继续扩展。当前的错误主要是由于坐标范围的扩大导致的精度损失。尽管如此,错误的程度并不会对整体结构产生根本性影响,仍然能够顺利进行其他方面的工作。
总的来说,这些问题虽然存在,但并不会阻止项目的继续发展。将来,当世界构建逐步转向局部坐标系统时,我们将能够更加高效地处理这些问题,并确保游戏世界的质量。
调试跳过世界问题
目前,我们可以跳跃进入下一个层级并返回地面,但Z轴的处理存在一些问题,尚未完全正确。问题出现在跳跃时,虽然Z轴的加速度已经包括了重力(负9.8 m/s²),并与水平方向的运动方程一起计算,但跳跃的表现仍有些异常。
首先,跳跃的代码应该在按下空格键时设置一个向上的速度,但跳跃的行为看起来并不像预期的那样。虽然在处理Z轴时没有出现明显错误,我们仍然需要仔细检查,可能是由于某些细节未完全调整好。
在跳跃过程中,如果角色跳得足够高,可能会进入一个新的Z轴区间,导致角色未能回到地面。为了进一步解决这个问题,需要查看并调试代码,特别是涉及Z轴运动方程和跳跃逻辑的部分。
总体来说,虽然有些异常情况出现,但问题并不严重,需要进一步检查Z轴的跳跃和回归地面的逻辑。
图示跳跃到下一个更高的块
在跳跃代码的处理过程中,角色的Z轴位置是根据相对于相机的位置进行检查的。当角色跳跃并超越当前的Z轴位置时,假设跳跃高度足够,角色会进入下一个Z轴区间。然而,代码仅检查角色的Z轴位置是否小于零,而没有检测是否与其他物体发生碰撞,导致角色可以穿越平台并继续跳跃。
具体而言,跳跃的逻辑目前存在一个问题:由于代码只判断Z轴位置是否小于零来确定角色是否已经落地,这样的检查方式忽略了平台间的相对位置,导致角色跳过平台后并不会停在上面。实际上,跳跃的行为应该像平台游戏一样,角色能够穿越上面的平台,但落地时应该停在平台上。
另外,关于相机的更新,当前的代码似乎只使用了大块Z来进行相机的跟踪,而没有进行完整的Z轴跟踪。这可能是导致跳跃行为异常的原因之一。因此,调试需要首先集中在角色跳跃时Z轴行为的异常上,确认是否是由于相机跟踪的处理不完全导致的问题。
发现问题!
问题的根本原因在于相机的Z轴跟踪。之前,角色的Z轴位置与相机同步,导致跳跃时相机也跟着角色的Z轴变化,从而使得角色的跳跃行为发生偏移。当禁用了相机跟随功能后,角色的跳跃行为恢复正常,看起来是正确的。接下来,目标是通过调整Z轴偏移来防止相机继续跟踪角色的Z轴位置,避免影响跳跃过程。
在进一步调整时,可以采取只处理X和Y坐标的方法,保存Z轴偏移量,并在需要时恢复相机的原始Z轴偏移。通过这种方式,跳跃过程中的Z轴变化就不会影响到相机的位置跟踪。
尽管目前仍然可以通过无限跳跃来实现角色逐层上升,但接下来可能会需要进行更多的思考和调整。这些调整虽然可能看起来不必要,但为了实现更加精确的控制,还是决定继续进行优化,即便这种优化可能看似没有多大意义。
接下来:Minkowski 包含测试
接下来,将继续处理其他任务,比如实现Minkowski包含测试和可更新反弹等功能。
Frinstancesδ
接下来的工作将集中在实现起伏不定的局面处理,这需要通过多个实例进行思考。例如,需要处理一些场景,如上下楼层、进入洞穴、与楼下的BOSS互动等。这些问题的处理方式与Minkowski包含测试相关,尽管Minkowski本身并不是强制要求使用的概念,但它是讨论空间内实体交互和模拟的一种方法。
目前在模拟区域内,有一个实体聚集的概念,我们通过检查某个边界内的所有实体,判断哪些实体与边界重叠,并将这些实体放入模拟区域。这个过程主要用于在有限的地理区域内模拟实体的交互,因为我们不能在一个时间内模拟整个世界中的所有实体。因此,通过分区域模拟,可以更有效地处理实体间的互动。
然而,现有的代码存在问题,主要是没有考虑到实体本身的大小。之前的处理方式未能准确反映实体的尺寸,导致在模拟过程中出现问题。因此,接下来的任务是更新代码,使其能够更加精确地处理实体的大小,以确保更高效和更清晰的模拟过程。
图示问题
在当前的实现中,实体的边界只考虑了二维空间的宽度和高度,但为了更精确地模拟实体在三维空间中的交互,必须加入实体的深度信息。因此,需要将实体的尺寸概念改为三维(v3),以存储所有三个坐标轴上的尺寸。
此外,在模拟区域的聚集过程中,现有的包含测试只检查实体的中心点位置是否在边界内,这对大尺寸的实体来说可能不够准确。因为即使实体的中心点在边界内,实体的实际边界可能超出了该范围,因此需要改进这一测试。
一种改进的方法是使用Minkowski包含测试,它可以通过扩展边界来考虑实体的尺寸,将距离添加到矩形的每一边,从而生成一个新的测试矩形进行重叠检测。另一种方法是直接进行矩形重叠测试,检查两个矩形是否相交。两种方法的效果相似,选择哪一种方式并不会产生显著的差别,但必须进行其中的一种。
此外,还存在一个相关问题,需要进一步探讨是否解决。
AABB(Axis-Aligned Bounding Box,轴对齐包围盒)是一种用于表示物体空间范围的几何形状,常用于碰撞检测、物体筛选等应用中。AABB的特点是它的边界与坐标轴对齐,即盒子的每一条边都与坐标系的X、Y(以及Z轴,在三维空间中)平行。它是一个矩形(二维)或长方体(三维),并且其边界不随物体的旋转而旋转,因此称为“轴对齐”。
AABB的特性:
- 简易计算:由于AABB的边界与坐标轴平行,计算其是否与其他物体重叠或是否包含其他物体的范围非常简单,通常只需要比较边界的坐标。
- 空间效率:AABB通常用于快速判断两个物体是否相交,尤其在3D游戏和物理引擎中用于简化碰撞检测的计算。
- 局限性:AABB并不考虑物体的旋转,导致在某些情况下,物体可能会被包裹在一个比实际需要的空间更大的AABB内,从而降低精度。
示例:
- 在二维空间中,一个AABB可以由两个点表示:左下角和右上角。这两个点的坐标分别代表该AABB的最小和最大边界。
- 在三维空间中,一个AABB则由前述的两个点扩展为六个数值(最小和最大X、Y、Z坐标)。
由于其计算简单,AABB在许多实时系统中非常常见,尤其是游戏开发和物理模拟中。
相关问题:在测试区域外查找碰撞实体
目前面临的问题是如何有效地处理实体聚集的区域。我们有一些瓦块(tile chunks),这些瓦块存储了实体。当我们进行聚集操作时,我们遍历与聚集区域接触的瓦块。这些瓦块的范围通常是9个正方形,我们对这些区域内的实体进行测试,以避免每次都遍历整个世界中的所有实体,这样做是为了提高效率。
然而,问题在于,如果一个实体恰好位于某个瓦块的边缘,且该瓦块没有被当前聚集区域包含,那么这个实体就会被忽略,即使它的边界可能部分超出了当前区域。如果聚集区域不恰好对齐,或者实体本身比较大,这个问题会变得更加明显。
为了解决这个问题,有几种可能的方法。首先,我们可以考虑双重存储实体:任何跨越多个瓦块的实体都可以同时存储在这些瓦块中,这样就能确保这些实体在所有涉及的区域内被正确处理。另一个方法是扩展聚集区域,考虑到最大实体的半径,这样即使某个实体的边界超出了聚集区域的边缘,也能够被包含在内。
扩展聚集区域的优点是能够确保所有实体都能被正确测试,但缺点是如果大多数实体比较小,而只有个别实体非常大,那么每次进行聚集操作时,系统会浪费大量资源去检查这些不必要的大范围区域。因此,这种方法的效率可能会受到影响。
另一方面,双重存储方法能够处理跨瓦块的实体,但如果所有实体大小差异不大,双重存储会导致大量不必要的重复操作,浪费存储和计算资源。
目前,还不清楚哪种方法最为有效,因为缺乏关于实体大小分布的具体信息。考虑到实现的简易性和避免不必要的复杂性,选择扩展聚集区域的方法可能更为合理,尤其是在大多数实体相对较小的情况下。
实现更简单的选项
这段内容描述了一个游戏开发过程中,关于实体半径、速度、区域更新、碰撞检测等方面的实现和调整。主要涉及以下几个方面:
-
实体半径和区域更新:
游戏中有一个最大实体半径(约为五米),用来定义实体的最大影响范围。模拟区域会根据该半径进行更新,确保区域的大小能够适应所有可能的实体。 -
最大半径和速度限制:
通过设定最大实体半径和最大速度,防止出现过大的实体或过快的速度。为了确保物理模拟的稳定性,开发者考虑通过多种方式(如增加安全边际)来防止实体超出设定的最大值。速度被定义为最大实体速度与时间步长(DT)的乘积。 -
实体速度和碰撞检测:
对实体的速度进行校验,确保它不会超过设定的最大速度。开发者使用了长度平方的方式来避免计算实际的速度值,从而优化性能。为了确保速度不超过限制,开发者考虑使用断言(assert)来检查速度,如果超出最大速度,可以进行限制。 -
跳跃和重力处理:
游戏中的跳跃功能存在问题,实体的速度没有在接触地面时清零,导致速度继续增长。通过调整代码,确保实体在接触地面时将垂直方向的速度归零,从而避免跳跃速度不正常。 -
区域碰撞检测和维度处理:
在模拟区域内,开发者计划添加基于矩形的碰撞检测,以确保实体和区域的交集能够被正确检测到。实体的维度被定义为宽度、高度和深度,开发者将相关代码中的“高度”改为实体的维度,以提高代码的通用性。 -
后续计划:
游戏开发者计划进一步调整和优化与Z轴相关的运动代码(如跳跃和物理反应),并进行更多的探索和实验,以改进实体的垂直运动。预计未来会对这些部分进行更深入的开发。
这些更改和改进旨在确保游戏中的实体运动和碰撞系统更加稳定和真实,避免出现过大的实体或速度问题,同时改进游戏体验。
你在 APCS 上的成绩是什么?
参加AP计算机科学考试时,即使已经有七年没有使用考试所用语言编程,依然获得了满分5分。考试所用的语言是Pascal,这对于大多数人来说并不是常见的编程语言。尽管早在9岁时就学习过Pascal,但已经很久没有使用它。尽管如此,仍然能够取得满分,这令人感到惊讶和困惑。这种现象让人怀疑,尽管存在某种程度的成绩膨胀,考试的评分标准可能存在不合理之处,因为如果一个人很久没有使用考试所用的编程语言,通常不应该轻易取得最高分。
但你在高中上过哪些数学课,成绩如何?
回顾高中时所修的数学课程以及获得的成绩,虽然这些内容与当前讨论的话题无关,但并不妨碍提及。既然没有特别相关的主题问题,那么谈论一些离题的内容也无妨。
我注意到你有很多函数是内联的。使用常规函数和内联函数有什么区别?
在编程中使用内联函数时,其意义和效果并不像以前那样直接。使用内联函数通常是为了提示编译器,将函数展开到每个调用处。然而,在现代编译器中,内联函数并不总是如预期那样进行展开。由于采用了“统一构建”方式,所有代码都在同一个文件中,编译器能够访问所有的函数,并根据需要自行决定是否进行内联优化。因此,在这种构建方式下,inline
关键字更多的是作为一种提示,而不是强制指令。实际上,编译器可能会对未标记为内联的函数进行优化内联处理。
此外,现代链接时代码生成(Link Time Code Generation, LTO)也可以自动进行函数内联,无需显式标记。因此,即使某些函数没有显式声明为内联,编译器仍可能会对它们进行内联优化。如果希望确保某些函数被强制内联,可能需要使用其他编译器指令,而不仅仅依赖inline
关键字。
总的来说,inline
现在更多的是一个编程上的提示,而不再是编译器执行内联优化的绝对指令。
你觉得还需要多久?
如果每天只一个小时,那么完成一个完整的游戏开发项目将需要相当长的时间。假设需要三到四个月的时间来编写整个游戏的代码,而每天只投入一个小时,这样计算下来大约需要600天,差不多是两年左右。虽然游戏的开发可能看起来每一天都能完成一些小任务,但实际进展较慢,每天工作一小时意味着每次能做的事情有限。因此,整个过程会持续很长时间,因为每天的工作量并不多。
你能看看玩家的碰撞吗?他们生成时很接近彼此
玩家在游戏中生成的位置非常接近彼此,导致可能发生碰撞或其他相关问题。这里提到的问题可能是玩家生成时,位置相互重叠或接近过近,导致游戏中的物体或角色发生意外的交互。
四维向量有任何好的使用案例吗?
四维向量有两个非常常见的用途,几乎可以说是无处不在的应用,虽然之前已经看过其中一个案例,但尚未实际使用过。因此,可能会为此添加一个四维向量。
四维向量
四维向量(例如四元数)有两个非常常见的用途。第一个用例是四元数,它是一个四元素的向量,通常存储为 X、Y、Z 和 W。四元数通常用于表示旋转,其中前三个元素表示旋转轴,最后一个元素 W 表示旋转角度的余弦值的一半。四元数的 V 部分,即 XYZ,表示旋转轴的正弦值的一半与旋转轴本身的乘积。四元数在许多引擎代码中有广泛应用,尽管在某些项目中可能不需要完整的3D旋转。
第二个常见用途是颜色存储,通常使用 RGBA 格式,其中 A 表示透明度。颜色可以通过一个四元素的向量表示,其中 RGB 表示颜色,A 表示透明度。这种存储方式在很多情况下都非常实用。
一般编程问题:你是否倾向于以某种顺序排列你的函数——公共/私有/静态——或者是按流向——函数A调用函数B?你通常会把它们一个个放在一起吗?还是你从不考虑这些?
函数的排序主要是根据它们的调用关系进行的。通常会将被调用的函数放在调用它们的函数之前,这样就不需要额外的声明。除此之外,函数的排序还会根据文件来进行,将功能相关的函数放在一起。例如,所有与模拟相关的函数放在一个文件中,所有与实体相关的函数放在另一个文件中。这样做是为了保持代码的整洁,方便查看和管理。尽管编辑器对代码的可视化支持有限,但这种排序方式能够帮助提高代码的可维护性和可读性。
你会将 Minkowski 碰撞实现扩展到处理旋转/任意凸多边形吗?
目前关于旋转和任意凸多边形的碰撞检测是否会扩展的问题尚不明确。对于旋转,可能并不需要,因为目前不涉及旋转的操作。虽然将来可能会需要处理旋转,但不确定是否会实现,尤其是在动画旋转方面。碰撞检测本身通常不适用于动画旋转,现有的碰撞求解器并没有很好地处理旋转,特别是持续旋转。可以通过基于搜索的方式来处理这种情况,但通常没有非迭代的方式来精确处理动画旋转。
对于旋转,常见的做法是使用起始或结束位置的旋转,或者取中间位置的旋转,但没有一种方法能够精确地处理正在旋转的物体之间的碰撞,除非增加维度。现有的如GJK算法也无法处理这种情况。因此,旋转的处理通常并不完全准确,尤其是动态旋转的碰撞检测,通常会用一些近似方法,例如通过细分、计算旋转可能覆盖的最大面积来进行碰撞测试。总的来说,旋转动画导致的碰撞检测要比不动旋转的情况复杂得多,而且通常需要一种不那么完美的解决方案。因此,最好尽量避免这种情况,以减少碰撞检测的复杂度。
为什么 Win32 鼠标处理那么麻烦 - WM_LMOUSEDOWN 但如果你离开窗口就没有 WM_LMOUSEUP,WM_MOUSELEAVE 除非你被 Alt+Tab 走,SetCapture 帮助如果你离开窗口,除非 Alt+Tab…
Windows平台上的鼠标事件处理存在一些问题,尤其是关于鼠标按下和松开事件的处理。对于这种情况,使用原始输入(raw input)方式查询鼠标可能会更好一些。之所以Windows的鼠标处理会让人觉得烦恼,是因为操作系统本身在输入事件传递给应用程序时存在一些问题,许多平台在这方面都有类似的缺陷。Windows并没有很好地将输入事件传递到应用程序中,这个问题一直存在,也可能很难得到解决。
实体的 Z 索引什么时候会发生?
关于实体的Z索引,Z索引通常用于表示元素在3D空间中的深度或者在2D渲染中的前后层级关系。它指的是一个实体在某一坐标轴(通常是Z轴)上的位置,决定了该实体在视觉上是位于前景还是背景。如果提到Z索引时没有特别的上下文,可能是指此类深度或层级信息。
这里有谁足够大,怀念“大太空过山车”吗?
提到的内容涉及一个过时的电视节目《The Great Space Coaster》,并且提到节目中一位名为Gary的人物。尽管没有具体的细节,但可以推测这是对过去某段时间文化或节目的一种怀念或调侃。
你预见到项目会发展到接受其他开发者的拉取请求和合并请求,来修复bug、添加功能或其他吗?当然,你得先开始使用版本控制,避免硬盘损坏
提到的内容讨论了项目未来是否会接受其他开发者的拉取请求(pull request)以修复 bug 或添加功能。目前没有明确计划接收外部贡献。项目的代码将在游戏发布两年后进入公共领域,届时任何人都可以托管自己的代码库,并可能会有社区参与维护。
我从大概第12集跳到现在的直播,所以如果这个问题之前已经回答过,抱歉,为什么玩家需要跳跃?
提到的内容解释了玩家跳跃机制的设计。玩家本身并不需要跳跃,这一功能是因为有人提议而加入的,用来测试 Z 轴的运动。虽然跳跃并不是游戏的核心功能,但它在测试飞行敌人等元素时起到了作用,因此暂时保留。最终,当 Z 轴的功能完善后,跳跃功能可能会被移除。
使用 Xbox 控制器创建第二个玩家,它会非常接近由键盘创建的玩家,导致两者无法同时移动
在处理多个角色生成时,如果它们相互重叠,游戏目前没有处理这些重叠的机制。为了增强程序的健壮性,计划通过重投影等方法解决实体重叠问题。这不仅能解决实体间的碰撞问题,还能修正由于浮动点不精确而导致的实体进入另一个实体的情况。开发计划是让这些问题得到处理,以便在未来不会成为阻碍,确保碰撞检测能更加健壮。虽然这项工作可能不会很快完成,但会在后续的碰撞检测修复中逐步完善。
目前游戏中最优雅/最性感的代码是哪一段?
目前游戏中最具吸引力的部分可能是实现了循环即时代码编辑功能。这项技术使得整个游戏能够回溯并执行一些非常酷的操作。在编程时,可以设置所谓的循环点并重复播放这一部分内容,且在播放的过程中,开发者可以实时编辑代码。例如,可以直接更改角色的外观,甚至给角色添加额外的元素,如头部。通过这种方式,游戏的代码可以在运行时被动态编辑,从而即时反映出用户输入或其他变动,极大提高了开发效率。很多游戏引擎,甚至一些商业引擎,通常并不具备这样的功能,因此这一功能非常特别和强大。
如果我没记错的话,你的代码中到目前为止没有使用任何前向声明,也没有遇到循环依赖。这是巧合吗,还是你在编写新函数/结构体时有意避免它们?
在编写代码时,采取了一种排序方法,即按照函数之间的调用关系进行排序,确保需要先声明的函数位于调用它们的函数之上。这种做法避免了使用前置声明,减少了不必要的依赖。至于循环依赖的情况,通常并不常见,因此也很少需要进行前置声明。只有在少数情况下,例如在处理“添加实体”时,因为该操作可能会引入新的实体,这时才需要使用前置声明。总体而言,排序方法让代码更加整洁,避免了过多的复制和粘贴,也不必处理复杂的前置声明问题。
实体的从后到前绘制
关于敌人绘制顺序,目前还没有确定何时实现从后到前的绘制。首先可能会实现实体的从后到前的绘制,至于敌人的绘制,可能会继续采用从前到后的顺序,因为这种方法通常更快。敌人的从前到后的绘制可能会在实现渲染器时才会考虑。
你有在实现任何高级数据结构吗?你会推荐学习汇编语言来帮助优化 C 语言程序吗?有什么练习建议吗?
在项目中,已经实现了一些较为复杂的数据结构,例如一个基于哈希表并包含链表的“块存储”结构。虽然它不是非常复杂,但相比于简单的链表或哈希表,它融合了两者的特性,因此可以算作一个进阶数据结构。不过,目前没有实现完全独特或无法分类的数据结构,常见的数据结构已经能满足需求,因为它们可以用来构建大部分所需的功能。
至于学习汇编语言,关键并不是要能编写汇编代码,而是能够阅读它。了解编译器的工作原理,并通过分析 CPU 执行的内容来理解性能瓶颈,是优化程序的一个重要方面。能读懂汇编代码对于理解程序运行的底层机制至关重要,尽管大多数情况下,不需要用汇编语言编写完整的程序。
是否存在所谓的“硬件”光标与“软件”鼠标光标的区别?
关于硬件光标与软件光标的区别,历史上经历了几个阶段。在最初的时代,硬件光标和软件光标并没有区别,因为显示器只是简单地设置像素并显示,没有专门的硬件光标。在这种情况下,如果要绘制一个光标,就需要多次绘制,常用XOR绘制方法来避免重复覆盖,避免额外的资源消耗。
随着鼠标光标变得越来越重要,尤其是在游戏硬件中,光标通常作为精灵(sprites)来实现。硬件开始支持覆盖显示,专门处理鼠标光标,这时硬件光标和软件光标之间的区别显而易见。
然而,随着3D图形技术的发展,硬件开始处理所有的位图合成,包括鼠标光标和窗口的渲染。现在,所有内容,包括光标,都是通过图形硬件进行合成的,因此将鼠标光标称为硬件光标已经不再具有实际意义。总的来说,硬件光标和软件光标的区别经历了多次变化,现在已经趋于模糊。
仓库: https://gitee.com/mrxiao_com/2d_game