我们应该如何stored procedures生成的行为代码?

我和一群朋友正在开发一款游戏,我们遇到了一个障碍。 在我们描述这个路障之前,下面是我们游戏的简单解释:

游戏将能够以.wav格式播放歌曲,并从该歌曲中程序化地生成“级别”,其元素和特征取决于歌曲的属性而变化。

表面上似乎很简单(除了程序生成algorithm的大量低估的复杂性之外),但是存在一个问题。 我们希望能够以某种可移植的格式stored procedures生成的内容,但是我们也希望能够很快地执行它。

这是交易。 程序生成的对象都有程序上产生的行为。 它们每个都有一个封装了这个行为的update “方法”。 行为可能是“如果职位是某个职位,做某事”或“在for循环中做10次”或其他事情(很可能只是非常简单的代码)。

所以我正在考虑使用字节码模式 ,并编写一个非常基础的语言,在这个语言中我们可以对每个对象的行为进行编码。 虽然这有一个问题, 有一个很好的机会,它不会很快。

在屏幕上,将有数以千计的这些对象与程序生成的行为。 如果行为是用本地语言编写的(顺便说一下C#),那么它很可能会足够快,但是因为我们将 C#中parsing和执行我们自己的语言字节码所以我们认为会有很多额外的开销足以使我们的游戏无法玩。

当然,我们还没有试图用我们自己的语言来看看它是否真的足够快,但是我们有时间上的紧张,不想冒着浪费时间来实现某种事情的风险,工作。

我们应该做什么?

获取最简单的可能的例子,它接近你预期的复杂性,运行。 编码说5-6相当不同的行为,使实体计数variables,然后在不同的计数testing ,优化,并从那里扩大。 没有原型就不能做游戏开发,这是这个行业的本质。 有时你可以通过预先考虑减less原型的复杂性(由于隐藏的复杂性只能带你到目前为止),但最典型的是在编码过程中 – 第一线就是你的战术顿悟。 ;)

在传统业务编程的背景下,游戏开发者最激动人心的特性之一就是我们在将工程需求与用户体验相适应方面的灵活程度; 即在游戏逻辑的情况下,“这是否可能?”这样的黑白问题通常并不常见。 就像“我们如何减less这个数量以使其能够实时运行?”。

数千人并不罕见。 如果这成为一个问题,你可以减less这些事情的操作范围,我称之为玩家周围的“感兴趣区域”。 一旦你确定你的C#代码已经达到了性能极限,你也可以绑定到一个本地代码部分,例如通过挂接用C编写的DLL。

考虑尽可能多地分解你的专门行为,以便最佳地使用指令caching……我相信这将是一个持续的过程。 重复其他行为中使用的代码的长function意味着指令caching将不会被最佳使用。 重复代码有时可能是有利的,但是您可能不需要担心这一点。

C#实际上可以编译成一些非常糟糕的高效代码,如果你仔细的使用紧凑,高速caching一致的数组结构等,即最小化在任何时候操作的数据的种类,所以数据符合caching行宽度。 PS Unity或.Net / Mono?

FWIW,记住你的性能关键部分只占你代码的一小部分; 话虽如此,AI几乎肯定是其中之一。

我并不相信你没有开枪的工作。 一旦你开始优化,你会经常为增加速度而取得的飞跃和收获感到震惊,这个早期的优化大部分都是数据驱动的,确保了良好的caching性能。 朴素代码的优化是微不足道的; 这是一个上升的曲线,只有当你已经大量优化给定的代码段时,才会变得更加困难。 如果仍然不够快,那就需要algorithm模式转换。

但是,在最后一天,你必须开始项目开始知道是否有可能。