我来自软件开发背景。在软件开发周期中,我们通常专注于功能和工作产品。在开发结束时,我们开始优化代码并提高性能。
现在的问题是,我们是否需要考虑游戏开发中每行代码的性能?
这样做我觉得我们错过了设计模式和简洁的代码。我想知道游戏开发行业是否有最佳实践方法?
我来自软件开发背景。在软件开发周期中,我们通常专注于功能和工作产品。在开发结束时,我们开始优化代码并提高性能。
现在的问题是,我们是否需要考虑游戏开发中每行代码的性能?
这样做我觉得我们错过了设计模式和简洁的代码。我想知道游戏开发行业是否有最佳实践方法?
Answers:
绩效工程
优化
过早优化
这三件事是不一样的。
特别是性能工程是您从一开始就应该做的事情,并且它绝对与过早优化不同,因为它是基于实际测量的。在这种情况下,我们将根据经验和建议来了解硬件的工作方式以及快速或慢速的使用模式。
如果没有为性能而进行工程师设计,可能会导致糟糕的结果,就像在您发现任何错误时需要重新设计和重写一样。
例如:所有GPU供应商都建议每帧从GPU进行回读是缓慢的。设计代码不执行回读并不是过早的优化。
如果您想在正确的时间进行优化,请使用慢速机器并使用它们。对于小型商店,一个不错的选择是在通勤时使用速度较慢的笔记本电脑,在办公室中使用快速桌面。另外一个好处是,如果您是一家专人商店,这也将迫使您正确备份整个构建环境。
通过使用速度较慢的计算机,您将知道何时需要提高性能。
我们是否需要考虑游戏开发中每行代码的性能?
绝对不。在任何类型的开发中,代码行的性能通常都是无关紧要的。您需要考虑算法和算法复杂性,而不是线条。在许多情况下,体面的编程意味着通过优化代码行可以使速度提高2倍左右,但是选择正确或错误的算法将导致数万至数百万的因素。
关于过早优化的讨论实际上并不是说优化不是一件坏事。这是因为人们未能优化正确的事物。您的时间是需要优化的变量之一,这可以通过不浪费时间来“优化”每30毫秒调用一次并执行100微秒的函数来实现。
换句话说:“加快”速度是没有意义的。您的目标是“足够快”。做出已经“足够快”的“更快”是浪费时间,而做出还不够“快”的“更快”只是意味着它仍然太慢。“更快”无关紧要,只有“足够快”才有意义。
您需要付出足够的努力,至少要走下去“这可能会成为瓶颈,如果是的话,那么解决这个问题将涉及到什么变化呢?”。
一般而言,这需要在确定正确方向上花费的时间/资源与避免错误决策所花费的时间/资源之间取得平衡。
认为它有点像翻新公寓。有些决定可能会产生持久的影响(“哎呀,冰箱不再适合放在小柜子里了。”“哎呀,我想把我的浴室放水的地方”),但是您不会考虑油漆刷的每个行程如何可能会影响建筑物的结构稳定性。
或者,换句话说,不要将自己陷入困境。或者至少知道您何时将自己倒入一个角落,并确保这是您想回到的角落。例如:
对于游戏,您的主要目标是在目标最低规格的计算机上达到目标帧速率(并可能达到最大加载时间等)。
为此,不,您不必担心每一行。
每当选择特定的策略,算法或容器时,您都必须尽早担心。如果您通过做出不充分的设计决策而使从根本上无法实现目标,那么以后可能进行的任何优化均无济于事。
接下来,您必须担心什么东西是并行的或可并行化的。游戏是大规模并行的,如果没有其他原因,那就是图形。
因此,并行不仅仅意味着“线程”,还包括图形API,磁盘访问或网络。每当您错过可以轻松地进行本机并行化的东西并行运行的机会时,例如由于同步不良(或完全不使用异步API),您将损失更多,无法通过其他方式进行优化。
你也不必担心,只要东西众所周知,它是瓶颈或停滞的根源,或是阻碍扩展的因素。例如,切换渲染状态,绘制调用,从GPU读回或打开文件。
最后,完成后,测试表明您不符合目标帧速率,则需要进行优化。找到需要90%的时间的最大瓶颈,然后对其进行优化。如果这还不够,请找出最大的秒数。
如果您达到目标,那么恭喜您。继续前进,忘记它。