Code: Select all
for each EFFECT
{
e->Begin();
for each PASS
{
e->BeginPass();
for each OBJECT
{
// 현재 오브젝트에 대해 필요한 셰이더 상수 커밋한다.
e->CommitChanges();
// 그린다.
}
e->EndPass();
}
e->End();
}
그리기 위해 필요한 셰이더 상수를 셋업하는 CommitChanges()에서 제법 심한 병목을 일으킵니다.
여러분들은 CommitChanges() 최적화를 위해 어떤 작업들을 하고 계신가요?
제가 하는 방법은,
1. 기본적으로 이펙트(ID3DXEffect) 및 이펙트 패스를 우선하여 그릴 목록을 정렬한다.
2. ID3DXEffect::Setx 함수를 호출할 때 동일한(유사한) 값이라면 스킵한다.
3. ID3DXEffect::Setx 함수가 실제로 한 번도 호출되지 않았다면 CommitChanges() 자체를 스킵한다.
(3)번은 CommitChanges() 내에서 변화 목록을 관리하고 있기 때문에 안 해줘도 무방할 것 같구요.
(2)번의 경우 캐릭터 셰이더가 사용하는 대부분의 상수 레지스터가 매트릭스 팔레트이기 때문에 스킵될 확률이 낮은 편입니다.
(1)번이야 기본으로 하는 거고..
마땅히 좋은 아이디어가 떠오르지 않는데, 다른 분들은 이 문제를 어떻게 해결하고 계신지 궁금합니다. ^^: