답변:
imallett의 답변 에 덧붙여서 , 셰이더에서 다른 텍스처 데이터에 대한 액세스 수를 늘리면 GPU 캐시에 대한 압력이 증가하지만 그 효과에 크게 영향을 줄 수있는 몇 가지 다른 요소가 있습니다. CPU 캐시와 같이 GPU에 여러 계층의 캐시가있을 수 있다는 사실로 인해 복잡 할 수도 있습니다. 텍스쳐 유닛 <= L0 <= L1 <= ..Memory
텍스처 데이터를 최소화 한 장면이있는 경우, 원근감 또는 간단한 스케일링으로 인해 MIP 매핑을 사용하지 않는 경우 앨리어싱이 발생합니다. 이것은 단지 시각적 인공물을 생산하는 것이 아닙니다. 성능 문제 일 가능성이 큽니다.
앨리어싱을 가져 오면 텍스처에 대한 주소 액세스가 불일치하게되어 캐시를 스 래싱 할뿐만 아니라 많은 DRAM "페이지 나누기"(보다 정확하게는 행 나누기)가 발생하여 비용이 많이들 수 있습니다. MIP 매핑은 불일치를 줄입니다.
아마도 약간의 확실한 옵션이지만 8bpp에서 2bpp로 텍스처 압축 (예 : DXTn | ETC * | PVRTC * | etc)을 사용할 수 있다면 메모리 대역폭 / 캐시의 효율성을 크게 높일 수 있습니다. 4 배에서 16 배까지. 이제 모든 GPU에 대해 말할 수는 없지만 일부 텍스처 압축 체계 (예 : 위에 나열된 것)는 하드웨어에서 디코딩하기가 너무 간단하여 데이터 가 전체 캐시 계층 구조에서 압축 상태를 유지하고 텍스처 단위에서만 압축 해제 할 수 있습니다. 캐시의 크기를 효과적으로 곱합니다.
분명히, 후속 렌더링에서 텍스쳐 데이터로 사용되는 렌더 타깃과 같은 일부 데이터는 텍스쳐 압축을 사용할 수 없습니다. 가능할 때마다 작업을 수행하는 가장 작은 픽셀 형식을 사용하십시오. 즉, 32 / 16bpp (A) RGB가 할 경우 4x32 부동 형식을 사용하지 마십시오!
이것은 위의 앨리어싱 예제와 다소 관련이 있지만, 큰 렌더 타겟이 생성 된 다음 매우 드물게 샘플링되는 경우가 있습니다. 캐시 라인 (CPU 또는 GPU)은 상당히 길기 때문에 각 캐시 라인에서 하나의 픽셀 만 사용하면 전송이 낭비됩니다.
또한 WRT 압축 텍스처는 로컬 텍셀 영역간에 데이터를 효과적으로 공유하여 압축을 달성합니다. 일관성있는 액세스 권한이 없으면 메모리 풋 프린트 감소를 제외하고는 압축이 도움이되지 않습니다.
캐시 문제는 많지 않지만 (계산 된 액세스가 일관성이없는 경우가 아니라면) 정점과 함께 제공된 UV 좌표로 직접 정의되지 않은 텍스처 액세스는 직접 정의 된 것보다 느릴 수 있습니다.
요즘 대부분의 텍스처는 바둑판 식 배열 또는 Morton과 같은 (일명 Twiddled / Swizzled) 순서 (또는 둘 다의 조합)로 저장 될 것으로 생각되지만 일부 텍스처 는 여전히 스캔 라인 순서 일 수 있습니다. 텍스처는 많은 수의 캐시 누락 / 페이지 나누기를 유발할 수 있습니다. 불행히도 특정 형식이 그런 식으로 배열되어 있는지 확인하는 방법을 모르겠습니다.
(배경 읽기의 경우 Blinn의 텍스처 매핑에 대한 진실 . FWIW를 시도 하십시오. 몇 단계 만 더 거치면 적어도 일부 초기 PC 하드웨어에서 Twiddled-order (즉, Morton order) 텍스처가 사용됩니다 ).
대답은 당신이 의미하는 바에 달려 있습니다. 현대 하드웨어 (예 : 바인드리스 텍스처)는 "바인딩 된"텍스처 수를 너무 신경 쓰지 않습니다. 실제 질문은 당신 이 얼마나 많이 사용하는지 입니다.
텍스처는 일반적으로 캐시에 친숙한 방식으로 데이터를 저장합니다 (Morton 곡선). 더 많은 텍스처를 사용하면 더 많은 캐시 누락이 발생합니다. 이제 텍스처가 공간을 위해 서로 경쟁하기 때문입니다.
이것은 실제로 잘 알려진 오래된 셰이더 프로그래밍 휴리스틱으로 귀착됩니다. 텍스처 탭이 느립니다. 너무 많이 사용하지 마십시오.