물리 엔진의 설계를 시각화하는 방법은 무엇입니까?


17

나는 물리 엔진을 만들고 있는데 모든 것을 추적하기가 매우 어려워지고 있습니다. 휴식 후 코드로 돌아올 때 종종 왜 작동하지 않는지 기억이 나지 않습니다. 대부분의 문제는 단순한 프로그래밍 실수가 아니라 물리 엔진의 설계 결함입니다. 그렇기 때문에 프로그래밍하기 전에 디자인을 마쳐야합니다.

그러나 물리 엔진의 전체 디자인을 종이에 쓰는 방법이 필요합니다. 그렇지 않으면 내일 잊어 버리고 다시 길을 잃을 것입니다. 물리 엔진 설계에는 UML 클래스 다이어그램이 전혀 적합하지 않습니다. 나는 수업이 아니라 과정에 관심이 없다. 프로세스의 단일 단계 (프레임)를 모델링해도 여러 단계에서 엔진의 최종 동작을 이해하는 데 도움이되지 않기 때문에 비즈니스 프로세스 다이어그램이 실제로 유용하다고 생각하지 않습니다.

프로세스를 추적하는 데 도움이되도록 어떤 종류의 다이어그램을 사용해야합니까? 물리 엔진을 만들기 위해 어떤 종류의 다이어그램 전문가가 사용합니까?


4
먼저, 엔진 사용 방법과 평가 방법을 보여주는 고급 흐름도를 제안합니다. 또는 OpenGL 파이프 라인 다이어그램 ( openglinsights.com/pipeline.html ) 과 비슷한 것이 있습니다. 그런 다음 Google 이미지에서 "물리 엔진 다이어그램"을 검색하여 다른 사람들이 어떻게 수행하는지 확인합니다. ;)
FrustratedWithFormsDesigner

4
"UML 다이어그램"이란 아마도 클래스 다이어그램을 의미합니까? 클래스 다이어그램은 UML의 7 가지 구조 다이어그램 중 하나입니다. 7 가지 유형의 행동 다이어그램도 있습니다.
COME FROM

우선, 물리 엔진에 대해 아주 잘 이해해야합니다. 모든 작은 세부 사항과 일이 함께 작동하는 방법. 프로그래밍과 관련이 없습니다. 그런 다음 프로그래밍 엔터티 (클래스) 및 상호 작용에서 모델링하려고합니다. 스케치 나 손으로 쓴 메모 등 원하는 도구를 사용할 수 있습니다. 그런 다음 한 번에 하나씩 수업을 만듭니다. 콘솔 응용 프로그램을 작성하여 시작하십시오. 당신은 당신의 작은 수업이 작동하고 기대하는 것을 수행하기 위해 단위 / 클래스 테스트를 사용할 수 있습니다
John Kouraklis

6
내 경험상 전문 프로그래머는 디자인 문서 나 다이어그램을 사용하여 디자인하지 않습니다. 화이트 보드에있을 수도 있습니다. 현대적인 프로그래밍 언어로 디자인은 머리와 코드에 있습니다. 설계 문서 또는 다이어그램은 커뮤니케이션에 가장 많이 사용됩니다. 귀하의 설명에 따르면 귀하의 디자인을 분해해야한다고 생각합니다.
JimmyJames

1
"물리 엔진 설계에는 UML 클래스 다이어그램이 전혀 적합하지 않습니다." 왜 안돼? 수업은 모두 우려의 분리에 관한 것입니다. 모든 시스템은 고유 한 역할을 가진 구성 요소로 나눌 수 있으며 이러한 구성 요소는 일반적으로 클래스로 만들 수 있습니다.
Tanner Swett

답변:


29

해야 할 일 목록은 훌륭합니다.

// #TODO : blah blah 의견에 대해 이야기하고 있지 않습니다. 나는 하나님의 노트북에 정직한 것을 의미합니다.

중요한 일을 언제 기억하는지 알 수 없습니다. 노트북이 조용히 앉아서 필기가 어떻게 컴파일되지 않을지에 대해 불평하지 않고 생각할 수 있습니다. 내 최고의 아이디어 중 일부는 화장실에서 발생합니다 (예, 방수 노트북을 가지고 있지만 멀리 갈 필요는 없습니다).

봉합 된 (접착되지 않은) 포켓 크기의 포켓을 얻을 수있어 포켓에서 떨어지지 않습니다. 북 마크가 내장 된 멋진 책을 얻지 못했습니까? 테이프, 가위, 리본 등 아무도 모릅니다.

아이디어가 나오면 그냥 적어 두십시오. 각 아이디어 옆에 작은 상자를 그리면 완료된 것으로 쉽게 표시 할 수 있습니다. 페이지 상단에 상자를 넣으면 페이지가 완료된 시점을 알 수 있습니다.

어떤 순차 액세스로는 충분하지 않습니까? 네, 포켓 바인더도 만들어요. 이 모든 것이 조금처럼 보일지 모르지만 메모를 게시하거나 Jira에서 모든 것을 포착하려고 시도하는 것보다 낫습니다.

