法力引擎:实现线程安全

侧边栏:如果您不熟悉webgraphviz.com,则它是一个非常有价值且易于使用的工具。


这里有一些有趣的事情要注意,我想我将省去对另一篇文章的深入研究。 放大并自己查看一些系统以及它们如何相互影响。 如果您有任何疑问,请发表评论,我们将很乐意为您解答。

实际上,这是我们依赖图的修剪版本。 我们还有其他一些系统未包含在本次运行中,因为我没有对其进行测试。 Rob编写了一个很好的Boids系统,我不想在此运行中使用它,因为我正在测试其他东西。

这是所有这些的可口奖金。 想知道删除5个Boids系统所需的时间吗? 在我的主要初始化函数中,我只需要注释掉这一行:

  Boid :: RegisterSystems(world); 

我们还提供了一些自动生成的系统,这些系统可以帮助为简化起见而在图表中省略的组件进行记账。


好的,这看起来很整洁,但是为什么重要呢?

多年来,作为开发人员,我注意到的一件事是,某些程序员往往对特定领域内的较难问题具有亲和力。 我们有图形程序员,引擎程序员,游戏程序员,网络程序员,音频程序员。 专业领域的清单还在继续。 通常,尤其是在多线程编程尚未成为编写游戏代码的必备知识的时候,各种专业的程序员无需了解如何处理多线程问题。

而且在Mana Engine中,他们不必这样做。 该引擎旨在帮助您处理多线程问题,并在可能的情况下静态断言,您永远不会由于诸如错误共享之类的事情而遇到竞争状况或性能问题。


最近,有人透露(未经开发人员确认)PC上的《怪物猎人世界》将其处理时间的四分之一用于管理线程开销,其中大约有100个左右。 无锁和无等待的编程并不容易。 即使您之前已经解决了问题,也并不意味着如果您需要再次进行操作也不会弄乱。

在Mana Engine中,我们甚至没有主线程(带有1个警告)。 引擎完全在任务上运行,可以由任何(大多数是有意限制)工作线程执行。 我们选择在问题发生之前就解决问题。


Riot最近关于性能的工程博客文章显示了一个图,其中主线程在继续运行之前正在等待粒子线程。 在这种情况下,如果不等待主线程可以帮助执行粒子线程正在执行的某些工作,那将是很好的。 但是随后您遇到了其他问题,即现在正在主线程上完成粒子工作,并且锁定可能会搞砸。 Rob和我都已经看到了我们相当多的bug和死锁,它们是由让线程“协助”另一个线程的工作模式引起的。

在Mana引擎中,线程数总是与计算机的逻辑核心相同或更少,并且开销绝对是最小的。 在该问题发生之前就已经解决了。


现在,我们不必担心多线程问题。 当其他程序员使用Mana引擎进行开发时,如果他们不是多线程专家也可以。 这对于拥有广泛背景和技能水平的开发人员的大型工作室非常有用,从拥有25年以上工作经验的高级工程师到几乎没有或没有实际经验的应届毕业生。

我希望在以后的文章中涵盖有关Mana Engine,我们遇到的一些问题以及我们如何解决这些问题的更多详细信息。

同时,如果您对Mana Engine及其详细信息感兴趣,请在Twitter(@ tloch14)上发消息给我,我很乐意分享我们所学的知识。