Questions tagged «optimization»

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

9
为什么过早优化如此糟糕?
在对优化进行了一点研究之后,我发现(几乎在所有地方)过早优化游戏似乎是普遍公认的罪过。 我真的不明白这一点,在最后改变游戏的某些核心结构,而不是在第一次考虑性能的情况下开发它们,是否会变得异常困难? 我得到等待,直到游戏结束,它会告诉您是否甚至需要优化,但是您还是不应该这样做,毕竟,它可以扩大游戏可以运行的设备的种类,从而增加潜在的数量玩家。 有人可以向我解释为什么过早优化是一个坏主意吗?

17
C ++低级优化技巧
假设您已经有了最佳选择算法,那么您可以提供哪些低级解决方案来从C ++代码中压缩出最后几帧呢? 不用说,这些技巧仅适用于您在事件探查器中已突出显示的关键代码部分,但它们应该是低级别的非结构性改进。我已经播了一个例子。
79 c++  optimization 

6
如何优化Minecraft风格的体素世界?
我发现即使使用四核和多肉的显卡,《我的世界》奇妙的大世界也极难导航。 我认为Minecraft的运行缓慢来自: Java,因为空间分区和内存管理在本机C ++中更快。 弱世界分区。 两种假设我都可能错了。但是,这让我开始思考管理大型体素世界的最佳方法。由于这是一个真实的3D世界,其中块可以在世界的任何部分存在,它基本上是一个大的3D阵列[x][y][z],其中在世界的每个块具有类型(即BlockType.Empty = 0,BlockType.Dirt = 1等) 我认为要使这种世界表现良好,您需要: 使用某种树(oct / kd / bsp)将所有多维数据集拆分出来;似乎oct / kd会是更好的选择,因为您可以仅在每个多维数据集级别而不是每个三角形级别进行分区。 使用某种算法来确定当前可以看到哪些块,因为距离用户最近的块可能会混淆后面的块,从而使其变得毫无意义。 保持块对象本身轻巧,因此可以快速将其从树中添加和删除。 我想对此没有正确的答案,但是我很想看到人们对此问题的看法。 在大型体素世界中,您将如何提高性能?



1
实体系统的缓存效率如何?
最近,我已经做了大量关于实体系统的阅读,以在我的C ++ / OpenGL游戏引擎中实现。我经常听到称赞的关于实体系统的两个主要好处是 由于不必纠缠复杂的继承层次结构,因此可以轻松地构造新类型的实体,并且 缓存效率,这让我很难理解。 当然,理论很简单;每个组件都连续存储在一块内存中,因此关心该组件的系统可以遍历整个列表,而不必在内存中跳转并杀死缓存。问题是我真的无法想到实际可行的情况。 首先,让我们看一下组件的存储方式以及它们之间的相互引用。系统需要能够使用多个组件,即渲染系统和物理系统都需要访问变换组件。我已经看到许多解决此问题的可能实现,但没有一个能很好地实现。 您可以让组件存储指向其他组件的指针,或者指向存储实体的指针的实体的指针。但是,一旦您将指针添加到组合中,您就已经失去了缓存效率。您可以确保每个组件数组都为'n'个大数组,其中'n'为系统中存在的实体数量,但是这种方法浪费内存。这使得很难向引擎中添加新的组件类型,但是仍然会浪费缓存效率,因为您要从一个数组跳到另一个数组。您可以交错实体数组,而不是保留单独的数组,但是您仍然在浪费内存。使得添加新组件或系统的成本高得惊人,但是现在有了使所有旧级别失效并保存文件的额外好处。 所有这些都假定在列表,每一帧或每笔价格变动中对实体进行线性处理。实际上,情况并非如此。假设您使用扇形/门户渲染器或八叉树来执行遮挡剔除。您也许可以在一个扇区/节点内连续存储实体,但是无论您是否喜欢它都将四处走动。然后,您将拥有其他系统,它们可能更喜欢以其他顺序存储的实体。在开始使用AI LOD之前,AI可以将实体存储在一个很大的列表中。然后,您需要根据与玩家之间的距离或其他一些LOD指标来拆分该列表。物理学将要使用该八叉树。脚本无关紧要,无论如何,它们都需要运行。 我可以看到在“逻辑”(例如ai,脚本等)和“世界”(例如渲染,物理,音频等)之间拆分组件,并分别管理每个列表,但是这些列表仍然必须彼此交互。如果AI不能影响用于实体渲染的变换或动画状态,则AI是没有意义的。 实体系统在现实游戏引擎中如何“高效缓存”?也许有一种混合方法,每个人都在使用而不是谈论,例如将实体全局存储在数组中并在八叉树中引用它?

7
Microsoft是否建议使用适用于游戏开发的C#属性?
我知道有时您需要一些属性,例如: public int[] Transitions { get; set; } 要么: [SerializeField] private int[] m_Transitions; public int[] Transitions { get { return m_Transitions; } set { m_Transitions = value; } } 但是我的印象是,在游戏开发中,除非您有其他理由,否则一切都应尽可能快。从我读过的书中给我的印象是Unity 3D不确定通过属性内联访问,因此使用属性会导致额外的函数调用。 我是否经常不理会Visual Studio不使用公共字段的建议?(请注意,我们会int Foo { get; private set; }在显示预期用法的地方使用优势。) 我知道过早的优化是不好的,但是正如我所说,在游戏开发中,只要有类似的努力就可以使它更快,但事情不会变慢。

9
OpenGL优化技巧
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 要提高OpenGL的效率,您有什么技巧?

