Questions tagged «optimization»

修改软件以使其某些部分更有效地工作或使用更少的资源的过程。通常,这意味着它执行得更快,或者需要更少的资源。

3
您如何为内存不足情况做准备?
对于范围界定明确的游戏而言,这可能很容易,但是问题是关于沙盒游戏,允许玩家创建和构建任何东西。 可能的技术: 使用上限的内存池。 删除不再需要的对象。 在开始时分配额外的内存,以便以后可以将其作为恢复机制释放。我会说大约2-4 MB。 这在移动/控制台平台上更可能发生,在该平台上,内存通常受到限制,与您的16 GB PC不同。我假设您完全控制了内存分配/释放,并且不涉及垃圾回收。这就是为什么要将其标记为C ++。 请注意,我并不是在谈论有效的C ++项目7“为内存不足的情况做准备”,尽管这很相关,但我希望看到一个与游戏开发更相关的答案,您通常会对游戏开发有更多的控制权发生。 总而言之,当您针对内存控制台/移动设备有限的平台时,如何为沙盒游戏的内存不足情况做准备?



2
延迟着色渲染器中用于几何传递的常见渲染优化技术是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我一直在使用OpenGL 3和C ++(以及用于窗口管理的glfw)开发游戏引擎。到目前为止,我已经取得了进步,完成了除声音实体和优化之外的大部分工作。该引擎使用延迟着色,因此由于延迟着色本身是普通GPU的累赘过程,因此我想尽可能地优化渲染过程。 当前系统由一个场景组成,其中包含一个渲染器,并且当前世界和世界将实体和照明实体分开std::vectors。 因此,基本上每次场景被调用时->render(),它都会调用渲染器,将世界作为参数传递,并从世界中获取实体迭代器,将其吸引到FBO,然后通过照明实体进行第二遍。而且我认为这还不够。 即使实体不在屏幕空间中,我当前的算法也会遍历所有内容。我正在考虑一种优化当前渲染算法的方法,使其仅针对可见对象调用API函数,那么优化此类渲染器的常用技术有哪些?

