XNA에서 이펙트 파라미터 설정을위한 모범 사례


13

EffectXNA에서 매개 변수 를 설정하는 가장 좋은 방법이 있는지 묻고 싶습니다 . 다른 말로하면, 전화 할 때 정확히 어떻게됩니까 pass.Apply()? 여러 시나리오를 상상할 수 있습니다.

  1. Apply호출 될 때마다 모든 효과 매개 변수가 GPU로 전송되므로 매개 변수 설정 빈도에 영향을주지 않습니다.
  2. Apply호출 될 때마다 재설정 된 매개 변수 만 전송됩니다. 따라서 실제로 새로운 값을 설정하지 않는 캐싱 세트 연산은 피해야합니다.
  3. Apply호출 될 때마다 변경된 매개 변수 만 전송됩니다. 따라서 캐싱 세트 작업은 쓸모가 없습니다.
  4. 언급 된 방법 중 어느 것도 게임 성능에 주목할만한 영향을 미치지 않기 때문에이 모든 질문은 부팅이되지 않습니다.

그래서 마지막 질문 : 다음과 같은 집합 연산 캐싱을 구현하는 것이 유용합니까?

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

기대 해줘서 고마워요.


DirectX 태그는 XNA보다 낮은 수준의 기능이라는 점에서 추가되었습니다.
Andrew Russell

나는 그 주제가 매우 실용적이라는 증거를 발견했다. 효과 매개 변수를 설정하는 방법이 영리한 경우 그리기 호출 수 (즉, CPU에서 처리 속도)를 두 번 이상 늘릴 수 있습니다. 나는 아직도 이것을 테스트하는 과정에 있으며, 당신은 내 질문을 읽을 수 있습니다 : gamedev.stackexchange.com/questions/66932/…
cubrman

답변:


8

이 모든 것이 CPU 측에서 발생하므로 캐싱이 유용한 기능이라면 추측합니다. 그래픽 드라이버가 자체적으로 구현할 합니다. 자신의 캐싱 레이어를 추가 할 필요가 없습니다.

매개 변수를 설정할 때마다를 호출 할 때마다 Apply이러한 호출은 대부분 그대로 DirectX로 전달되고 사용자 모드 GPU 드라이버로 그대로 전달됩니다. 그런 다음 사용자 모드 드라이버는 원하는 모든 작업을 수행 할 수 있습니다 . 세 가지 시나리오가 모두 가능합니다.

(시나리오 # 2는 가능성이 있기 때문에 의도적으로 실행하지 않는 것이 가장 좋습니다. 변경되지 않는 매개 변수를 재설정 .)

솔직히 말해서, 나는 전형적인 드라이버가 무엇을하는지 잘 모르겠습니다. 대부분 실제로 문제가되지 않기 때문입니다. 효과 매개 변수를 병목 현상으로 설정 한 사람은 들어 본 적이 없습니다. 이론적으로는 가능할 수도 있습니다. 그러나 걱정해야 할 더 많은 공통점이 있습니다.

성능을 측정하고 진행 상황을 이해하지 않고는 이와 같은 최적화를 구현하지 마십시오.

또한 a Matrix와 비교하는 ==것은 나쁜 부두입니다. A Matrixfloats 로 구성 되며 대부분의 경우 부동 소수점 동등성 비교가 실패하기 쉽습니다.

그리고 일반적으로 말하면 패턴 if(x != y) x = y;은 단순히보다 느립니다 x = y.


운전자가 이것에 관심을 가져야 할 흥미로운 점. 링크 (및 다시 링크)에 감사드립니다.
0xBADF00D

최근에 msdn 의 기하학 인스턴스 예제를 보았습니다 . 프레임 당 동일한 렌더 상태 (동일한 값으로)를 여러 번 재설정하면 렌더링 프로세스가 2 ~ 3 배 정도 상당히 느려집니다. 따라서 상태 일괄 처리는 매우 유용합니다. 불행히도 나는이 상황이 효과 매개 변수 설정에도 적용되는지 날씨를 잘 모르겠습니다. 그러나 나는 내 정보를 공유하고 싶습니다.
0xBADF00D

4

이 주제에 관해 내가 찾은 흥미로운 점이 있습니다.

msdn에서 :

Effect의 Parameters indexed 속성을 사용하여 effect 매개 변수에 액세스 할 수 있지만 EffectParameters를 사용하는 것보다 느립니다. 이러한 이유로 자주 변경되는 각 효과 매개 변수에 대해 EffectParameter를 작성해야합니다.

Effect에서 각 기법에 EffectParameter 인스턴스를 생성하고 할당하는 것은 Effect 에서 Parameters 인덱스 속성을 사용하는 보다 훨씬 빠릅니다 .

즉, _effect.Parameters["xWorld"].SetValue(value);눈에 띄게 느린wordlParam.SetValue(value);

따라서 아마도 다음과 같은 매개 변수를 캐시해야합니다.

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

그러나 실제 벤치 마크를 찾지 못했습니다.

출처 :

http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.EffectParameter%28v=xnagamestudio.40%29.aspx http://msdn.microsoft.com/en-us/library /bb976060%28v=xnagamestudio.31%29.aspx


Monogame과 WP 에뮬레이터에서 이것을 테스트했습니다. 실제로 5-15 % 사이의 큰 차이가 있음을 확인할 수 있습니다. 성능 향상에 도움이되는 트릭이 더 있습니까?
Konrad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.