游戏开发

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

2
体素面爬行(简化网格,可能使用贪婪)
编辑:这只是出于我自己的学习经验,并不是出于性能原因而问这个问题。 这是关于Minecraft类地形引擎的。我以块的形式存储块(以块的形式存储16x256x16块)。生成块时,我使用多种过程技术来设置地形和放置对象。生成时,我为整个块(是否有实体)保留一个1D数组,并为实体块保留一个单独的1D数组。 生成后,我遍历实体块以检查它们的邻居,以便仅生成没有实体邻居的块面。我将要生成的面孔存储在自己的列表中(这是6个列表,每个可能的面孔/正常面孔一个)。渲染块时,我渲染相机当前块中的所有列表,而所有其他块中仅渲染面向相机的列表。通过将所有6个列表存储在一个缓冲区中来完成此操作,然后只需更改绘制的范围即可。 结合使用2D地图集和Andrew Russell提出的这个小技巧,我想将相似的面孔完全融合在一起。也就是说,如果它们在相同的列表中(相同的标准),彼此相邻,具有相同的光照水平等。我知道我仍然会以矩形结尾,但是这样可以轻松地将我的顶点数减少50%如果我的估计正确的话,还是更好。 我的假设是将6个列表中的每个列表按其所在的轴排序,然后再按其他两个轴排序(块顶部的列表按其Y值,X,Z排序)。 仅此一项,我就可以很容易地合并面带,但我希望尽可能地合并多个面带。我已经阅读了这个贪婪的网格划分算法,但是在理解它时遇到了很多麻烦。 所以,我的问题是:要按照描述的那样进行人脸合并(忽略对动态地形/照明是否是个坏主意),也许有一种算法更易于实现吗?我也很乐意接受一个答案,它以一种更简单的方式(链接或解释)引导我完成贪婪算法。 我不介意如果它更容易实现,甚至比仅做剥离要好一点,性能都会略有下降。我担心大多数算法都将注意力集中在三角形而不是正方形上,并以我的方式使用2D地图集,我不知道我可以根据当前的技能来实现某些三角形。 PS:我已经对每个块都进行了截锥体剔除,并且如上所述,我也剔除了实体块之间的面。我还没有遮挡剔除,可能永远不会。 *编辑:我实现了自己的小技巧,可能有一个名字,但是我只是简单地浏览了我的6个列表,这些列表按照它们所靠的轴,其次是块类型,然后是照明级别进行了排序。我遍历它们,同时创建新的矩形并同时进行扩展(偏向某个轴)。绝对不是最佳选择,但确实非常快,并且确实使我的顶点数平均降低了近50%。Byte56的评论是我认为是真正答案的壁橱,但我不能选择它作为答案/赏金。 这是在生成完整的初始地形后无需进行任何优化的情况下处理此问题的快速简便的方法。假定给定的所有正方形都是相同的图像,光照水平,法线等。每种颜色都是我要渲染的不同四边形。根据我的列表的排序方式,这是一种非常简单/快速的方法。

1
2D水顶面轮廓
我正在尝试使用顶点片段着色器创建水表面厚度的效果。 我在3D游戏环境中,但是它是滚动视图,所以是“ 2D”视图。 这是一个使用片段着色器在真实2D中创建这种效果的很好的教程。 但是我认为这不能用于我的情况。目前,我只有一架飞机要折射。 我想应用水厚效果。但是我不知道该怎么做。 我暂时不尝试使用顶点创建一些水变形/位移,这不是重点。 我不知道是否可以使用简单的四边形,也许我应该使用这样的对象。 这里有些例子。 我对如何产生这种效果一无所知。 非常感谢 ! [ 编辑 ]添加了雷曼水效果以更好地参考效果。

2
具有两个角的对角线视线
现在,我正在使用Bresenham的线算法来获取视线。问题是我发现了一个边缘情况,玩家可以透过墙壁看。当玩家注视着墙的两个角之间,且在另一侧有特定角度的间隙时发生。 我想要的结果是将两堵墙之间的瓷砖标记为无效。 修改布雷森汉姆线算法以解决此问题的最快方法是什么?如果没有好的解决方案,是否有更合适的算法?任何想法都欢迎。请注意,该解决方案还应该能够支持3d。 编辑:我的简单解决方案是检查直线的x和y坐标更改时两个角是否都闭合。有关完整产品的工作源代码和交互式演示,请参见http://ashblue.github.io/javascript-pathfinding/

