游戏开发

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

3
用AA渲染线的最快方法,DirectX中的线宽变化
因此,我正在做一些DirectX开发,确切地说是在.NET下使用SharpDX(但DirectX / C ++ API解决方案适用)。我正在寻找使用DirectX在正交投影中渲染线的最快方法(例如,模拟科学应用程序的2D线图)。 我尝试渲染的各种情节的屏幕截图如下: 这类绘图具有数百万个线段,可变厚度,是否带有每行抗锯齿(或全屏AA开/关)的情况并不少见。我需要非常频繁地更新线条的顶点(例如20次/秒),并尽可能多地卸载GPU。 到目前为止,我已经尝试过: 软件渲染(例如GDI +)的性能实际上并不差,但显然在CPU上很沉重 Direct2D API-比GDI慢,尤其是在启用抗锯齿功能时 Direct3D10使用此方法在CPU端使用顶点颜色和细分来模拟AA。也很慢(我分析了它,花费了80%的时间用于计算顶点位置) 对于第三种方法,我使用“顶点缓冲区”将三角带发送到GPU,并每200毫秒用新顶点更新一次。100,000个线段的刷新率约为5FPS。我理想地需要数百万! 现在,我在想最快的方法是在GPU上进行细分,例如在Geometry Shader中。我可以将顶点作为线列表发送,也可以打包成纹理,然后在“几何着色器”中解包以创建四边形。或者,只需将原始点发送到像素着色器,然后在像素着色器中完全实现Bresenham Line绘图。我的HLSL是2006年的生锈着色器模型2,所以我不了解现代GPU可以完成的疯狂工作。 所以问题是:-有人做过吗,您有什么建议可以尝试吗?-您对通过快速更新几何来提高性能有什么建议(例如,每20毫秒创建一个新的顶点列表)? 1月21日更新 从那以后,我已经使用LineStrip和Dynamic Vertex Buffers使用Geometry Shader实现了上述方法(3)。现在我以100k点获得100FPS,以1,000,000点获得10FPS。这是一个巨大的改进,但是现在我的填充率和计算能力受到限制,因此我开始考虑其他技术/想法。 线段几何的硬件实例化如何? Sprite Batch呢? 其他面向(像素着色器)的方法呢? 我可以有效地淘汰GPU或CPU吗? 您的意见和建议深表感谢!
14 2d  directx  shaders 

8
如何为单人游戏生成Spritefonts
我只想使用以下方法在屏幕上呈现一些文本: 单机游戏3.0 MS Visual Studio 2010 C#Express 在XNA中,您可以轻松地将字体添加到内容管道。但这在单人游戏中似乎并非如此。使用加载TTF文件Content<SpriteFont>.Load()不起作用。有什么方法可以生成或下载* .spritefont文件或包含字体数据的* .xnb文件(无须安装XNA)?
14 xna  monogame 

3
如何缩小像素画?
有很多算法可以放大像素画。(我喜欢HQX,个人)。但是否有任何显着的算法,它的规模下来?我的游戏的设计分辨率为1280x720,但如果以较低的分辨率播放,我仍然希望它看起来不错。 大多数像素艺术讨论都围绕320x200或640x480升级到控制台模拟器中使用,但我想知道像Monkey Island Remake这样的现代2D游戏在较低分辨率下会看起来不错吗? 当然,可以忽略拥有多种资产版本的选择(即mipmapping)。

