2013-08-29 2 views
3

현재 특정 제약 조건에 대해 지정된 메쉬의 지오메트리를 최적화하는 C++에서 Maya 2013 플러그인을 작성 중입니다. 나는 최대 성능을 달성해야합니다. 지금은 단지 특정 제약 조건에 대한 알고리즘의 하드 코딩 된 버전을 구현하고 매우 빠르지 만, 주어진 제약 조건에 대한 알고리즘의 일반적인 구현의 일부 왕을 성취해야합니다 (따라서 어떤 종류의 다형성이 필요합니다).다형성과 펑터를 사용하여 빠른 성능을 달성했습니다.

알고리즘의 일반적인 구조에 대한 의사 코드는 다음과 같습니다

(1) do k times: 
(2)  for every face fj in the mesh do: 
(3)   some manipulation on the vertices qi incident to the face fj 
(4)  for every vertex vi in the mesh do: 
(5)   some manipulation on the faces fj incident to the vertex vi 

문제가 내 특정 구현에, 때 함수가 의사 코드에서 3 단계와 5의 계산을 요구하지 않습니다 있다는 것입니다 보조 기능이있는 단계를 계산해 보았는데 성능이 크게 저하되었습니다.

일반적인 구현을 위해서는 모든 제약 조건에 대해 3 단계와 5 단계에서 함수 호출을해야합니다.

  1. 제약 조건에 대한 일반적인 클래스를 작성 :

    내가 솔루션 두 가지 종류의 생각. 알고리즘에서 3 단계와 5 단계를 계산하는 데 필요한 모든 제약 조건에 대한 클래스를 유도합니다.
  2. 일반 펑터 (클래스 연산자 만 사용하는 클래스)를 작성하고 3 및 5 단계를 계산할 때 펑터에서 파생됩니다.이 아이디어의 이유는 펑터에서() 연산자에 대한 호출이 인라인됩니다 (answer about reusable code in this link) .

첫 번째 질문 :

함수 호출에 대한 오버 헤드를 줄일 수있는 방법이있다?

두 번째 질문 :

컴파일러는 항상 두 가지 솔루션 위 의 함수를 인라인 할 수있는 방법이있다? 이 question에서 가상의 개체에 대한 포인터에서 호출 된 함수는 인라인 될 수 없다는 것을 알고 있습니다.

세 번째 질문 :

다음보다 효율적인 방법 내가 제안 된 솔루션이있다?

+1

'연산자()'재미있는 이름을 가진 단지 일반 멤버 함수입니다. 다른 이름의 멤버 함수보다 인라인 된 기회가 더 적거나 적습니다. 특히 정당한 이유로 가상의 경우이 기회는 거의 제로입니다. –

답변

1

템플릿을보고 템플릿 함수/펑터를 매개 변수로 전달하는 것이 좋습니다.
동적 인 다형성 당신은 거의 항상 간접적으로 함수를 호출합니다. 즉, 함수의 몸체는 컴파일러에 알려지지 않습니다. 따라서 최적화 옵션이 제한됩니다. 템플릿을 사용하면 정적 인 다형성을 수행 할 수 있습니다.

더 많은 정보를 원하시면 다음 링크를 참조하십시오

Static polymorphism definition and implementation

C++ templates for performance?

+0

정적 다형성을 사용하는 클래스에서 정적 함수를 인라인 할 수 있습니까? – DontCareBear

+0

예. 그러나 인라인 키워드는 단지 힌트 일뿐입니다. 대부분의 컴파일러는 관계없이 작은 함수를 인라인합니다. 가장 좋은 방법은 조립품을 확인하는 것입니다. – Anycorn

+0

대단히 감사합니다 !! 몇 가지 질문이 있습니다. P 파생 클래스 목록이 필요합니다. 만약 내가 정적 다형성을 사용하는 등의 목록을 유지하는 방법? 파생 클래스가 기본 모양 을 사용하기 때문입니다. 다양한 수의 템플릿 매개 변수를 사용할 수 있습니까? – DontCareBear