2017-01-17 6 views
0

내 게임 엔진은 많은 수의 텍스처 배열을 할당하려고 시도합니다. 이 배열은 할당에 실패 할 정도로 커질 수 있습니다. 어느 시점에서 (계속적으로) 텍스처 배열을 반으로 분할합니다.제한된 VRAM에서 OpenGL 드라이버가 대형 텍스처 배열을 얼마나 잘 처리합니까?

glGetError:Out of memory을 받고 거기에서 축소 될 때까지 경계를 밀어 넣는 것은 나쁜 설계입니까?

내 응용 프로그램이 거대한 청크를 할당하고 있기 때문에 GTT 메모리로 스왑해야 할 수도 있습니다. 마찬가지로 그래픽 드라이버가 다른 OS 작업을 처리 할 때 많은 개별 텍스처보다는 몇 개의 큰 텍스처 배열을 조작하는 것이 덜 바람직합니까?

답변

1

드라이버가 대형 텍스처 배열을 얼마나 잘 처리하는지 평가하는 것은 어렵습니다. 다른 운전자의 행동은 많이 다를 수 있습니다.

텍스처 배열을 사용하는 동안 그리기 호출 수를 줄여 성능을 향상시킬 수 있지만 이것이 주요 목표는 아닙니다. 무승부 콜 감소는 모바일 플랫폼에서 다소 중요하며, 심지어 수십 개는 문제가되지 않습니다. 귀하의 우려 사항과 정확하게 최적화하려고하는 것이 확실하지 않지만 최적화를 수행하기 전에 GPU 공급 업체의 프로파일 링 도구를 사용하는 것이 좋습니다.

Is it bad design to push the boundaries until receiving a glGetError:Out of memory and scale back from there?

데이터가 GPU에 동적으로로드 될 때 일반적으로 수행되는 작업입니다. 오류가 수신되면 이전 데이터를 언로드하여 새 데이터를로드해야합니다.

Is my application a jerk because it's allocating huge chunks of VRAM, which may require swapping into GTT memory?

데이터가 GTT로 스왑되었는지 여부는 확인할 수 없습니다 (드라이버가 GTT를 전혀 지원하지 않는 경우). 드라이버가 자체적으로 처리하므로 OpenGL API에서 액세스 할 수 없습니다. NVidia에서 GPU를 사용하는 경우 Nsight과 같은 프로파일 링 도구를 사용해야 할 수도 있습니다.

거대한 텍스처 배열을 하나 만들 계획이라면 VRAM에 전체적으로 들어 맞아야하며 부분적으로 VRAM과 GTT에 들어갈 수는 없습니다. 나는 GTT에 전혀 의지하지 않는 것이 좋습니다.

VRAM에 바인딩해야하기 때문에 드라이버는 셰이더에서 선택이 이루어지기 때문에 어떤 레이어가 사용되고 어떤 레이어가 사용되는지 미리 알 수 없으므로 VRAM에 꼭 맞아야합니다.

텍스처 배열과 3dtexture가 개념적으로 다르다는 사실에도 불구하고 하드웨어 수준에서 매우 유사하게 작동하지만 차이점은 첫 번째는 두 차원의 필터링과 두 번째 차원의 필터링을 사용한다는 것입니다.

나는 한동안 큰 3d 텍스처로 놀고있었습니다. 저는 GeForce 1070 (6GB)을 사용한 실험을했는데 텍스처 1GB까지 처리했습니다. 내가로드 할 수 있었던 가장 큰 텍스처는 약 3GB (2048x2048x7 **)이지만 종종 오류가 발생합니다. 텍스쳐에 맞는 많은 양의 프리 VRAM을 가져야한다는 사실에도 불구하고 여러 가지 이유로 큰 덩어리를 할당하지 못할 수도 있습니다. 따라서 절대적으로 필요한 경우가 아니라면 VRAM의 전체 크기에 필적하는 텍스처를 할당하지 않는 것이 좋습니다.

+0

얼마나 많은 텍스처를 안정적으로 관리했는지에 대한 통계를 알려 주셔서 감사합니다. 하드웨어의 범위가 더 넓어지면 좋은 소식이지만, 지금은이 비율을 취할 것입니다. – Balk