5
如何优化顺序重要且碰撞是基于对象组的条件的碰撞引擎?
如果这是您第一次遇到此问题,建议您先阅读下面的更新前部分,然后阅读本部分。 不过,这是问题的综合内容: 基本上,我有一个带有网格空间分区系统的碰撞检测和解决引擎,碰撞顺序和碰撞组很重要。一次必须移动一个身体,然后检测碰撞,然后解决碰撞。如果我一次移动所有物体,然后生成可能的碰撞对,则显然速度更快,但是由于不遵守碰撞顺序,因此分辨率会下降。如果我一次移动一个身体,我将不得不让身体检查碰撞,这将成为一个^ 2问题。将组混合在一起,您可以想象为什么在很多身体上它变得非常慢。 更新:我已经为此付出了很多努力,但是无法优化任何东西。 我成功实现了Will所描述的“绘画”,并将组更改为位集,但这是非常非常小的加速。 我还发现了一个大问题:我的引擎取决于冲突顺序。 我尝试了一种独特的碰撞对生成的实现,该实现肯定可以大大加快一切,但是却破坏了碰撞的顺序。 让我解释: 在我的原始设计中(不生成对),发生这种情况: 一个身体移动 移动后,它会刷新其单元格并使其碰撞到的身体 如果它与需要解决的物体重叠,则解决碰撞 这意味着,如果一个物体移动并撞到墙壁(或任何其他物体),则只有已移动的物体才能解决其碰撞,而另一个物体将不受影响。 这是我想要的行为。 我了解到物理引擎并不常见,但对于复古风格的游戏却有很多优势。 在通常的网格设计(生成唯一对)中,会发生以下情况: 所有身体移动 在所有身体移动之后,刷新所有单元格 生成唯一的碰撞对 对于每对,处理碰撞检测和解决 在这种情况下,同时移动可能会使两个物体重叠,并且它们将同时分解-这有效地使物体“相互推挤”,并破坏了与多个物体的碰撞稳定性 这种行为对于物理引擎是很常见的,但在我的情况下是不可接受的。 我还发现了另一个主要问题(即使在现实情况中不太可能发生): 考虑A,B和W组的身体 A与W和A相撞并解决 B与W和B相撞并下定决心 A对B无能为力 B对A无所作为 可能存在许多A主体和B主体占据同一个单元的情况-在这种情况下,主体之间存在很多不必要的迭代,这些迭代不能相互反应(或仅检测碰撞但不能解决它们) 。 对于占据同一单元的100个物体,这是100 ^ 100次迭代!发生这种情况是因为没有生成唯一对 -但是我无法生成唯一对,否则我将得到我不希望的行为。 有没有一种方法可以优化这种碰撞引擎? 这些是必须遵守的准则: 碰撞顺序非常重要! 身体必须一次移动一个,然后一次检查一个碰撞,然后一次移动一个就解决。 机构必须具有3个群组位组 组:身体所属的组 GroupsToCheck:人体必须检测到碰撞的组 GroupsNoResolve:团体不能解决的碰撞 在某些情况下,我只希望检测到碰撞但不能解决 更新前: 前言:我知道优化此瓶颈不是必需的-引擎已经非常快。但是,出于娱乐和教育目的,我很想找到一种使引擎更快的方法。 我正在创建一个通用的C ++ 2D碰撞检测/响应引擎,重点是灵活性和速度。 这是其架构的非常基本的图: …

3
在六角形网格上找到最短路径
我正在写一个带有一些模拟元素的回合制游戏。我目前挂着的一项任务是寻找路径。我想做的是利用AI当前的x,y和目标x,y将AI冒险者每转一圈,使其离目标越来越近。 在自己弄清楚这个问题的过程中,我可以确定使用4个方向没问题 dx = currentX - targetY dy = currentY - targetY 但我不确定如何确定6个方向中的哪个实际上是“最佳”或“最短”路线。 例如,按照当前的设置方式,我使用东,西,NE,NW,SE,SW,但要转到NE磁贴,我先向东移动然后向西北移动,而不是仅向西北移动。 我希望这不是全部。即使只是一两个链接就可以让我入门也很好。我发现的大多数信息都是关于绘制网格并增加所需的怪异坐标系。

5
避免在DirectX 10着色器中使用if语句?
我听说应该在着色器中避免if语句,因为语句的两个部分都将被执行,并且错误的语句将被丢弃(这会损害性能)。 在DirectX 10中仍然存在问题吗?有人告诉我,只有正确的分支才能执行。 对于该示例,我有以下代码: float y1 = 5; float y2 = 6; float b1 = 2; float b2 = 3; if(x>0.5){ x = 10 * y1 + b1; }else{ x = 10 * y2 + b2; } 还有其他方法可以使其更快吗? 如果是这样,该怎么办? 两个分支看起来都相似,唯一的区别是“常量”的值(y1, y2, b1, b2对于Pixel Shader中的所有像素都是相同的)。