6
如何优化距离功能?
在开发一款相当简单的类似RTS的游戏时,我注意到我的距离计算正在影响性能。 在任何时候,都会进行距离检查,以了解一个单位是否在其目标范围内,射弹是否已达到其目标,玩家是否跑过了皮卡,常规碰撞等。列表继续进行,并检查两点之间的距离经常使用。 我的问题就是这个。我想知道除了常规的sqrt(x * x + y * y)方法以外,游戏开发人员还有哪些替代方法可以检查距离,如果我们每帧执行数千次,这将非常耗时。 我想指出的是,我了解了曼哈顿的距离和平方的距离比较(通过跳过sqrt瓶颈)。还要别的吗?

7
优化重力计算
我有一堆大小和速度各异的物体,它们相互吸引。每次更新时,我都必须遍历每个对象并合计由于每个其他对象的重力而产生的力。它的伸缩性不是很好,是我在游戏中发现的两个主要瓶颈之一,我不确定该如何提高性能。 这感觉就像我应该可以提高性能。在任何给定时间,系统中大约99%的对象对对象的影响都可以忽略不计。我当然不能按质量对物体进行排序,而只能考虑前10个最大的物体或某些物体,因为力随距离的变化比随质量的变化大(方程沿的线force = mass1 * mass2 / distance^2)。我认为,最好的办法是考虑最大的物体和最接近的物体,而忽略世界另一端可能无法影响任何事物的数百个微小的岩石碎片,但要找出哪些物体是最近我有遍历所有的对象,他们的立场正在发生变化不断,所以这不是我只能做一次。 目前我正在做这样的事情: private void UpdateBodies(List<GravitatingObject> bodies, GameTime gameTime) { for (int i = 0; i < bodies.Count; i++) { bodies[i].Update(i); } } //... public virtual void Update(int systemIndex) { for (int i = systemIndex + 1; i < system.MassiveBodies.Count; i++) { GravitatingObject body …

6
咒语施法-如何优化每秒伤害
假设我们有一个知道一些咒语的巫师。每个法术都有3个属性:伤害,冷却时间和施法时间。相当标准的RPG东西。 冷却时间:能够再次施放该法术所花费的时间(t)。咒语开始施放时便会持续进行“冷却”。 施法时间:使用咒语所需的时间(t)。向导施放某些东西时,无法施放其他咒语,并且不能将其取消。 问题是:在不同的法术组合下,您将如何最大化伤害? 很容易计算出每个施法时间的最高伤害。但是,如果有更多更好的选择,那么等待然后让“卡住”施放低伤害咒语的情况又如何呢? 例如, 火球:3000伤害,3秒施法时间,6秒冷却。 寒冰箭:20伤害,4秒施法时间,4秒冷却。 疾风:3伤害,3秒施法时间,3秒冷却。 在这种情况下,如果您选择使用较低的DPCT咒语(疾风)而不是冰霜箭,则每秒的伤害会更高。因此,我们必须考虑选择咒语的后果。 在下面的示例中是“过度投放”和“等待”的情况。

5
学习如何通过Assembly进行优化[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 我是计算机游戏技术专业的二年级学生。我最近完成了我自己的“探路者”的第一个原型(它不使用A *而是几何方法/模式识别,探路者只需要他认为有关的地形知识即可做出决定,因为我想要一个可以实际探索的AI(如果已经知道地形),那么它将很容易以最短的方式行走,因为探路者具有节点的内存。 无论如何,我的问题更笼统:如何开始优化算法/循环/ for_each / etc。使用汇编语言,但欢迎使用一般技巧。我特别在寻找好书,因为要找到与此主题相关的好书真的很困难。有一些像这样的小文章,但仍然不足以优化算法/游戏... 我希望那里有一本现代的好书,我只是找不到...

3
在具有开放环境和大量静态内容(例如孤岛危机)的现代AAA游戏中,如何执行遮挡剔除?
我有两个想法: 1)使用低分辨率和低多边形数模型(甚至仅使用诸如立方体或球体的边界体积)将场景渲染到不可见的缓冲区。然后检查缓冲区以了解可见或不可见。在渲染低分辨率场景之前,可以应用一些视锥剔除,以尽可能多地移除对象。 2)在静态地图上运行一个工具,该工具将执行复杂(因此较慢)的光线跟踪,以了解地图上的某些3d位置,哪些是可见的,哪些不是。然后,所有这些信息都以一种有效的方式存储,以后可以在运行时供用户使用(例如:八叉树)。该解决方案仅适用于静态网格物体(例如:建筑物)而不是移动对象。

4
哪些操作码在CPU级别上更快?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 3年前关闭。 在每种编程语言中,都有建议使用的操作码集。我已经尝试按照速度在这里列出它们。 按位 整数加/减 整数乘法/除法 比较方式 控制流 浮点加法/减法 浮点乘法/除法 在需要高性能代码的地方,可以对C ++进行手工优化,以使用SIMD指令或更有效的控制流,数据类型等进行汇编。因此,我试图了解数据类型(int32 / float32 / float64)还是所使用的操作(*,+,&)影响在CPU级别的性能。 CPU上的单倍乘法是否比加法慢? 在MCU理论中,您了解到操作码的速度取决于执行所需的CPU周期数。那么,这是否意味着乘法需要4个周期,加法需要2个周期? 基本数学和控制流操作码的速度特性到底是什么? 如果两个操作码需要执行相同数量的周期,那么两者可以互换使用而没有任何性能增益/损失? 您可以分享有关x86 CPU性能的任何其他技术细节,


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.