亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過使用多個線程/內核來提高性能

通過使用多個線程/內核來提高性能

呼如林 2022-01-05 20:35:39
我有一個游戲(使用 pygame),我想提高其性能。我注意到當我的 fps 較低時,游戲最多只使用 20% 的 CPU,有沒有辦法可以使用線程來使用更多的 CPU?我已經嘗試實現線程,但似乎運氣不佳,將不勝感激。此功能是導致滯后的原因:第一版def SearchFood(self):    if not self.moving:        tempArr = np.array([])        for e in entityArr:            if type(e) == Food:                if e.rect != None and self.viewingRect != None:                    if self.viewingRect.colliderect(e.rect):                        tempArr = np.append(tempArr, e)        if tempArr.size > 0:            self.nearestFood = sorted(tempArr, key=lambda e: Mag((self.x - e.x, self.y - e.y)))[0]第二個版本(較慢)def SearchFood(self):    if not self.moving:        s_arr = sorted(entityArr, key=lambda e: math.hypot(self.x - e.x, self.y - e.y))        for e, i in enumerate(s_arr):            if type(e) != Food:                self.nearestFood = None            else:                self.nearestFood = s_arr[i]                break我查看整個實體列表,并在實體是食物以及與想要吃所述食物的事物的距離之后對其進行排序。問題是實體數組有 500 個元素(甚至更多),因此需要很長時間進行迭代和排序。然后為了彌補我想通過使用線程來利用更多的 CPU。如果有幫助,這里是完整的腳本:https : //github.com/Lobsternator/Game-Of-Life-Esque.git
查看完整描述

2 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

在 Python 中,線程不會增加使用的核心數。您必須改用多處理。
文檔:https : //docs.python.org/3.7/library/multiprocessing.html#multiprocessing.Manager

查看完整回答
反對 回復 2022-01-05
?
藍山帝景

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用于常規距離計算。這對于其他向量算術運算也可能有用。


查看完整回答
反對 回復 2022-01-05
  • 2 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號