절반 만 구현하지 마십시오

개선 사항을 작고 달성 가능하게 유지하십시오. 한 번에 끝내지 못하는 것은 시작하지 마십시오. 그것이 크면 작은 단계로 나눕니다. 컴파일하고 테스트를 통과 한 코드는 항상 그대로 두십시오. 오, 결코 본 적이없는 테스트를 통과하지 마십시오. 테스트는 합격과 불합격으로 테스트하는 방법입니다.

종이에 전체 디자인이 필요하다고 생각하지 마십시오.

당신이해야 할 일은 진화하는 계획을 포착하는 것입니다. 당신은 당신이 끝났을 때 일이 어떻게 보일지 모르므로, 당신은 척하지 마십시오. 당신이 할 수있는만큼 알아 낸 것을 포착하십시오. 필요한 경우 냅킨과 크레용을 사용하십시오. 어쨌든 UML의 90 %를 이해하는 사람은 거의 없습니다. 보여줄 것을 보여줄 수있는 방법을 사용하십시오. 나는 내 인터페이스와 무엇에 대해 아는 것을 보여주는 데 중점을 둡니다.

코딩을 멈출 때 메모 작성

키에서 손가락을 떼는 순간은 마지막으로 수행 한 작업과 계획 한 작업을 이해하는 것입니다. 일부 노트에서 최대한 이해하기 쉽게 이해하십시오. 의견 만 있으면 컴퓨터에 묶여 있고 의자에 웅덩이를 남길 수 있습니다. 다시 한 번, 노트북을 갖는 것은 대단한 일입니다.

이런 식으로 뇌를 우아하게 착지하고 방광을 절약하며 카페인과 치아를 바르지 않고 나중에 다시 이륙 할 수 있습니다.


(정직한 노트북 인 Emacs Org 모드도 잘 작동합니다. 프로세스에 따라 유사한 도구, 문제 트래커조차도 잘 작동 할 수 있습니다. 생각하는 동안 그림 .)
9000

6
일에 대한 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 레이어로 제한되므로 간단합니다.