2
如何定义充满水的区域?
我想通过漂亮的水仿真来增强我的小游戏引擎。首先,我需要找到一种在游戏中代表水的正确方法。不幸的是,我对代表的了解不多,所以我问你。我前段时间也曾问过类似的问题。但是由于我没有明确提出问题,答案是正确的,但不是我想要的。 在某些游戏中,水只是由高度确定的。例如,零高度以下的所有物体都在水下。我在大多数游戏中都看到了这种表现。问题是我希望在户外世界中不被淹没的洞穴以及每个湖泊和海洋的水位都不同的洞穴。 水的出现的另一种更精确的表示是颗粒。每个水滴都作为点存储在世界空间中。要渲染它们,我可以使用诸如metaball之类的技术,以便它们构建单个网格。这种表示形式对于现实主义非常有用,因为我可以轻松地计算出它们之间的动态关系。令人遗憾的是,没有机器可以实时计算大量的元弹。 还有其他方法可以代表发动机中的水吗?我想拥有动态湖泊,因此无法通过静态几何图形定义水域。例如,如果玩家修改地形以加宽湖泊,则水应填充该海湾,而湖泊的总水位应略有降低。

1
是否有任何游戏引擎能够实现真正的双耳位置3D音频?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我绝不是游戏设计师,所以如果我没有使用正确的术语,我会提前道歉。随时纠正我的错误。 我的理解是,目前,在大多数(如果不是全部)第一人称射击游戏中(例如L4D2或《生化奇兵》),“ 3D音频”是通过考虑玩家在游戏中的位置和位移而产生的,但主要是通过玩上 平衡(指示声音来源的方向), 振幅(指示播放器与声音源之间的距离)。 但是,对于心理学实验,我想让我的受试者使用与头部相关的传递函数(HRTF),使用真正的双耳位置3D音频播放自定义的第一人称射击游戏。如果您不知道我在说什么,我邀请您在此URL收听双耳录音。 我知道只有一款使用真正的双耳位置3D音频的游戏:Papa Sangre,但这不是FPS。 我的问题(所有相关问题)是: 可以使用任何当前可用的游戏引擎(Valve的Source?)来设计此类FPS游戏吗? 如果对1.的回答为是,那么您是否有任何有用的链接? 如果对1.的回答为“否”,那么是否已经宣布了具有这种奇迹的游戏引擎? 是否有迹象表明真正的双耳定位3D音频将在未来的FPS游戏中很快找到位置?(我当然希望如此!)

3
如何避免被节制?
我正在写一个联网的iOS游戏。当以每秒60个数据包(即相邻数据包之间的16毫秒)发送数据包GKMatchSendDataReliable(我假设是UDP并写有自己的数据包接收代码)时,平均ping时间迅速恶化:我在下面打开了7个GameCenter匹配项(一个接一个) ),然后简单地发送了100个数据包(每秒60个数据包)。我测量了平均往返时间,结果如下: [ 21:16:39 ]: I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms [ 21:16:34 ]: I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms [ 21:16:45 ]: I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 ms …
9 networking  udp 

2
没有Java运行时相关性的情况下,如何分发桌面Java游戏?
是否有可能将Java应用程序转换为“开箱即用”运行的独立程序包?最终用户不需要安装任何Java JRE,安装程序也不必包含JRE并为该用户安装。 最终发行版应包含一个本机可执行文件(希望适用于Windows,Mac和Linux),以及常规数据文件和任何其他JAR(如果需要)。我不是在专门寻找“一个文件”解决方案-我实际上是希望数据文件不被混淆。 如何才能做到这一点?

1
优化重型片段着色器的性能
我需要帮助优化以下一组着色器: 顶点: precision mediump float; uniform vec2 rubyTextureSize; attribute vec4 vPosition; attribute vec2 a_TexCoordinate; varying vec2 tc; void main() { gl_Position = vPosition; tc = a_TexCoordinate; } 分段: precision mediump float; /* Uniforms - rubyTexture: texture sampler - rubyTextureSize: size of the texture before rendering */ uniform sampler2D rubyTexture; uniform …

