如何正确将计算与渲染解耦

2024-06-07 06:50:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个天文项目,制作一个重力模拟器程序。我有一个Uni类,它代表一个充满天体的宇宙(这个Body类的实例)。在

这个Uni类能够更新自身,添加新的实体,并通过它们的id删除实体。它完全基于数学,应该单独工作。在

围绕它,我计划构建一个程序,它使用PyGame来实时显示模拟,并使用MatPlotLib来分析结果。但是,我对如何保持计算(Uni)和渲染(Renderer)解耦有点困惑!在

我的设想是这样的:

主程序:

  1. 导入PyGame,初始化它,并创建一个screen。在
  2. 实例化一个宇宙,用实体填充它,等等(实际上是由FileManager完成的,它读取uni的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.

但是,渲染器需要保留一个需要绘制的PyGame曲面和图像的持久列表,这就是问题所在。无论是Uni还是{}实例都必须知道PyGame,因此它们不能自己保留这些实例。在

另一方面,渲染器只为它的render方法而存在,该方法不能根据需要创建和销毁PyGame曲面(我想这会影响性能)。在


一个可能的解决方案是让渲染器有一个PyGame对象的字典,所有对象都由body id标识。然后,它将迭代它,移除任何已消失的实体,并在每一帧中添加任何新的实体。在

走这条路对吗?在


Tags: 对象实例方法程序实体idui宇宙
1条回答
网友
1楼 · 发布于 2024-06-07 06:50:01

为什么不将Body本身添加到pygame对象的字典中而不是添加ID?毕竟,Python变量只是一个标签,因此渲染器不需要知道变量代表什么。这样你就不用查身份证了。在

一个相关的选项是将一个或多个viewport对象添加到你的宇宙中。因为无论查看机制的实现是什么,通常都不希望显示整个宇宙,因此视口是宇宙的一个适当属性。使用该视口可以使用两种方法(除了创建和调整大小)。首先是一个方法来获取viewport中的所有Body(它可以返回一个保留在viewport对象中的列表)。第二个方法是获取一个包含两个列表的元组;一个是在视口中出现的Body,第二个是自上次更新以来从视口中消失的Body列表。视口还应该有一个由universe的update方法调用的update方法。在

相关问题 更多 >