일반적으로 가장 유용한 것은 각 레벨에서 제공하는 인터페이스 설명 및 보증입니다. 예를 들어 벡터 수학의 형식과 숫자 오류에서 발생하는 일; 더 큰 객체 설명의 형식 (항상 볼록? 항상 시계 방향 ?? 교차하는 방법? 등), 상호 작용의 기계적 매개 변수 (시간이 어떻게 진행됩니까? 어떻게 질량이 처리되는지? 운동량은 항상 유지됩니까? 적절한 상호 작용 (마찰을 다루는 방법? 변형? 조각화?은 기계적 에너지를 열 손실로 바꾸는 것입니까?)

각 층은 그것이 제공하고 제공하는 것을 관찰 할 수있는 양의 물건을 가질 수있을 정도로 작아야합니다. 이 설명은 구현 코드를 작성하지 않고도 작성 될 수 있습니다 (아직). 이렇게하면 3 층 깊이 끔찍하게 잘못된 일을했다고 판단 할 가능성이 줄어 듭니다. 그랬다면 이미 최대 2 개의 레이어까지 보입니다.


코드를 상향식으로 작성하여 문제 세트를 점점 더 표현하는 레이어를 만드는 것이 좋습니다. 그러나 당신이 처음에 제대로 얻을 것이라고 생각하지 마십시오. 더 높은 수준으로 구현하기 위해 레이어를 사용하기 시작하면 API에 문제가 있으며 다시 돌아가서 변경해야합니다. 괜찮아.
Justsalt

4

건축의 다이어그램을 만드십시오! 의 OpenGL 파이프 라인 다이어그램 FrustratedWithFormsDesigner는 의견이 프로그램에 대한 좋은 예이다 게시 흐름 ,하지만 유용 할 수 있습니다 다이어그램의 한 종류입니다.

다이어그램을 디자인 할 때 코드를 간단하고 직관적으로 이해 하려고합니다 . 여기에는 OpenGL 파이프 라인 다이어그램의 최상위 노드와 같은 고급 개념 또는 전체 기능 호출 그래프와 같은 매우 세부적인 기술적 세부 사항이 포함될 수 있습니다.

이상적으로 문서는 다른 사람들이 쉽게 이해할 수 있도록 코드를 작성해야합니다. 이를 통해 코드 검토 또는 오픈 소스 협업과 같은 작업을 쉽게 수행 할 수 있습니다. 수백 수천 또는 수백만 줄의 코드로 작업 할 때 프로그램을 읽지 않고 프로그램이 어떻게 작동하는지 이해하는 것이 큰 프로젝트를 통해 코드베이스를 추적하거나 다른 사람에게 소개하는 데 큰 영향을 미치는지 살펴보십시오. . 130 만 개의 LOC를 가진 Vim 저장소는 /src/README.txt 에 이것에 대한 훌륭한 고급 문서 (IMO)를 가지고 있습니다. 소개합니다 :

  • 각 파일의 코드는 무엇입니까
  • 중요한 글로벌 변수와 그 값
  • 메인 루프에서 일어나는 일과 그것이 호출하는 기능
  • 각 모드에서 발생하는 일과이를 처리하는 주요 기능
  • 기본 디버깅 기능

패치를 제공하려면 일반적으로 많은 파기없이 목표를 달성하기 위해 어떤 파일을 수정해야하는지 알고 있습니다.

Vim의 가장 큰 특징 중 하나는 /src/README.txt찾기 쉽고 포괄적 인 것입니다. srcGithub 에서 폴더 를 클릭하면 자동으로로드되고 다른 코드 또는 문서를 찾는 방향을 제공합니다. Powershell 저장소와는 대조적이지만 필자는 예제를 보았지만 Vim 's와 동등한 파일을 찾을 수 없었습니다 /src/README.txt. (988 만 LOC가 포함 된 프로젝트의 나쁜 신호!)

다이어그램이나 문서화를 원할 수있는 것들은 다음과 같습니다.

  • 개념 프로그램의 흐름 (프로그램이 무엇을 않습니다 달성 하고, 무엇을 위해?)
  • 프로그램 흐름 / 함수 호출 그래프 구현 (프로그램은 어떻게 목표를 달성합니까? 어떤 함수가 호출되거나 클래스가 작성됩니까?)
  • 어떤 파일에 어떤 코드가 있습니까? 조직 기능은 무엇이며 새로운 기능이 어디로 가는지 결정하기 위해 어떤 규칙이 있습니까? 강력한 조직 구성을 사용하는 경우 IDE 또는 IDE와 같은 "프로젝트 전체 찾기"기능이 없어도 지정된 함수 또는 클래스를 찾아야 할 파일을 알면 쉽습니다.
  • 관련하여 어떤 파일에 다른 파일이 포함되어 있습니까 (함수 호출 그래프 관련)?
  • 어떤 클래스가 다른 클래스에서 상속됩니까? 각 수업의 목적은 무엇입니까?

어떻게 다이어그램을 만들 수 있습니까? 당신의 수준에서 그리고 초안의 경우, 연필과 종이가 아마도 가장 좋은 방법 일 것입니다. 다이어그램과 문서가 더 정교 해지면 다음을 살펴볼 수 있습니다.

  • Dot / Graphviz, .dot파일 에서 그래프를 생성하는 프로그램 세트 .
  • LaTeX / TikZ는 모든 종류의 그래프 또는 그림을 생성하기위한 매우 복잡하고 장황한 도구입니다. 특히 모든 노드 위치를 수동으로 지정하기 때문에 필요에 따라 너무 무거울 수 있지만 특히 나중에 종이나 그런 종류의 것들.
  • C의 경우 gson 은 호출 그래프에 egypt연결하여 gcc출력합니다 .dot. make명령 에 자동화되거나 포함 될 수 있습니다 .
  • 이와 관련하여 GNU cflow는 C에 대한 텍스트 전용 호출 그래프를 생성 할 수 있습니다. 일반적으로 자동화 된 도구에서 벗어나고 싶을 수도 있지만 다른 언어에 해당하는 도구가있을 수 있습니다. 그래프를 수동으로 만들지 않으면 코드에 대한 이해를 방해하거나 부적절하게 제공 할 수 있습니다 복잡한 수준의 세부 사항 (어떤 함수를 호출하는지 아는 printf()것은 대개 도움이되지 않습니다).

나는 좋은 문서화에 대해 정말로 걱정하고 있지만, 지금은 코드가 새로운 알고리즘을 적용하고 무언가를 시도하기 위해 끊임없이 변경되기 때문에 문서화를 중단했습니다. 예를 들어, 연속 충돌 탐지를 감지하는 코드에서 Body 클래스의 이전 위치 저장에서 Body의 이동으로 이전 위치를 계산하는 것으로 여러 번 전환했습니다. 이 전문성 부족은 프로그래밍 중에 물건을 디자인했기 때문입니다. 물리 엔진에서 무언가를 디자인 할 때 실제로 가능한지 확인하고 싶기 때문입니다.
Winter

나는이 프로젝트를 실험적으로 고려한 다음 내가 만든 프로토 타입으로 처음부터 다시 작성해야한다고 생각하지만 모든 것을 다시 쓰지 않고도 깨끗하게 유지할 수 있도록 많은 노력을 기울였습니다.
Winter

0

Petri Nets 기반 다이어그램을 사용해보십시오. 다이어그램을 체계적으로 컴퓨터 프로그램으로 변환 할 수 있으며, 고급 다이어그램을 하위 다이어그램과 통합 할 수 있습니다.

참고 문헌

순 요소 및 주석 : 범용 비주얼 프로그래밍 언어 (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 에서 사용 가능합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.