3
如何在回合制游戏中提升实体组件的游戏状态?
到目前为止,我所使用的实体组件系统的工作原理基本上类似于Java的artemis: 组件中的所有数据 无状态独立系统(至少达到在初始化时不需要输入的程度)对仅包含特定系统感兴趣的组件的每个实体进行迭代 所有系统都处理它们的实体一tick,然后整个过程重新开始。 现在,我尝试将其首次应用于基于回合的游戏,在继续进行之前,必须以相对于彼此的固定顺序进行大量事件和响应。一个例子: 玩家A受到剑的伤害。对此,A的装甲可以踢进并降低受到的伤害。由于变得越来越弱,A的移动速度也会降低。 所遭受的损害是引起整个互动的原因 必须先计算护甲并将其应用于即将来临的伤害,然后再将伤害应用于玩家 直到实际造成伤害之后,才能将移动速度降低应用于某个单位,因为它取决于最终伤害量。 事件还可以触发其他事件。使用装甲减少剑的伤害会导致剑破碎(这必须在伤害减少完成之前进行),进而会引起其他事件,这实际上是对事件的递归评估。 总而言之,这似乎导致了一些问题: 很多浪费的处理周期:大多数系统(保存总是运行的东西,例如渲染)在没有“轮到他们”工作的时候根本没有任何值得做的事情,并且花费大部分时间等待游戏进入有效的工作状态。这会给每个这样的系统带来很多麻烦,随着越来越多的状态添加到游戏中,这些检查会不断增长。 为了确定系统是否可以处理游戏中存在的实体,他们需要某种方式来监视其他不相关的实体/系统状态(负责处理损害的系统需要知道是否已使用装甲)。这要么使系统承担多重责任,要么产生对其他系统的需求,而没有其他目的,只能在每个处理周期之后扫描实体集合,并通过告诉侦听器何时可以做某件事与一组侦听器进行通信。 以上两点假设系统在同一组实体上运行,最终使用其组件中的标志更改状态。 解决此问题的另一种方法是,由于单个系统的工作而增加/删除了组件(或创建了全新的实体),从而提高了游戏状态。这意味着,每当系统实际具有匹配实体时,它都知道可以对其进行处理。 但是,这使系统负责触发后续系统,因此很难对程序行为进行推理,因为单个系统交互不会导致错误的出现。添加新系统也变得更加困难,因为无法在不知道它们如何影响其他系统的情况下无法实施它们(并且可能必须修改先前的系统以触发新系统感兴趣的状态),这有点违反了拥有单独系统的目的一个任务。 这是我必须忍受的东西吗?我所看到的每个ECS示例都是实时的,并且很容易看到这种“每游戏一个迭代”循环在这种情况下的工作方式。而且我仍然需要它来进行渲染,这似乎真的不适合每次发生某些事情时都会暂停其大部分功能的系统。 是否存在一些适合于此的将游戏状态向前移动的设计模式,还是我应该将所有逻辑移出循环而仅在需要时才触发它?

2
如何将Editline用于游戏机控制台?
我想向我正在创建的C ++游戏中添加游戏机控制台。尽管渲染了控制台并解析了我擅长的命令,但是文本输入和编辑方面(例如,处理向左/向右键,退格键等)似乎要花很多精力,我宁愿花在更有趣的事情上。 我设法找到了一个名为Editline的库,该库可处理具有历史记录和自动完成功能的控制台式文本输入的精髓,但是我不确定如何将其与游戏接口-特别是所有示例我发现使用标准输入和输出句柄,readline()它本身是一个阻塞调用。我需要能够提供自己的输入并将控制台呈现为自己的输出,并且还需要确保游戏循环继续运行。 我应该怎么做呢?
9 c++  text-based 

2
如何找到弹丸的发射角度?
我正在制作一个2D游戏,其中各单位互相射箭。我知道射手和目标的位置以及弹丸的初始速度。我想知道弹丸落在目标上的角度。目标的高度可能与射手的高度不同。 综上所述,我知道v0,R和g,我需要找到角度(或高度?)。 我阅读了http://en.wikipedia.org/wiki/Projectile_motion,但是找不到与我需要的东西相关的东西。

