2012-10-27 69 views
1

我正在研究天文學項目,製作其中一個重力模擬器程序。我有一個Uni類,它代表了一個充滿天體的宇宙(Body類的實例)。如何正確解耦計算與渲染

這個Uni類能夠更新自己,添加新的身體,並刪除身體的id。它完全基於數學,應該單獨工作。

圍繞它,我打算構建使用PyGame來選擇性地顯示模擬和MatPlotLib來分析結果的程序。然而,我對如何保持我的計算(Uni)和渲染(Renderer)解耦有點困惑!

我設想這樣的:

主程序:

  1. 進口pygame的,對其進行初始化,並創建一個screen
  2. 實例化Universe,使用body等填充它(實際上由FileManager完成,它讀取單元的JSON規範)。
  3. 創建Renderer
  4. 進入一個while run:循環:

    1. uni.update(dt)
    2. #Listen to PyGame events, respond
    3. r.render(screen, uni, ui) #The UI class has a list of UI elements.

然而,渲染器NE編輯保持PyGame表面和需要繪製的圖像的持續列表,並且存在問題。 UniBody實例都不必知道PyGame,所以它們不能保留它們自己。

另一方面,渲染器只有它的render方法,它不能僅僅根據需要創建和銷燬PyGame曲面(我猜這樣做會影響性能)。


一個可能的解決辦法是有渲染器有pygame的對象字典,所有鑑定身體IDS。然後,它會迭代它,刪除任何已刪除的實體,並在每一幀中添加新的實體。

這是正確的路嗎?

回答

1

取而代之的是身體ID爲什麼不把Body s自己添加到pygame對象的字典中而不是ID?畢竟,Python變量只是一個標籤,所以渲染器不需要知道變量代表什麼。這可能會節省您不得不查找ID。

相關選項是將一個或多個viewport對象添加到您的Universe。因爲無論觀察機制的實現如何,您通常都不想展示整個宇宙,因此視口將是宇宙的一個適當屬性。用這個視口會有幾個方法(除了創建和調整大小)。首先獲取視口中所有Body的方法(這可能只是返回您將保留在視口對象中的列表)。其次是獲取包含兩個列表的元組的方法;在視口中出現的第一個Body,第二個是自上次更新以來離開視口的Body列表。該視口還應該有一個由Universe的更新方法調用的更新方法。