如何可视化物理引擎的设计?


17

我正在开发一个物理引擎,使其很难跟踪整个过程。通常,当我在休息后返回代码时,我只是不记得为什么它不起作用。大多数问题不是简单的编程错误,而是我的物理引擎中的设计缺陷。这就是为什么我应该在编程之前完成设计。

但是,我需要一种方法在纸上书写物理引擎的整个设计。否则,明天我会忘记它,然后再次迷路。UML类图根本不适用于物理引擎的设计。我不是很在乎课程,而是在过程。我认为业务流程图不是真正有用的,因为对流程的单个步骤(框架)进行建模不会帮助我了解引擎在许多步骤上的最终行为。

那么,应该使用哪种图表来帮助我跟踪流程?专业人士使用哪种图表制作物理引擎?


4
首先,我将建议一个高级流程图,以显示该引擎的使用方式及其评估方式。或者可能类似于OpenGL管线图(openglinsights.com/pipeline.html)。然后,我将在Google图片中搜索“物理引擎图”,以了解其他人是如何做到的!;)
FrustratedWithFormsDesigner

4
“ UML图”可能意味着类图?类图是UML中的7个结构图之一。行为图也有7种类型。

首先,您必须对物理引擎有很好的理解;每个小细节以及事物如何协同工作。与编程无关。然后,您尝试在编程实体(类)和交互中对其进行建模。您可以使用任何喜欢的工具(甚至是草图和手写笔记)。然后,您一次创建一个类。首先编写控制台应用程序。您可以使用单元/班级测试来确保您的小班级正常工作并达到您的期望
John Kouraklis

6
以我的经验,专业程序员不会使用设计文档或图表来设计事物。也许在白板上。使用当代的编程语言,设计就在代码的开头。设计文档或图表最常用于通信。根据您的描述,我猜测您的设计需要分解。
JimmyJames

1
“ UML类图根本不适用于物理引擎的设计。” 为什么不?课堂都是关于关注点分离的。任何系统都可以划分为具有不同角色的组件,并且通常可以将这些组件划分为类。
Tanner Swett

Answers:


29

待办事项清单是一件很了不起的事情。

我不是在谈论// #TODO:等等等等。我的意思是对上帝笔记本诚实。

您永远不知道何时会记住重要的事情。笔记本将安静地坐在那里,让您思考而不会抱怨手写内容如何编译。我的一些最佳创意发生在浴室(是的,我确实拥有一个防水笔记本,但您不必走得那么远)。

您可以缝制(不粘)口袋大小的衣服,这样它们就不会掉进您的口袋里。难道没有花哨的内置书签吗?胶带,剪刀,缎带,没人会知道。

当一个想法被击中时,就把它记下来。在每个想法旁边画一个小盒子,您可以轻松地将其标记为完成。在页面顶部放一个方框,即可知道页面何时完成。

哪种顺序访问对您来说不够好?是的,他们也制作口袋装订器。这一切看起来似乎有点多,但是比淹没便笺或尝试捕获Jira中的所有内容要好。

不要把事情落实一半

保持小的改进是可以实现的。不要一开始就做不到的事情。如果这对于它来说很大,则将其分解为较小的步骤。始终保留可编译并通过测试的代码。哦,别忘了通过您从未见过的失败测试。测试通过与否都是测试的方式。

不要再想您需要纸上的整个设计

您需要做的就是捕获您不断发展的计划。您不知道完成后的情况如何,因此不要假装自己这样做。尽可能多地捕捉发现的内容。如有必要,请使用餐巾纸和蜡笔。无论如何,很少有人会理解90%的UML。使用任何方式可以显示需要显示的内容。我专注于显示我的界面以及对什么的了解。

停止编码时写笔记

松开手指的那一刻是您最后一次了解现在所做的(以及计划的)内容。在一些笔记中,请尽可能多地抓住这种理解。如果您只发表评论,那么您仍然与计算机相连,很可能在椅子上留下水坑。同样,拥有笔记本是一件了不起的事情。

这样,您就可以优雅地降落大脑,节省膀胱,然后在不依靠咖啡因和牙齿的情况下再次脱掉。


(作为一个也很聪明的诚实笔记本,Emacs Org模式可以很好地工作。类似的工具,甚至是问题跟踪程序,也可以根据流程而很好地工作。纸质笔记本非常方便携带,并且可以快速绘制图表和图片,这在思考时很棒。)
9000年7

6
为+1 Don't start anything that can't be finished in one sitting. If it's to big for that then break it down into smaller steps.。这是我在行业中学到的最重要的事情之一。
Akshat Mahajan

8

他们说:“除了第一次,一切都应该自上而下构建。”

我将从最低级别开始(例如基本向量数学),并确保我理解它,并且它具有良好的测试覆盖率。然后,我将在此之上再增加一层,以允许进行更多抽象操作(例如,组/实体,碰撞检测,碰撞机制)。同样,我将通过测试来介绍它;这将帮助我考虑引擎中这些抽象的实际用例。

除非您对整个引擎有很好的了解(例如,当您重新实现一个众所周知的现有引擎时),通常最好具有这些层;否则,请执行以下步骤。它使您可以根据上一层来思考特定的层,通常不会更深入。您可以尝试并使用新的有用抽象来构建层。在现实中被证明是可行的通常会偏离最初的想法。

