<p>Python中的多线程几乎是无用的(对于这样的CPU密集型任务),而多线程虽然可行,但需要在进程之间进行昂贵的数据封送或仔细的设计。我认为这两个都不适用于你的案子。你知道吗</p>
<p>但是,除非游戏中有大量的对象,否则不需要在场景中使用多个核心。问题似乎更多的是算法的复杂性。你知道吗</p>
<p>您可以通过以下几种方式提高代码的性能:</p>
<ul>
<li>按类型保留实体索引(例如,从实体类型到实体集的dict,在创建/删除实体时更新),这将允许您轻松找到所有“食物”实体,而无需扫描游戏中的所有实体。你知道吗</li>
<li>使用简单的“min”操作(即<code>O(n)</code>)查找最近的食物实体,而不是按距离(即<code>O(n*logn)</code>)对所有食物进行排序。
<ul>
<li>如果这仍然很慢,您可以应用剔除技术,首先将食物过滤到容易计算的范围内的食物(例如,播放器周围的矩形),然后通过仅对这些食物应用更昂贵的距离计算来查找最近的食物。你知道吗</li>
</ul></li>
<li>避免检查循环中不必要的条件,尽可能使用内置的选择/创建结构,而不是遍历大型对象列表,从而使循环更紧密。你知道吗</li>
</ul>
<p>例如,你可以得到如下结果:</p>
<pre class="lang-py prettyprint-override"><code>def find_nearest_food(self):
food_entities = self._entities_by_type[Food]
nearest_food = min(food_entities, key=lambda entity: distance_sq(self, entity))
return nearest_food
def distance_sq(ent1, ent2):
# we don't need an expensive square root operation if we're just comparing distances
dx, dy = (ent1.x - ent2.x), (ent1.y - ent2.y)
return dx * dx + dy * dy
</code></pre>
<p>您可以通过将实体位置保持为NumPy向量而不是单独的<code>x</code>和<code>y</code>属性来进一步优化,这将允许您使用NumPy操作来计算距离,例如<code>distance_sq = (ent1.pos - ent2.pos)**2</code>或只使用<code>np.linalg.norm</code>进行常规距离计算。这对于其他向量算术运算也很有用。你知道吗</p>