4
如何加载球形行星及其区域?
我正在设计一个部分由行星探索组成的游戏。我想为它们使用伪随机生成,当我不得不加载它们而不是存储每个细节的时候,从定义的种子重新生成,这会太繁琐。因此,我将随机种子和玩家所做的修改(如果有)存储在文件中。 玩家必须能够从轨道上看到行星(细节水平非常低,然后下降到地面,缓慢增加他/她着陆区域的细节水平,并从另一侧卸下超出玩家视野的行星。 如果必须在平坦的地面上进行操作,则可以使用正方形块系统轻松进行操作。但是这里的问题是行星几乎是球体。 那么,在精确点附近加载地面细节(起伏和接地物体)的最佳方法是什么? 我虽然已经提出了两种解决方案,但是两者都有一个弱点: 1.将球切成正方形块。 一旦玩家离地面足够近,我只需要从他/她的位置改善最接近的正方形的细节即可。 如果这还不够,当玩家在地面上或真的离地面很近时,我仍然可以在子正方形中切割每个正方形以进行加载。 但是,正如您在图片上看到的那样,如果玩家尝试着陆,那将是一个问题:正方形变成非常细长的矩形,甚至最后一行都变成三角形,此外还要加载很多东西,一代似乎会扭曲。 2.从二十面体开始。 在这里,我可以在玩家靠近时增加围绕他的位置的三角形镶嵌。 但是我不知道如何将三角形定位成比玩家的位置更近。我听说笛卡尔坐标在这种情况下可能有用,但我不知道如何使用它们。 我正在使用C ++ / OpenGL,所以这里要生成和加载的主要是表示表面浮雕和颜色/纹理的顶点。

3
碰撞检测是否总是O(n ^ 2)?
物理引擎是否能够例如通过将彼此靠近的对象分组并检查该组内部而不是与所有对象的碰撞来降低复杂性?(例如,可以通过查看远处物体的速度和与其他物体的距离来将其从一个组中移除)。 如果不是,那么这对于球体(在3d中)或圆盘(在2d中)是否会使碰撞变得微不足道?我应该做一个双循环,还是创建一个成对的数组? 编辑:对于子弹和box2d之类的物理引擎,碰撞检测是否仍为O(N ^ 2)?

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碰撞检测/响应引擎,重点是灵活性和速度。 这是其架构的非常基本的图: …

2
二维侧滚动的“最佳”游戏循环
是否可以为2D侧滚动游戏循环描述“最佳”(就性能而言)布局?在这种情况下,“游戏循环”接受用户输入,更新游戏对象的状态并绘制游戏对象。 例如,拥有一个具有深层次继承层次的GameObject基类可能对维护很有帮助...您可以执行以下操作: foreach(GameObject g in gameObjects) g.update(); 但是我认为这种方法会产生性能问题。 另一方面,所有游戏对象的数据和功能都可以是全局的。这将是维护上的麻烦,但可能更接近于性能最佳的游戏循环。 有什么想法吗? 我对接近最佳游戏循环结构的实际应用感兴趣...即使我为了获得出色的性能而为维护感到头疼。

5
为什么电脑游戏的大小差异如此之大?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 那里有很多PC游戏(看似)具有大致相同的图形(带有凹凸贴图,着色器等),声音复杂性和播放时间,但其中一个需要4GB的空间,而另一个需要13GB的空间。 这是为什么?为什么它们的大小相差这么大?
13 optimization  pc 

11
通常,我应该多长时间和何时优化一次代码?
在“正常”的业务编程中,优化步骤通常要等到真正需要时再进行。意味着直到真正需要它之前,您都不应该进行优化。 记住唐纳德·克努斯(Donald Knuth)所说的:“我们应该忘记效率低下,大约97%的时间说:过早的优化是万恶之源” 是时候进行优化以确保我没有浪费时间了。我应该在方法层面上做吗?班级?模块级别? 另外,我应该如何衡量优化?虫?影格速率?总时间?

1
学习图形硬件的好资源[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我正在寻找有关图形硬件(和相关的底层软件)的良好学习资源。基本上,我想了解更多关于opengl / direcx API层下的实现方式。 我熟悉渲染管线各个阶段(查看,投影,裁剪,光栅化等)中发生的原理变化。 我的目标是在针对以下问题进行图形/着色程序编程时,能够就折衷和潜在的优化做出更好,更明智的决策; 批处理 视图剔除 咬合 签单 避免状态变化 三角形vs点数 纹理采样 等等 基本上,图形程序员需要了解现代图形硬件以提高效率。 我并不是真正在寻找特定的优化技术,而是需要更多的一般知识,以便自然地编写更有效的代码。

1
预先计算的寻路是否仍然有意义?
语境 老卢卡斯艺术公司(ScummVM时代)使用预先计算的寻路来点击图形冒险游戏。这是该技术的粗略概述。 第1步 每个房间的地板都被划分为所谓的“步行箱”,它们几乎等同于导航网格中的节点,但仅限于梯形形状。例如: ______ _____ _________ _____ \ A | B | C | D \ \_____| | |_______\ |_____| | |_________| 第2步 离线算法(例如Dijkstra或A *)将计算每对节点之间的最短路径,并将路径的第一步存储在2D矩阵中,并在每个维度中由使用的起始节点和结束节点进行索引。例如,使用上面的步行框: ___ ___ ___ ___ | A | B | C | D | <- Start Node ___|___|___|___|___| | A | A | A | …

3
为体素立方体景观优化网格
尝试在Unity 3D中创建我的世界/乐高世界风景(通过立方体程序生成的体素风景),我发现为这些风景创建的网格占用了大量内存。网格当前仅由多维数据集可见侧的顶点组成。复杂地形的内存使用可能需要6或700兆。 这些网格可以优化,但是我正在努力寻找一个合适的算法来做到这一点。 该算法必须考虑到您不希望“合并”具有不同地形类型的块。我想一个真正简单的开始可能是只处理一个轴上的所有块,并对其他两个轴进行额外的扫描。 我需要保持网格形状,即不要将顶点合并到更改空白或实体空间的位置。原因是,可能仍需要在网格周围导航的生物/等。因此,我不能只创建一个非常低的细节,扭曲的网格。 有任何想法/建议/提示吗?

3
Flash游戏的渲染性能
我当时正在阅读有关本机Flash渲染与构建自定义BitmapData帧缓冲区的信息,其中一些答案有些矛盾,所以我想知道: 通常是走定制Bitmap缓冲区路线的最佳实践,还是将渲染留给Flash引擎? 如果您使用矢量动画(MovieClips)而不是精灵,这是否会改变上述答案? 如果是这样,使用基于Sprite的动画是最佳实践吗? (如果有任何区别,我的目标是Flash 10)

4
如何有效检查点是否在旋转的矩形内?
我一方面要出于优化的目的,另一方面出于学习的目的,我敢问:如何使用C#或C ++ 最有效地检查2D点P是否在2D旋转的矩形内XYZW? 当前,我正在做的是使用《实时碰撞检测》一书中的“三角形中的点”算法,并运行两次(对于组成矩形的两个三角形,例如XYZ和XZW): bool PointInTriangle(Vector2 A, Vector2 B, Vector2 C, Vector2 P) { // Compute vectors Vector2 v0 = C - A; Vector2 v1 = B - A; Vector2 v2 = P - A; // Compute dot products float dot00 = Vector2.Dot(v0, v0); float dot01 = Vector2.Dot(v0, v1); float …

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.