希望每一层都足够小,以至于您不需要复杂的图表,或者很容易提出有用的图表。

我从未遇到过有用的复杂代码图。交互生命周期图很有用。经常将这样的图限制为1-2层,因此很简单。

我通常认为最有价值的是每个级别提供的接口描述和保证。例如向量数学的格式,以及数值错误会发生什么;较大物体描述的格式(总是凸形?总是顺时针方向?,如何相交?等),相互作用的机械参数(时间如何前进?质量如何处理?动量始终保持不变?力如何计算?)适当的相互作用(如何处理摩擦,变形,破碎?是将机械能转化为热量损失吗?)。

每层都应足够小,以使其引入并保证提供的东西数量可观。该描述甚至可以在未编写任何实现代码的情况下起草。这降低了确定您在三层深处所做的可怕错误处理的机会。如果您这样做了,那么它最多已经可以看到两层深了。


我喜欢自下而上地构建代码,使各层变得越来越能表达您的问题集。但是不要以为您会在第一时间把它们弄对。一旦开始使用一层来实现更高层次的内容,您就会发现API出现问题,必须回去更改它。没关系。
Justsalt

4

绘制架构图!注释中发布的OpenGL管线图 FrustratedWithFormsDesigner是程序流程的一个很好的例子,但这只是一种有用的图。

设计图时,您希望使代码理解变得简单直观。它既可以包含高级概念(如OpenGL管线图中的节点顶行,可以说些什么),也可以包含非常细致的技术细节(如完整的函数调用图)。

理想情况下,您的文档还应该使代码易于他人理解;这可以简化代码审查或开源协作之类的事情。查看大型项目以了解它们是如何实现的—在处理成千上万的代码行时,无需阅读程序即可了解程序的工作方式,这对于跟踪代码库或将其介绍给他人非常重要。 。Vim存储库具有130万个LOC,在/src/README.txt中具有非常出色的高级文档(IMO)。它介绍了:

  • 每个文件中的代码是什么
  • 重要的全局变量及其值
  • 主循环中发生了什么,它调用了什么功能
  • 每种模式以及处理它们的主要功能会发生什么
  • 什么是本机调试功能

如果我想提供补丁程序,我通常会知道需要修改哪个文件才能完成我的目标,而无需进行过多挖掘。

Vim的最佳功能之一/src/README.txt是查找起来很容易,而且功能全面。它在任何意义上都不是粒度,但是如果您单击srcGithub上的文件夹,它将自动加载,并为查找其他代码或文档提供了指导。与Powershell仓库形成对比,我以它为例,但是找不到与Vim相同的文件/src/README.txt。(对于具有99.8万个LOC的项目,这是一个不好的信号!)

您可能需要绘制或记录的一些内容包括:

  • 概念性程序流程(程序完成什么,以什么顺序完成?)
  • 已实现的程序流/函数调用图(程序如何实现其目标?调用了哪些函数或创建了类?)
  • 什么文件中包含什么代码?您有什么组织计划和规则来确定新职能的去向?如果您有一个强大的组织方案,即使没有IDE或类似IDE的“在整个项目范围内查找”功能,也很容易知道要查找给定功能或类的文件。
  • 相关地,哪些文件包括哪些其他文件(与函数调用图有关)?
  • 哪些类从其他其他类继承?每个课程的目的是什么?

您如何制作这些图表?在您的水平上,对于初稿,铅笔和纸可能是最好/最快的方法。当图表和文档变得更加完善时,您可以进行以下研究:

  • Dot / Graphviz,一组用于从.dot文件生成图形的程序。
  • LaTeX / TikZ,一种非常复杂且冗长的工具,用于生成任何形式的图形或图片-可能无法满足您的需求,特别是由于所有节点定位都是手动的,但应牢记这一点,尤其是在计划编写一个纸或其他类似的东西。
  • 对于C,gson egypt挂钩gcc并输出.dot调用图。可以自动化或嵌入到make命令中,这很好!
  • 相关地,GNU cflow可以为C生成纯文本调用图。其他语言可能也存在等效的工具,尽管您可能通常会偏离自动化工具-不手动创建图可能会妨碍您对代码的理解或提供不适当的内容复杂的细节级别(知道调用哪个函数printf()通常是无益的)。

我真的很在乎是否有好的文档,但是现在,我有点停止做文档了,因为我的代码在不断变化,以采用新的算法并尝试做一些事情。例如,在检测连续碰撞检测的代码中,我多次切换,从将先前的位置存储在Body类中到根据Body的运动来计算先前的位置。这种缺乏专业性的原因是我在编程时设计了东西,因为当我在物理引擎中设计东西时,我想检查它是否确实可行。

我想我应该将该项目视为实验性项目,然后使用我制作的原型从头开始重写它,但是我付出了很多努力以使其足够干净以保持其外观而不必重写所有内容。

0

尝试使用基于Petri网的图表。可以系统地将图转换为计算机程序,并且可以将高级图与低级图集成在一起。

参考文献

网络元素和注释:通用视觉编程语言(2016)。可在https://www.academia.edu/31341292/Net_Elements_and_Annotations_A_General-Purpose_Visual_Programming_Language中获得

用于计算机编程的网络元素和注释:PDF中的计算和交互(2014年)。可在https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interactions_in_PDF上获得

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.