2014-01-11 2 views
0

나는 (기본 게임) voxel 엔진을 실행하고 다음과 같이 보이는 물 시스템 (기본적으로는 작동한다고 가정) : https://www.youtube.com/watch?v=Q_TdeGIOOts (내 게임이 아님).
수위 값은 수레의 3d 배열에 저장되며, 0.05 초마다 물의 흐름은 아래 및 인접한 보셀 (y-1, x-1, x + 1, z-1, z + 1) 값을 더합니다.
이 시스템은 소량의 물에는 잘 작동하지만 (70+ fps), 8 + 청크로 물을 계산하기 시작하면 너무 많이 소모됩니다. (병목 현상인지 확인하기 위해 모든 렌더링 또는 메쉬 생성을 비활성화했습니다. 순전히 유량 계산입니다.)
나는 이미 경험 한 프로그래머가 아니기 때문에, 내가 이미했던 것처럼 코 루틴에서 계산을하는 것 외에는 어디에서 최적화를 시작할 지 알지 못한다.
https://gamedev.stackexchange.com/questions/55414/how-to-define-areas-filled-with-water (아래쪽 부근) Boreal은 계산 쉐이더에서 실행하는 것이 좋습니다. 이게 나를 위해가는 길인가? 그런 일은 어떻게하면 될까요?
도움을 주시면 감사하겠습니다.Unity C# Voxel 유한 물 최적화

답변

0

실제로 보셀 기반 시뮬레이션을 계산하는 경우 크기가 커짐에 따라 계산 수가 기하학적으로 확장되므로 더 큰 볼륨에서 처리 능력이 빠르게 소모됩니다.

컴퓨팅 쉐이더는 대용량의 병렬 계산을 신속하게 수행하는 데 적합하지만 프로그래밍 패러다임이 매우 익숙합니다. 계산 쉐이더는 버퍼의 내용 (즉, 우리 민간인을위한 '텍스처')을 살펴보고 매우 빠르게 처리합니다. 버퍼는 아마도 픽셀 값이 물 세포를 나타내는 버퍼/텍스처 일 것입니다. 계산 셰이더를 위아래로 증가시키는 것과 같은 간단한 작업을 원한다면 GPU의 병렬 처리 기능을 사용하여 속도를 높이십시오.

어려운 부분은 GPU가 optimized for parallel processing 인 것입니다. 이는 "texelA.value + = texelB.value"와 같은 코드를 작성할 수 없다는 것을 의미합니다. 추가 작업없이 버퍼의 각 조각은 다른 조각에서 일어나는 일에 대한 지식없이 처리됩니다. 다른 텍셀을 참조하려면 어떻게 든 다시 텍스쳐를 읽을 필요가 있습니다 - 일부 테크닉은 오프셋을 사용하여 하나의 텍스쳐를 여러 번 읽습니다. (this GL example 블러를 구현하기 위해이 작업을 수행합니까? 반복적으로 텍스쳐를 처리하고 결과를 임시 텍스처에 넣은 다음 다시 처리합니다.

10,000 피트 레벨에서 : 예, 계산 쉐이더는 여러 가지 자체 유사 계산이 포함되어 있기 때문에 이런 종류의 문제에 대한 좋은 도구이지만 박쥐에서 벗어나는 것은 쉽지 않습니다. 기존의 쉐이더 프로그래밍을 전에하지 않았 으면 GPU가 작동하는 방식에 익숙해지기 위해 먼저 살펴보아야 할 수도 있습니다. 심지어 기본적인 툴 (if-then-else 또는 루프)은 GPU 프로그래밍과 성능에 매우 다른 영향을 미치고 사용합니다. 차이점에 대해 머리를 숙이려면 약간의 시간이 필요합니다.이 글쓰기 (1/10/13) 시점에서는 Nvidia and Udacity are offering an intro to compute shader course hich 속도를 얻을 수있는 좋은 방법이 될 수도 있습니다.

FWIW 또한 계산 쉐이더에 꽤 현대적인 하드웨어가 필요하며 이로 인해 청중이 제한 될 수 있습니다.

+0

indepth 대답 주셔서 감사합니다! 내가 아직 그 수준에 있지 않다는 느낌이 들지만 나는 그것을 들여다 볼 것이다. 또한 내가 "덩어리를 내리고 싶다"면, 유한 물 계산이 계속되는 진정한 고통이 될 것임을 깨달았다 ... 다른 사람들이 어떻게하는지 궁금해한다. (이 신이 남성들 사이에서 : http://www.youtube.com/watch? v = Y9mGczbvoc0). 다시 한번 감사드립니다! – Kasper