Questions tagged «performance»

由于游戏的设计和结构及其架构中的几个因素,导致运行游戏的质量,效率和速度。

5
改善O(N ^ 2)函数(所有实体迭代所有其他实体)
有一点背景知识,我正在和一个C ++的朋友一起编写一个演化游戏,使用ENTT作为实体系统。生物在2D地图中四处走走,吃些绿色或其他生物,繁殖并改变其特性。 此外,当实时运行游戏时,性能还不错(60fps没问题),但我希望能够显着加快速度,而不必等待4小时即可看到任何重大变化。所以我想尽快得到它。 我正在努力寻找一种有效的方法来让生物找到食物。每个生物都应该寻找最接近它们的最佳食物。 如果要吃东西,应该以中心位置为中心的生物以149.64半径(视野距离)环顾四周,并根据营养,距离和种类(肉或植物)来判断应选择哪种食物。 。 负责查找每个生物食物的功能正在消耗大约70%的运行时间。简化当前的编写方式,它是这样的: for (creature : all_creatures) { for (food : all_entities_with_food_value) { // if the food is within the creatures view and it's // the best food found yet, it becomes the best food } // set the best food as the target for creature …

3
为什么OpenGL> = 3只允许VBO?
我看到OpenGL版本3和更高版本取消了客户端渲染的使用。立即模式已被消除,并且顶点数组似乎已被弃用。相反,如果我理解正确,则VBO是渲染顶点的主要方法。 虽然我看到采用统一的方式呈现所有内容的逻辑,但VBO是否在顶点阵列方面没有重大缺点?我以为VBO通常应该是包含大于1MB数据的大缓冲区。如果我的场景具有许多较小的几何形状怎么办?我有一个场景图,其中包含大量节点,每个节点都需要自己的变换,等等。每个节点也应该能够分别删除,单独添加,等等。我以前使用的是顶点数组。因此,我的第一个问题是,如果我切换到VBO,现在是否需要为每个场景分配一个VBO,这会给我的场景图对象带来更大的开销。 另一个问题是我渲染的几何图形可能是高度动态的。在最坏的情况下,有时可能需要在一段时间内每帧重新发送所有几何图形。在这种用例中,VBO的性能是否会比顶点阵列差,或者最差的VBO的工作量与顶点阵列一样多,但没有更多? 因此,以更简洁的格式,我的问题是: 1)分配/取消分配VBO是否有相当大的开销(我的意思是仅仅建立一个缓冲区)? 2)如果我要每帧更新CPU的数据,这是否会比使用顶点数组的情况差很多? 最后,我想知道: 3)如果对以上两个问题的回答均为“是”,为什么不赞成使用其他渲染模式,而不是VBO?我在这里缺少什么,比如我应该用来减轻这些潜在分配成本等的技术吗? 4)根据我使用的OpenGL版本,这些问题的答案是否会发生实质性变化?如果我通过使用高性能的VBO将代码重构为OpenGL 3或4向前兼容,那么相同的技术可能会在OpenGL 2中很好地发挥作用,或者某些技术在OpenGL 3中可能会快得多+和其他使用OpenGL 2的软件? 我在堆栈溢出时问了这个问题,但是我在这里重新发布,因为我意识到这个站点可能更适合我的问题。

1
三重缓冲的好处是什么?
我阅读了上一个问题中写的所有内容。据我了解,在双缓冲中,程序必须等到复制或交换完成的图形后才能开始下一个图形。在三重缓冲中,程序具有两个后备缓冲区,并且可以立即开始绘制不涉及这种复制的缓冲区。 但是,如果在可以利用第三个缓冲区的情况下使用三重缓冲,这并不意味着绘制帧的速度快于监视器可以刷新的速度。因此,您实际上并没有获得更高的帧速率。那么,三重缓冲的好处是什么?