2
加快程序纹理的生成
最近,我开始研究在程序生成的太阳系中进行的游戏。经过一番学习之后(之前都没有使用Scala,OpenGL 2 ES或Libgdx进行过学习),我进行了一个基本的技术演示,您将围绕一个程序化纹理的行星旋转: 我遇到的问题是纹理生成的性能。我正在做的事情的简要概述:行星是已变形为球体的立方体。每一面都应用anxn(例如256 x 256)纹理,该纹理捆绑在一个8n xn纹理中,并发送到片段着色器。最后两个空格未使用,它们仅用于确保宽度为2的幂。使用在'Simplex'论文中链接的2012年更新的单纯形噪声算法,当前正在CPU上生成纹理。噪音消失了。我用来测试算法的场景包含两个球体:行星和背景。两者都使用由六个八度的3D单工噪声组成的灰度纹理,因此,例如,如果我们选择128x128作为纹理大小,则有128 x 128 x 6 x 2 x 6 =约120万个噪声函数调用。 您最接近地球的是屏幕快照中显示的内容,并且由于游戏的目标分辨率为1280x720,这意味着我希望使用512x512纹理。结合这样的事实,实际的纹理当然比基本噪声要复杂(白天和黑夜的纹理,将基于阳光和镜面反射的片段着色器混合在一起。我需要大洲的噪声,地形颜色变化,云层,城市的灯光等),而我们正在寻找的是512 x 512 x 6 x 3 x 15 =仅此星球就需要7,000万个噪声的东西。在最终游戏中,行星之间旅行时会有活动,所以等待5或10秒(可能是20秒)是可以接受的,因为我可以在旅行时计算背景纹理,尽管显然速度越快越好。 回到我们的测试场景,我的PC上的性能并不是太糟糕,尽管考虑到最终结果将比原来差60倍,但仍然太慢了: 128x128 : 0.1s 256x256 : 0.4s 512x512 : 1.7s 这是在我将所有对性能至关重要的代码移至Java之后的事情,因为在Scala中尝试这样做要差得多。但是,在我的手机(三星Galaxy S3)上运行它会产生更成问题的结果: 128x128 : 2s 256x256 : 7s 512x512 : 29s 已经太长了,这甚至没有考虑到最终版本将是分钟而不是秒的事实。显然需要做些事情。就个人而言,我看到了一些潜在的途径,尽管我并不特别热衷于其中任何一种: 不要预先计算纹理,而是让片段着色器计算所有内容。可能不可行,因为有一次我将背景作为具有像素着色器的全屏四边形,并且手机上的速度约为1 fps。 …

1
栅格上的正交单位转换不匹配(例如64像素转换不正确)
我正在寻找一些有关网格上单位翻译的小问题的见解。 更新并解决 我解决了自己的问题。有关详情,请参见下文。帖子的这一部分中的所有内容都证明是正确的。如果有的话,它可以作为下一个人的微型教程/示例/帮助。 设定 FBO,VAO,VBO 512x448窗口 64x64格 gl_Position = projection * world * position; projection由定义。ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);这是一本教科书正交投影函数。 world 由摄像机在(0,0)的固定位置定义 position 由子画面的位置定义。 问题 在下面的屏幕截图(1:1缩放)中,网格间距为64x64,我在(64,64)处绘制了单位,但是该单位在错误的位置绘制了大约10px。我尝试过使用统一的窗口尺寸来防止像素大小出现任何失真,但是现在我在提供1:1像素到世界单位的投影时失去了正确的方式。无论如何,这里有一些有助于解决问题的快速图像。 我决定在什么引擎认为是64个偏移超级强加一堆精灵。 当这似乎过的地方,我去约,做了1个单位的基本情况。似乎按预期排列。黄色显示移动差异为1px。 我想要的是 理想情况下,在任何方向上移动64个单位将输出以下内容(叠加的单位): 顶点 看来进入顶点着色器的顶点是正确的。例如,参考第一个图像,数据在VBO中如下所示: x y x y ---------------------------- tl | 0.0 24.0 64.0 24.0 bl | 0.0 0.0 -> 64.0 0.0 tr | …

