2011-02-02 6 views
1

버텍스 데이터를 32 바이트로 정렬하면 일부 그래픽 카드의 이점이 있다는 것을 읽었습니다.OpenGL - 버텍스 구조체를 32 바이트로 정렬합니까?

이 일반적으로 추가하는 작업 패딩 :

typedef struct { 
    float x, y, z; 
    int padding[5]; 
} Vertex; 

하지만 궁금했다, 이것은 당신이 32 바이트 (malloc에 ​​1 바이트로 정렬)으로 정렬 할 데이터를 할당해야 의미도합니까? 데이터를 가리키는 포인터가 32로 균등하게 나뉘는 것을 의미합니까? 그게 그렇게 중요한 건가? 소스 메모리가 정렬되어있는 경우

답변

7

일반적으로

감사합니다 (I가 VBO이 데이터를 업로드하고)의 VBO에 대한 클라이언트 메모리에서 복사 작업이 빠를 수 있습니다 (대상은 일반적으로 될 것입니다). 다소 VBO로 업로드하는 방법에 따라 다릅니다.

즉, 업로드가 정렬에 의해 강화되는 유일한 것입니다. 일단 메모리가 VBO에 있으면, 제어 할 수없는 VBO 서버 메모리의 정렬이 중요합니다 (GL 구현은이를 알고 있고 VBO 메모리를 정렬합니다).

아, 32 바이트의 패딩은 4 바이트의 패딩으로 16보다 빠르지 않을 것입니다. 중요한 점은 두 개의 2의 크기를 가지므로 하나의 완전한 버텍스 가져 오기가 캐시 라인을 넘지 않는다는 것입니다.

마지막으로, malloc은 1 바이트로 정렬되지 않습니다. 대부분의 플랫폼에서 기본 유형의 최소 정렬 요구 사항에 맞 춥니 다.

+1

나는 plaftorm의 차이점을 벤치 마크해야한다고 덧붙이고 싶습니다. 버텍스 당 16 바이트는 아마도 정점 전용 버텍스에 좋은 선택 일 수 있지만, 패딩되지 않은 데이터 (2 개의 캐시 라인에 3 개의 꼭지점이 들어가는)가 더 빠르며 최소한의 메모리가 필요할 수도 있습니다. – rotoglup

+0

@rotoglup : 아무 것도 측정을 뛰지 못합니다. 그러나 중간에 정점이 _2_ 캐시 라인에 대한 액세스를 필요로하기 때문에 3 verts/2 캐시 라인이 느린 구현을 보았습니다. – Bahbar

+0

필자도 분명히 모든 것이 꼭지점의 액세스 패턴에 달려 있다고 가정합니다. 상대적 선형 순서로 액세스하는 경우 성능에 미치는 영향은 무시할 수 있습니다. 이 모든 경우에도 성능 병목 현상이 정점 액세스에 있어야합니다. P – rotoglup

관련 문제