游戏开发

专业和独立游戏开发人员的问答

1
如何从实体组件系统游戏引擎中的cpu缓存中受益?
我经常阅读ECS游戏引擎文档,这是明智使用cpu缓存的良好架构。 但是我不知道如何从cpu缓存中受益。 如果将组件保存在连续内存中的数组(或池)中,则只有在顺序读取组件的情况下,才是使用cpu缓存BUT的好方法。 当我们使用系统时,它们需要实体列表,这些列表是具有特定类型组件的实体列表。 但是这些列表以随机的方式而不是顺序地提供了组件。 那么如何设计ECS以最大化缓存命中率呢? 编辑: 例如,物理系统需要具有RigidBody和Transform组件的实体的实体列表(有一个RigidBody池和一个Transform组件池)。 因此,其更新实体的循环将如下所示: for (Entity eid in entitiesList) { // Get rigid body component RigidBody *rigidBody = entityManager.getComponentFromEntity<RigidBody>(eid); // Get transform component Transform *transform = entityManager.getComponentFromEntity<Transform>(eid); // Do something with rigid body and transform component } 问题在于,entity1的RigidBody组件可以在其池的索引2处,而entity1的Tranform组件在其池的索引0处(因为某些实体可以具有某些组件,而其他组件不能具有其他组件,并且是因为添加/删除了实体/组件)。 因此,即使组件在内存中是连续的,也会随机读取它们,因此它将有更多的缓存未命中,不是吗? 除非有一种方法可以预取循环中的下一个组件?


3
如何在n个玩家之间平均分配十六进制网格?
我正在制作一个简单的基于十六进制网格的游戏,我希望地图在玩家之间平均分配。该地图是随机创建的,我希望玩家拥有大约相等数量的单元,且区域相对较小。例如,如果地图上有4个玩家和80个像元,则每个玩家将有约20个像元(不必精确定位)。另外,每个玩家的相邻单元格不得超过四个。也就是说,在生成地图时,最大的“块”不能超过四个单元。 我知道这对两个或三个玩家来说并不总是可能的(因为这类似于“为地图着色”的问题),我可以为他们做其他解决方案(例如创建可以解决问题的地图)。但是,对于四到八名球员,我该如何解决这个问题?

6
如何围绕世界对齐的轴旋转对象?
我有一个Vector3,每个轴都有一个欧拉角。 通常,当我想创建旋转矩阵时,我将使用D3DXMatrixRotationX之类的函数从上方的旋转矢量传递相应的角度,然后将矩阵(ZXY)相乘以创建整体旋转矩阵,以用于形成完整的对象变换矩阵。 但是,此方法将在对象空间中产生一组旋转。也就是说,将向量(90,0,90)传递到我的方法中将在世界空间中有效地产生(90,90,0)的旋转。 有没有一种方法可以始终确保我的旋转矢量的每个分量导致围绕各自的世界空间对齐轴的旋转? 编辑: 这是当前情况的动画-我想要一种绕蓝色轴而不是红色轴旋转的方法。 编辑2: 只是要注意,我并不是在寻找涉及欧拉角的解决方案,而只是寻找一种可以表示围绕世界轴的多次旋转的变换的方法。

4
如何在视频游戏中创建3D模型?
游戏中的3D模型是如何设计和显示的?都是代码吗?画在纸上,然后在3D图形软件上,然后...什么? 当然,游戏程序员不会在代码中(无论是在Direct3D还是OpenGL中)都定义要绘制的每个形状(/对象)的每个顶点,因此,游戏设计师是否拥有可以使用的工具,例如Maya或类似的专有3D图形软件在那里;他们在该软件中“绘制”模型,以任何格式导出模型,然后程序员通过代码对其进行解析,并自动输入对象/模型的经解码/解析的原始顶点? 我在Google上搜索了很多东西,但是找不到可靠的东西来解释专业视频游戏的这一方面是如何工作的。

5
如何在我的游戏中实现既可访问,功能强大又可快速编写代码的编程系统?
我目前正在开发一款基于空间的沙盒游戏,该游戏将具有自定义系统编程功能的强大功能。我想以一种既可以实现又可以实现 无障碍, 强大(最低裸线将是图尔完备性) 快速编码。 基于文本的语言通常仅满足后两个要求,而设计满足前两个条件的视觉语言并不难,但由于需要大量使用鼠标,视觉语言很难编程。尽管有一些非常容易使用的基于文本的语言,但我希望完全的非程序员能够使自己轻松进行编程。


1
使程序生成的自上而下的景观变得有趣
我正在开发具有程序化世界的游戏。理想情况下,我想生成与《我的世界》世界一样美丽的风景。我的世界有峡谷,瀑布,山脉,起伏的丘陵和海洋等。但是由于这将是一种自上而下的游戏(实际上是3/4视角),所以我认为大多数游戏都是不可能的。主要原因是尝试从这个角度表示身高有多困难。塞尔达传说:通往过去的链接很好地创造了高度的错觉,但这很难在程序上重现,而且还引入了一些问题,例如最高的建筑物必须在地图的顶部。 因此,我想知道一些技巧,可以以自上而下的格式制作有趣的景观,而不必伪造第3维。(您不能在此游戏中创建或破坏地形,因此给了我们更多的灵活性。) 编辑:为了使事情更清楚一些,我正在尝试避免使用需要三维尺寸特征的世界。例如,我真的不能拥有连绵起伏的丘陵或山脉。可以添加哪些不需要伪造三维尺寸的景观特征?一个答案可能是增加河流,但这是显而易见的。

3
点对点的无主机竞争游戏?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 我想知道-有没有创造过以下游戏: 对等体,没有一个对等体被指定为主机 竞争(不合作,玩家互相对抗) 可证明是公平的(任何玩家都不可能作弊) 不要给任何玩家过多的信息(例如,不要向正在运行的应用程序泄露其他玩家的机密) 这样的游戏的一个例子是扑克游戏,其中每个玩家和他们的游戏只能知道自己的手,而不知道其他玩家的手而不依赖于他们中的任何一个。我知道有一些游戏可以证明是公平的,但是我所知道的全部都存在于服务器-客户端配置中。

5
为什么块大小通常是2的幂?
我的世界有很多Minecraft克隆版本,我正在着手自己的实现。地形渲染的原理是将整个世界分成固定大小的块,以减少局部更改的工作量。 到目前为止,在Minecraft中,块大小为16 x 16 x 256。在克隆中,我也总是看到块大小为2的幂。 是否有任何原因,可能与性能或内存有关?我知道2的幂在二进制计算机中起特殊作用,但与块大小有什么关系?

6
如何在路径(坐标列表)上行走时使角色变得流畅?
我有一个带有坐标的列表-从A *算法输出-我想使我的角色旋转顺畅地遵循此路径。 所以我有一个像A的东西,我想得到C 我怎样才能做到这一点 ? 编辑 为了使自己更清楚一点: 我对平滑转弯更感兴趣,因为我已经知道如何从一个节点转到另一个节点。 编辑 许多人认为这很有用(我也是如此),所以我发布了Daniel Shiffman的“代码的本质”的链接,他在其中讨论了许多游戏AI(和物理)问题,例如转向行为http://natureofcode.com/book/chapter- 6个自治代理/#chapter06_section8
15 c#  unity  path-finding 

6
开发人员是否应该使用新版本来简化他们的游戏?
新版本的游戏《愤怒的小鸟》似乎变得越来越容易。也许人们对打破新纪录的进步和满意度感到幻想? 我想知道,逐渐地对游戏进行细微的修改以增强用户的改进和学习意识是游戏开发中的已知/常见/标准做法。(我并不是说这种做法有什么问题。)

2
DOS游戏开发的典型工具链是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 9个月前关闭。 我想知道人们过去是怎么写DOS游戏的(例如Doom),我在这方面找不到很多东西,但是很想了解游戏开发的早期知识。 主要使用哪种语言? 我认为它是C。还是C ++? 哪些IDE(或编辑器/编译器)很流行? 当时AFAIK并不存在Microsoft Visual C / C ++(或我曾经以为是Microsoft C / C ++)。那么人们使用了什么呢?编辑和Intel的命令行编译器之类的东西? 使用了哪些API? 2D游戏有什么共同点?那么《毁灭战士》和《古墓丽影》等3D游戏呢? 与今天有什么不同吗? 我很高兴听到其他任何区别,例如使用了哪种图像/音频格式。

2
线宽可变的卡通/透明阴影?
我看到一些进行cel着色的广泛方法: 具有翻转法线的模型的复制和放大(对我而言不是一种选择) Sobel滤波器/片段着色器进行边缘检测的方法 模板缓冲区方法进行边缘检测 用于计算面法线和边缘法线的几何(或顶点)着色器方法 我是否假设以几何为中心的方法也可以最大程度地控制照明和线条粗细,这是正确的吗?对于可能会看到山的轮廓线逐渐合并成平原的地形? 如果我不需要地形表面的像素照明怎么办?(而且我可能不会,因为我计划使用基于单元的基于顶点或基于纹理贴图的照明/阴影。)那么我是否会更好地坚持使用几何类型方法,或者改为使用屏幕空间/片段方法?使事情更简单?如果是这样,我怎么会得到山上的“墨” 内网的剪影,而不是只有整个网格(的轮廓与轮廓内没有“墨水”的细节?(AKA 暗示的轮廓,折痕)。 最后,是否可以使用几何着色器廉价地模拟翻转法线方法?我对此的担心是,我当然可以复制每个单个顶点并相应地缩放它们,但是我将如何处理翻转法线和片段着色器中的不同着色? 我想要的-在轮廓内插入线来改变线的粗细... 我不要... 编辑:进一步的研究发现了以下... 由于我在地形上拥有大量顶点,因此即使考虑基于距离的LoD,由于所有对象的复制和缩放都涉及巨大的计算复杂性,因此无论是基于翻转法线还是基于几何着色器的方法(即使使用平截头体剔除)都不是明智的选择。上传的顶点。 考虑到我不需要在地形表面上以纯色阴影的形式进行逐像素照明,因此考虑基于面部法线的方法(否则需要正确的表面照明)也变得不太谨慎计算起来自然很昂贵。但是,他们确实提供了最好的控制权。例如,使用“艺术”笔触为边缘着色的能力:漂亮,但又不能在大规模复杂的游戏环境中真正实现。 我宁愿避免使用模板缓冲区,因为我希望在着色器中完成所有工作。(上面带有红色轮廓的示例是使用模板缓冲区-旧学校完成的。) 这样就留下了片段着色器的图像空间方法。计算复杂度降低为片段的数量,而不是顶点的数量(在我的情况下,这比几何着色器中的操作要少10-100倍)。为了生成一个g缓冲区(包括一个普通缓冲区和一个可选的深度缓冲区),需要多次渲染渲染,我们可以将不连续性滤镜(例如Sobel运算符)应用到该缓冲区。深度不连续性使轮廓和折痕产生暗示。我唯一的疑问是无法对墨迹边缘宽度进行更好的控制,尽管使用片段着色器中的正确算法,我相信这是可能的。 因此,现在的问题变得更加具体:我如何精确地在片段着色器中获得可变的边缘宽度,尤其是在外部轮廓上?

1
使用Kinect的3D点进行梯形校正
使用XNA,我正在显示一个投影到地板上的简单矩形。投影机可以放置在任意位置。显然,投影的矩形会根据投影机的位置和角度而变形。Kinect会扫描地板以寻找四个角。现在,我的目标是对原始矩形进行变形,以使投影不再因基本对矩形进行预变形而变形。 我的第一种方法是在2D模式下做所有事情:首先计算透视变换(使用OpenCV的 warpPerspective()),从扫描的点到内部矩形的点,然后将逆应用于矩形。这似乎可行,但速度太慢,因为无法在GPU上渲染。 第二种方法是使用3NA进行所有操作,以便使用XNA的渲染功能。首先,我将显示一个平面,使用Kinect扫描其角并将接收到的3D点映射到原始平面。从理论上讲,我可以像在2D方法中一样,将透视变换的逆应用于平面。但是,由于XNA使用视图和投影矩阵,所以我不能只调用诸如之类的函数warpPerspective()并获得所需的结果。我需要为相机的视图和投影矩阵计算新参数。 问题:是否可以计算这些参数并将它们分为两个矩阵(视图和投影)?如果没有,我还有其他方法可以使用吗?
15 xna  2d  3d  projection  kinect 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.