4
使主游戏循环不受控制地运行是否有任何危害?
我想知道当我的游戏循环以系统允许的速度运行时是否有任何可能的危害? 我目前有一个循环,通过测量经过的时间(以纳秒为单位),可以以预定义的速度运行游戏逻辑和渲染逻辑,而不会出现问题。实际上,我在循环中执行的任何逻辑都每秒被计时到一定数量的调用。 循环本身的运行速度差不多可以达到我的计算机上每秒大约1170万个循环的速度。 循环(简单的伪代码): while(!isGameOver){ if(canPollInputs){ pollInputs() } while(canStepLogic){ stepLogic() } if(canRender){ render() } } 我的问题基本上是,如果这个简单的循环没有以受控的速度运行,是否会对系统造成危害? 编辑:这意味着我的逻辑每秒运行30次(30 tps),渲染器以60 fps的速度运行,我轮询输入每秒100次,并且还有一些逻辑可以应付逻辑或渲染花费比预期更长的时间。但是循环本身并未受到限制。 编辑:使用Thread.sleep()例如将主循环节流到每秒250个循环导致减少,但是循环以每秒570个循环而不是所需的250个循环运行(当我在台式机上时会添加代码。) 编辑:在这里,为了弄清楚事情,一个工作的Java gameloop。也可以随意使用它,但不要声称它是您的;) private void gameLoop() { // Time that must elapse before a new run double timePerPoll = 1000000000l / targetPPS; double timePerTick = 1000000000l / targetTPS; double timePerFrame = …

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


5
适用于iOS游戏的Objective-C还是C ++?
我对使用Objective-C和C ++进行编程非常有信心,但是我发现使用Objective-C在某种程度上更容易使用,并且本质上更加灵活和动态。 使用C ++代替Obj-C在iOS上编写游戏时,优缺点是什么?或者,与C ++相比,使用Obj-C是否存在任何已知问题? 例如,与使用C / C ++编写的代码相比,我怀疑 Obj-C可能存在性能问题。

4
实体系统中的缓存未命中和可用性
最近,我一直在为我的框架研究和实现一个实体系统。我认为我阅读了我能找到的大多数文章,reddits和有关它的问题,到目前为止,我认为我对这个想法已经足够了解。 但是,它提出了有关总体C ++行为,我在其中实现实体系统的语言以及一些可用性问题的一些问题。 因此,一种方法是直接在实体中存储组件数组,而我没有这样做,因为它在遍历数据时破坏了缓存的局部性。因此,我决定每个组件类型只有一个数组,因此相同类型的所有组件在内存中都是连续的,这应该是快速迭代的最佳解决方案。 但是,当我要在实际游戏实现中从系统迭代组件数组以对其进行处理时,我注意到几乎总是同时使用两个或多个组件类型。例如,渲染系统将Transform和Model组件一起使用以实际进行渲染调用。我的问题是,由于在这种情况下不会一次线性地迭代一个连续的数组,我是否立即牺牲了通过这种方式分配组件的性能收益?当我在C ++中迭代两个不同的连续数组并在每个循环中使用两个数组中的数据时,这是否会产生问题? 我想问的另一件事是,应该如何保留对组件或实体的引用,因为组件的本质是如何放置在内存中,它们可以轻松切换数组中的位置,或者可以重新分配数组以进行扩展或扩展。缩小,使组件指针或句柄无效。您建议如何处理这些情况,因为我经常发现自己想在每一帧上对变换和其他组件进行操作,并且如果我的句柄或指针无效,那么在每一帧进行查找都非常麻烦。

5
在OpenGL中渲染文本的首选方法
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 2年前关闭。 我将再次为大学项目准备计算机图形学。在以前的项目中,我使用了一个名为FTGL的库,它感觉很沉重(我尝试了很多渲染技术,但是文本渲染的伸缩性不是很好),对此我并不满意。 我的问题是,是否有一个良好且高效的库?如果不是,那么实现快速但美观的文本的方式将是什么?一些预期用途是: 浮动对象/字符标签 对话对话 选单 平视显示器 编辑:最好也可以加载字体

3
是否有任何文档比较/对比C ++标准库的实现?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为话题成为Game Development Stack Exchange。 4年前关闭。 (这本身不是游戏编程,但是我确定如果我这样问我,即使历史告诉我们每个大型游戏最终都担心这些事情,我还是被告知不要过早优化。) 是否有文档可以总结不同C ++标准库实现之间的性能差异,尤其是内存使用情况?一些实现的细节受到NDA的保护,但是即使是STLport与libstdc ++,libc ++与MSVC / Dinkumware(相对于EASTL)之间的比较似乎也非常有用。 我特别在寻找以下问题的答案: 标准容器有多少内存开销? 什么容器(如果有的话)仅通过声明进行动态分配? std :: string是否在写时复制?短字符串优化?绳索? std :: deque使用环形缓冲区还是废话?

1
*调用* =(或* =调用*)是否比编写单独的函数(对于数学库)要慢?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为话题成为Game Development Stack Exchange。 4年前关闭。 我有一些矢量类,其算术函数如下所示: template<typename T, typename U> auto operator*(const Vector3<T>& lhs, const Vector3<U>& rhs) { return Vector3<decltype(lhs.x*rhs.x)>( lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z ); } template<typename T, typename U> Vector3<T>& operator*=(Vector3<T>& lhs, const Vector3<U>& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; …

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

2
使用Unity构建游戏时,我应该如何考虑GC?
*据我所知,iOS版Unity3D基于Mono运行时,而Mono仅具有世代标记和清除GC。 该GC系统无法避免GC时间停止游戏系统。实例池可以减少这种情况,但不能完全减少,因为我们无法控制实例化发生在CLR的基类库中。那些隐藏的小型且频繁的实例最终将增加不确定的GC时间。定期强制使用完整的GC将大大降低性能(实际上,Mono可以强制使用完整的GC吗?) 那么,如何在使用Unity3D时避免GC时间又不会大幅降低性能呢?

4
(c ++)游戏的日志记录库
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 12个月前关闭。 我知道很多日志库,但没有测试很多。(GoogleLog,Pantheios,即将推出的boost :: log库...) 在游戏中,尤其是在远程多人游戏和多线程游戏中,日志记录对于调试至关重要,即使最终删除所有日志也是如此。 假设我正在制作需要日志(多人游戏,多线程和/或多进程)的PC游戏(而不是控制台),并且我有充分的理由寻找要记录的库(例如,我没有时间或对我为自己的情况正确写出自己的能力不自信)。 假设我需要: 性能 易于使用(允许流式传输或格式化或类似的操作) 可靠(不要泄漏或崩溃!) 跨平台(至少Windows,MacOSX,Linux / Ubuntu) 您会推荐Wich日志库吗? 目前,我认为boost :: log是最灵活的一种(您甚至可以远程登录!),但是性能更新不佳:是为了高性能,但尚未发布。Pantheios通常被引用,但是我在性能和用法上没有比较点。我已经使用我自己的lib很长时间了,但是我知道它不能管理多线程,所以即使它足够快,它也是一个大问题。Google Log似乎很有趣,我只需要对其进行测试,但是如果您已经比较了这些库和更多库,那么您的建议可能会有用。 游戏通常对性能要求很高,但调试起来很复杂,因此最好了解在我们特定的情况下具有明显优势的日志记录库。

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

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.