5
如何在不重新启动的情况下从选项屏幕更新显示设置?
我目前正在使用Allegro 5和boost在C ++ 11中创建2D RPG。 我的目标是在“选项”菜单中更改选项后以某种方式更新我的游戏设置。我不想强迫用户重新启动我的游戏。其他游戏在更改分辨率或从全屏模式切换到全屏模式时不需要重启,因此我的游戏也不需要重启。请在下面查看系统的简化视图。 请注意,我不一定要直接从OptionsScreen调用我的Game对象。虚线仅仅是为了说明我要达到的效果。当在系统的不同部分中更改选项时,以某种方式导致游戏更新。 详细说明 ScreenManager包含GameScreen当前存在的所有对象的列表。这些将是游戏中的各种屏幕,包括弹出窗口。该设计或多或少地遵循C#/ XNA中的游戏状态管理示例。 在ScreenManager包含了我的参考Game对象。该Game对象初始化和修改游戏的设置。如果要更改分辨率,请全屏播放或静音,这是我在Game课堂上要做的。 但是,OptionsScreen当前无法访问Game类。见下图: GameScreen可以发信号三个事件onFinished,onTransitionStart和onTransitionEnd。没有,onOptionsChanged因为只有一个屏幕可以做到这一点。ScreenManager无法为此设置事件处理,因为它将所有屏幕都处理为GameScreen。 我的问题是,如何更改设计以使OptionsMenu中的更改不需要重新启动,而是立即更改?我最好Game在单击“应用”按钮后请求更新我的对象。

1
如何异步加载图形资源?
让我们考虑与平台无关的问题:我想在游戏其余部分运行时加载一些图形资源。 原则上,我可以将实际文件加载到单独的线程上,也可以使用异步I / O。但是对于图形对象,我将不得不将它们上传到GPU,并且(通常)只能在主线程上完成。 我可以将游戏循环更改为如下所示: while true do update() for each pending resource do load resource to gpu end draw() end 同时有单独的线程将资源从磁盘加载到RAM。 但是,如果有很多大资源要加载,这可能会导致我错过帧截止日期并最终丢失帧。所以我可以将循环更改为此: while true do update() if there are pending resources then load one resource to gpu remove that resource from the pending list end draw() end 每帧仅有效加载一个资源。但是,如果要加载许多小资源,则加载所有小资源将花费许多帧,并且将浪费大量时间。 理想情况下,我想按以下方式安排加载时间: …

1
如何创造高质量和快速的门户效果?
编辑:因此,我获得了门户视觉效果,而没有性能受到影响,并且物理设置了对象,其中刚体无缝地通过门户,而角色控制器的对象无缝地通过门户。我现在要弄清楚的唯一事情是混合两个摄影机视图,以获得适当的第一人称过渡效果。关于如何将两者融合的任何想法?我在考虑使用仅深度着色器或标准化视口rect的东西。我的主要问题是实时计算角度和角度。 因此,我一直在努力在Unity3D中创建门户效果。显然,我将Valve的Portal视为对此编程的重要影响。目前,我只是使用摄像机的渲染纹理来获得图形效果,然后使用一些代码来完成其余的工作。问题是在2048x2048分辨率下,它的质量与Portal一样高,但会导致严重的FPS损失。为了解决这个问题,我要么必须降低纹理质量,要么必须降低更新纹理的次数。 Valve在不造成高帧频损失的情况下实现了高质量的门户效果。我该怎么做?有没有人有很好的想法可以渲染到高分辨率纹理而不引起帧丢失? 我正在考虑制作自己的代码以渲染到纹理,而不是使用Unity的内置系统,这是可行的,但肯定会很麻烦。因此,任何想法,想法或建议都将受到高度赞赏。
9 unity  valve  portals 

2
无人机定位
想象一个“无人机”和一个二维平面上的目标点。有八个参数: P = my position Q = target position V = my velocity I = my moment of inertia w = my angular velocity s = my angular position T = max thrust U = max torque (我们只是说目标是固定的) 无人机的工作是尽可能快地到达目标,并遵守最大扭矩和最大推力。只有两种方式施加扭矩,因为这仅在2d平面中。推力仅限于相对于飞行器方向的一个方向,并且不旋转无人机就无法瞄准。忽略任何阻力,您可以假装它在2D外部空间中漂浮。假设无人机t每隔一段时间(例如每0.01秒一次)检查一个方程式,插入参数,并相应地调整其扭矩和推力。推力和扭矩方程应该是什么?

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.