Articles of 空间分区

2D RTS游戏中的单位的高效容器

正如标题所说,我正在开发2D空间RTS游戏。 我所有的单位都是太空船,基本上只是互相射击,但他们也必须做很多其他的事情:他们必须“发现”(通知,绘制等)其他船舶和行星不属于所有者这艘船在这艘船的“扫描仪”的任意范围内(因为它们会被隐藏起来),如果这艘船被告知在敌船上开火,它需要find最近的敌人(如果没有射击范围),然后明显地射击。 我一直在想,如果将要有大量的船只(100到1000年),我可以使用什么样的高效数据容器?为什么? 另外值得注意的是,船只必须由船东区分(我可以和一个玩家开战,所以我显然不希望我的船只search其他玩家的船只),所有权可能会由一些整数1 =玩家1,2 =玩家2等)或者可能是“玩家”对象(0x4ff =玩家1,0x5ea =玩家2等)的唯一指针/存储器地址或其他一些简单的标识符。 我最初考虑使用vector数组(C ++),数组的索引代表玩家,每个vector都是属于该玩家的船只; 然后把所有属于你所参与战斗的玩家的所有船只放到一个优先队列中,这个优先队列的根将是最靠近一艘特定(友方)船只的敌方船只,并决定是否在范围之内,速度慢,内存昂贵,并没有真正解决如何扫描船舶/行星。 然后,我读了一些有关四叉树的相关文章,这导致了其他类似的树数据结构,如R树,也用于最佳空间查询,但我不完全明白它们是如何工作的,以及它们是否它们对我来说是最好的,所以我们在这里。

三维空间索引最近邻search

我正在开发一个类似CAD的应用程序,用户可以绘制(数字化)新的几何graphics(点,多段线和多边形)。 在数字化时,我希望用户能够(可选地)将新形状的点捕捉到现有几何graphics的点或线上。 我已经编写了捕捉algorithm,该algorithm从鼠标位置计算光线,并find光线与最近几何体(点或线段)之间的线段。 我的场景完全是静态的,但可能包含太多的形状,这使得powershellsearch效率低下。 什么是索引现有几何的好方法,这样我就可以快速地过滤掉大部分几何graphics,并在我的捕捉algorithm中考虑一个更小的集合(大致在距离X内)? 我正在考虑做类似于OpenGL(我在我的应用程序中使用DirectX 9)提供的GL_SELECT选项,即在位图上呈现我的几何graphics,每个graphics使用不同的颜色编码。 不过,我有点担心,因为我将不得不使用隐藏窗口的第二个设备来实现这一点。 有没有可以使用的3D空间分区数据结构,可以有效地计算最近的光线邻居?

我应该检查游戏世界中的所有碰撞吗?

我正在开发2D游戏引擎,现在我正在devise碰撞系统。 我已经阅读了关于空间分区和四叉树的内容,并且我明白只有用户视图中的对象需要被绘制和检查碰撞。 所有对象,无论是否在用户视图中,都需要更新,但是如果用户视图外的对象与另一个对象发生冲突,会发生什么? 我的意思是: 我应该检查游戏世界中的所有碰撞,即使物体不在视野中吗?

我如何使用最less的资源来代表遥远但可访问的星星的集合?

我最近开始计划在Unity的项目,将为Android。 我有一个由超过15万颗恒星组成的数据库(如果I / O扼杀了开销,可能会削减这个数据库)。 游戏将有希望包含一个免费的探索宇宙创造的幻想,用户正在飞行在一个现实的星星表示。 目前我最关心的问题是,如何在创建现实环境的同时,将资源对手机的影响降至最低? 有人提到使用八叉树,这是明智的吗? 这是我期待创造的第一款游戏,所以任何帮助都会对这个新手大加赞赏!

在空间相交的矩形

我需要与空间中的4个完全不相交的MBR(MBR1,MBR2,MBR3,MBR4)相交100万个空间多边形(使用其最小边界矩形指定)。 MBR1,MBR2,MBR3和MBR4将整个空间分成4个不相交的部分。 为此,我写了下面的代码。 但是,事实certificate,代码运行速度非常缓慢,达到100万分。 有什么方法可以改进代码,使其运行速度更快一些。 如果是的话,那么有人可以请同样的帮助 //————————————————————————— struct MBR { double xRight, xLeft, yBottom, yTop; }; bool intersects(MBR spatialId,MBR mbr) { if (mbr.yBottom > spatialId.yTop || mbr.yTop < spatialId.yBottom) return false; if (mbr.xLeft > spatialId.xRight || mbr.xRight < spatialId.xLeft) return false; return true; } //————————————————————————— bool contains(MBR spatialId,MBR mbr) { if (mbr.yBottom > spatialId.yBottom || […]