4
Unity3D游戏引擎“收益回报www”的基本机制
在Unity3D游戏引擎中,用于获取远程数据的常见代码序列如下: WWW www = new WWW("http://remote.com/data/location/with/texture.png"); yield return www; 这里的潜在机制是什么? 我知道我们使用yield机制以便在下载完成时允许处理下一帧。但是,当我们这样做时,幕后到底是怎么回事yield return www? 正在调用什么方法(如果有,在WWW类上)?Unity是否使用线程?是“上部” Unity层掌握了www实例并做了什么? 编辑: 这个问题专门关于Unity3D内部。我对解释yield语句在C#中的工作方式不感兴趣。相反,我正在寻找有关Unity如何处理这些构造的内部视图,例如,允许WWW以分布式方式跨多个框架下载一条数据。
14 unity 


2
在另一个游戏中嵌入IF文本解析器?
我可以在其他游戏或应用程序中嵌入任何现有的交互式小说文本解析引擎吗? 我希望将某些东西用作库。我可以从自己的角度传递可用的宾语和动词。它将解析用户的句子,并给我返回描述用户要求的某种结构/ AST。然后,我自己的代码可以根据该请求执行操作。 我不需要SIRI等级的东西。当前的IF游戏支持的简单句子和动作很好。但是我不想自己写一个完整的文本/句子解析器。 这不是一个If游戏,我无法完全使用像notify 7这样的交互式小说语言来编写它。不幸的是,我似乎找不到任何使用这些引擎的文本解析功能的人,而没有编写整个游戏的例子。以该引擎的语言进行游戏。

2
为什么树木在背景中发光?
目前,我正在黑暗中创建森林场景,而树木在遥远的地方闪闪发光,但是当我靠近时,它们就很好了。我已将着色器设置为“自然/树软遮挡[树皮/叶子]”,但它们仍在很远的地方渲染出奇特效果,但在关闭时效果很好。 我尝试将树木放置在名为“环境光遮挡”的文件夹中,就像这里所说的那样,但是没有运气。雾也被关闭。提前致谢。 更新 当我使用“渲染路径”相机查看树木时,它们显示为红色,而其他所有颜色均为绿色。 更新2 我尝试重新安装从中下载这些软件包的程序包,但是仍然没有运气。 更新3 我已经手动添加了一些树,它们可以正常工作,但是通过在地形上绘画来添加它们时出现了问题。 最后更新 我尝试构建游戏,以查看这是否对.exe有影响,但没有。因此,当我调试它时,我只需要忽略它,因为它可以在构建中正常工作。感谢所有的帮助,这似乎是一个统一的错误。构建图片:
14 unity  shaders  terrain  tree 


2
在Unity中哪里附加全局脚本?
就Unity中的Iknow而言,每个脚本都必须附加到一个对象。但是全局脚本是怎么回事?例如,在类似俄罗斯方块的游戏中,应该将元素生成器和移动器脚本附加到哪个对象?还是元素应自行处理其运动?是否有针对此问题的最佳实践?
14 unity 

3
Apple II上的游戏开发是什么样的?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 不久前,我曾问过一个有关DOS开发的类似问题,并且得到了一个很好的答案: DOS游戏开发的典型工具链是什么? 现在,我想知道70年代末80年代初Apple II上的游戏开发是什么样的。我主要对早期的II和II +感兴趣,但我也希望得到有关IIe等的答案。 所以这是我的问题: 使用了哪些语言? 我假定使用6502汇编器,但是BASIC被捆绑在一起,可能也使用了很多。您能想到用BASIC编写的流行游戏吗?C呢? 6502汇编程序的开发是什么样的? 我注意到,如果启动系统监视器,则可以直接输入操作代码,甚至可以直接使用mini汇编程序执行汇编程序。但是我无法想象游戏是这样写的,是否有编辑/ IDE?程序如何存储在磁盘/磁带上? BASIC开发是什么样的? Apple II BASIC解释器还不错,我想您可以在其中编写完整的程序。我也想让您保存/加载程序,我想是磁盘/磁带。但是,没有视觉编辑器吗? 是否有API或中间件? 或者,如果您想绘画或播放声音,是否必须一直与硬件直接对话?那里有图书馆吗? 与今天有什么不同吗? 我很高兴听到其他任何区别,例如使用了哪种图像/音频格式。如果我理解正确,实际上并没有文件的概念,我想知道它是如何工作的。您是否需要在汇编器中键入图形和声音?这在BASIC中是如何工作的?
14 editors  ide 

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.