2 回答

TA貢獻1890條經驗 獲得超9個贊
在 Python 中,線程不會增加使用的核心數。您必須改用多處理。
文檔:https : //docs.python.org/3.7/library/multiprocessing.html#multiprocessing.Manager

TA貢獻1843條經驗 獲得超7個贊
Python 中的多線程幾乎是無用的(對于像這樣的 CPU 密集型任務),并且多處理雖然可行,但需要在進程之間進行昂貴的數據編組或精心設計。我不相信任何一種都適用于您的情況。
但是,除非您的游戲中有大量對象,否則您不需要為您的場景使用多個內核。這個問題似乎更像是算法復雜性。
您可以通過多種方式提高代碼的性能:
按類型保留實體索引(例如,從實體類型到實體集的字典,您在創建/刪除實體時更新該索引),這將使您無需掃描所有實體即可輕松找到所有“食物”實體游戲。
使用簡單的“最小”操作(即
O(n)
)而不是按距離(即O(n*logn)
)對所有食物進行排序來查找最近的食物實體。如果這仍然很慢,您可以應用剔除技術,首先將食物過濾到易于計算的范圍內(例如玩家周圍的矩形),然后通過僅對那些應用更昂貴的距離計算來找到最近的食物。
通過避免檢查循環內部不必要的條件,并盡可能使用內置的選擇/創建結構,而不是遍歷大型對象列表,從而使循環更緊密。
例如,您最終會得到類似的結果:
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
您可以通過將實體位置保持為 NumPy 向量而不是單獨的x和y屬性來進一步優化,這將允許您使用 NumPy 操作來計算距離,例如distance_sq = (ent1.pos - ent2.pos)**2或僅np.linalg.norm用于常規距離計算。這對于其他向量算術運算也可能有用。
添加回答
舉報