我应该在哪里存储一个对象? – QuadTree

我正在devise一个用于场景分区的QuadTree,我已经阅读了理论并看到了一些代码示例。 当一个节点有4个以上的对象时,它将被分解成4个子节点,并将其中的对象放入其中,但是如果一个对象位于任何子节点的边缘,它将被放置在父节点中。 我为什么要这样做? 我认为最好把它放在每个碰撞的子节点上。 我错了吗? 。 我devise了一个模式来实现这个)。

平铺的地图,网格,空间分区

我正在尝试在我的一个游戏中创建一个地图,我想将这个地图分割成网格。 通过使网格包含固定数量的图块,我只需要渲染相机内可见的图块的部分(即当前位于相机视口内的网格)。 我现在的代码是: struct STileGrid { std::vector<STile*> TileList; // Upper left corner of the grid CVector2D StartPosition; // Lower right corner of the grid CVector2D EndPosition; }; ////////////////////////////////////////////////////////////////////////// // Hardcoded during testing const CVector2D WindowSize = CVector2D(1280.0f, 720.0f); // Number of horizontal/vertical tiles in the map const CVector2D MapSize = CVector2D(60.0f, 36.0f); const CVector2D TileSize […]

请有人向我解释八叉树碰撞?

我一直在阅读有关这个​​主题的所有东西,我觉得这些作品即将落到原地,但我不能完全理解。 我正在做一个太空游戏,在行星,船只,小行星和太阳之间发生碰撞。 这些对象中的每一个都可以细分为“块”,我已经实现了这些块来加速渲染(顶点可以在运行时经常改变,所以我分离了缓冲区)。 这些细分也有原始的testing碰撞。 所有这些对象都是由块组成的(是的,就是那种游戏)。 块也可以testing粗略的碰撞,但是由于记忆的原因它们没有单独的边界原语。 不过,我认为粗略的testing似乎已经足够了。 所以,碰撞需要相当精确。 在块分辨率。 有些function依赖于两个块的碰撞。 而且,攻击特定区块当然很重要。 现在我正在努力过滤我的碰撞对。 正如我所说,我已经阅读了很多关于Octrees的内容,但是由于很多教程很less,而且代码很less,所以我很难将其应用于我的情况。 我的主要问题是: 八叉树是重新计算每一帧,还是存储在内存中,当物体移动时,物体被洗进不同的分区? 尽管我读了所有的东西,但我仍然不清楚…这一切的含糊都令人沮丧。 Octrees进一步细分? 我的游戏中的行星相当大,而小行星更小。 我细分为行星的大小,还是小行星(行星在多个部门中)? 还是完全是其他的限制,如师的元素数量? 我应该将对象加载到八进制中作为“块”还是全部,然后再分成几块? 我想这可能是特定于我的实现。 我要问的是我的根需要多大,但我确实设法find了这个问题 ,第二个答案对我来说似乎足够了。 恐怕我并没有真正意识到通过添加新节点并在添加新对象时进行细分,可能是因为我对树是保存在内存中还是每帧重新计算感到困惑。

当世界被“分区”时,人工智能寻路等有什么可能的select?

如果你期望有一个持久的游戏世界,并且你不想因为过载而导致某些游戏服务器崩溃,那么你必须从一个大块的游戏世界中进行devise。 如果你想在云中运行你的游戏服务器,每个单独的虚拟机都是相对较长的一周,而内存和CPU则是非常重要的。 我认为这里面最大的挑战就是玩家收到化身位置周围的所有部分,但是怪物/怪物通常位于服务器本身,只能直接访问服务器拥有的世界部分数据。 那么我们如何才能使AI在这方面真实地performance呢? 它可以将查询发送给拥有相邻部分的其他服务器,但是这听起来相当networking密集且易于出现延迟。 将每个暴民AI分散到邻近的部分可能会更有效率,并主动将相关信息发送到包含实际暴徒atm的部分。 这也将减less跨越两部分边界的暴民的压力,因此“切换服务器”。 你有没有听说过解决这些问题的AIdevise? 某种分布式的AI大脑? 也许某种“代理”社区通过消息传递一起工作?

空间分区 – 比单元大的对象?

我正在开发一个自顶向下的2D平铺游戏。 最近我开始研究碰撞检测,并简单地使用了空间分区。 每个对象都属于一个单元格,并检查相邻单元格是否发生碰撞。 但是,我意识到我绝对会需要有一些比单个单元更大的碰撞盒。 有没有更好的algorithm,我需要什么或有一个简单的工作,我没有看到? 在此先感谢,仍然学习,所以任何帮助,非常感谢! 编辑:多个对象可以同时在一个单元格中。