游戏性能优化访谈

时间:2014-05-10 00:41:45

标签: performance optimization

出现了这个问题:

你正在寻找游戏中的瓶颈,但是你正在改变的是让游戏变得更快,无论是GPU管道还是CPU中的任何东西。没有任何东西在飙升,而且缓慢似乎分布在各处。你接下来做什么?

我很沮丧。这是一个技巧问题吗?在修复性能问题时,我总是认为这是您需要缩放所有内容的时间点。我不认为它是mem alloc,因为它显示在CPU性能中。

4 个答案:

答案 0 :(得分:3)

我会要求提供更多信息。 “慢”是表现不佳的不良指标,是症状的分类,而不是症状本身。例如,您可能将“slow”描述为:

  • 低帧率
  • 对输入的反应不佳
  • 高响应性和流畅的帧速率,但游戏机制缓慢(即:玩家和实体平稳但非常缓慢地移动)
  • 在网络游戏的情况下,明显的网络滞后

所有这些问题都有不同的潜在原因和解决方案:

  • 低但一致的帧速率可能是由于游戏循环效率低下造成的。简单地运行您最喜欢的探查器可能表明在一段特定代码中花费了大量时间。例如,在我写的一个游戏中,我发现低FPS是一个错误的循环的结果,它在没有缓存的情况下多次计算实体之间的距离。在另一个游戏中,我发现我用来对地形执行查找的数据结构是O(N)而不是O(1)(python stdlib ... ick)。你无法诊断出你看不到的问题,而剖析是第一道防线。
  • 反应不佳可能是由于很多事情。如果FPS很高但控件响应缓慢,那么您用来访问控件的API可能会很糟糕。某些控制器可能有蹩脚的驱动程序,可以杀死响应。它甚至可能是你的游戏循环:你可能根本就没有经常检查来自控制器的输入(也许你没有检查每个滴答)。在上述游戏中的一个游戏中,我遇到了一个问题,即某些动作会产生延迟效果:你使用了一个项目,游戏会在半秒左右后响应。事实证明,问题是由客户端进行服务器的完整往返以执行操作,验证它是否发生,以及等待服务器广播回该项目的使用。只需在客户端即时发生此行为即可解决问题。
  • 慢速游戏机制可能表明游戏常数不够高。如果一切都是平滑而美丽的,但一切都只是移动得很慢,很可能默认的速度或加速度都不够。
  • 网络延迟可能由以下任何因素引起:您连接的路由器可能出现故障,您正在开发的VPS可能位于正在进行DDoSed的主机上,您可能正在使用过于协议的协议(但是一致地说,或者你只是通过网络发送太多数据。在我在大学写的一个模拟软件中,计算是在实验室中的一些强大的计算机上进行的,而可视化是在我宿舍的MBP上运行的。事实证明,我从实验室计算机发送到宿舍的大量数据足以使建筑物中廉价的网络交换机过载并丢弃数据包,导致可怕的滞后但是完全合理的日志输出。

所以我想这里的答案是让面试官更充分地描述症状。 @Ali的答案很棒,但可能是手头有一个更细微的问题需要一些哄骗来诊断。

答案 1 :(得分:1)

  

你正在寻找游戏中的瓶颈,但你没有   改变让游戏变得更快,无论是GPU中的任何东西   管道或CPU。什么都没有飙升,似乎缓慢   分布在各地。

这几乎听起来像Uniformly Slow Code的定义。让我们假设它实际上就是这个(而不是一些I / O瓶颈或在循环中创建不必要的对象)或者对数据结构或算法等有一些不好的选择。)

为了使代码速度更慢,你通常不得不违背良好的做法,这就是为什么我通常会在代码速度一直很慢时停止优化代码。 (我认为“停止优化”在面试中不是一个好的答案......)

提高速度的一种方法是确定适当的小操作序列,将它们集中在一个地方,然后手动改进;一种“手动内联”这些操作,然后对出现的代码进行高级简化。它需要良好的直觉,这可能值得做,并且对所涉及的代码有很好的理解。 This answer calls it bunching and horizontal optimization.

如果您的真的具有统一的代码速度慢,那么可能值得研究的另一件事是Andrei Alexandrescu's optimization tips

答案 2 :(得分:0)

也许这是关于考虑更有效的算法。 “微观优化”有其局限性;例如,你可以完美地优化冒泡排序,但要获得真正的大加速,你就会发明另一种排序算法。

此外,在游戏中,您可以引入不同类型的可调节质量/速度(或精度/速度)权衡。通常,所有游戏都有一些设置可以改变图形细节级别。

答案 3 :(得分:0)

  

轶事:

我可以告诉你问题是什么而不知道问题的答案; p

sloppy directx电话。太多的物体。在一些旧的dx9游戏中尤其糟糕,因为dx9需要为每个对象进行新的directdraw调用。或类似的事情,故事说。基本上导致cpu等待空闲以便gpu处理所有消息。

虽然不是每个问题的解决方案,但我认为它是一个有趣的信息; p在其他评论中没有看到它。

它几乎就像拥有太多的像素着色器一样,除非至少gpu以100%的质量工作:D适合煎炸煎蛋。 (另外,使用遮挡来保存性能,然后在该模型中添加大量像素着色器是一个不错的想法)

我希望你能看到这里的幽默; p