문제

배경: DirectX에 Slimdx C# 래퍼를 사용하고 있으며 Sprite 클래스 (전통적으로 기본 DLL의 Direct3DX 확장에서)를 사용하여 많은 2D 스프라이트를 그립니다. 나는 한 번에 수백 개의 스프라이트를 화면에 그려서 성능이 굉장합니다. 쿼드 코어에서는 10,000 개 이상의 객체에 대한 논리, AI를 포함하여 전체 게임에 프로세서의 3-6%와 같은 것을 사용하고 있습니다. 두 번째 스레드 등의 루틴 등. 따라서 스프라이트는 전체 하드웨어 가속을 사용하여 그리기 중이며 모든 것이 그대로 있어야합니다.

문제: 라인 클래스에 통화를 소개하기 시작하면 문제가 발생합니다. 드래그 선택 상자의 경우 4 개의 라인을 그리면 프로세서 사용을 13-19%로 스카이 킷을 그립니다. 이것은 단지 네 줄만 있습니다!

내가 시도한 것들 :

  1. 라인 antialiasing을 끄고 켜고 있습니다.
  2. 글린을 끄고 켜십시오.
  3. 수동으로 줄을 호출하십시오.
  4. 모든 호출을 line.begin 및 line.end로 생략합니다.
  5. Line.Draw에 대한 통화가 Sprite.begin / Sprite.end 블록 내부에 있지 않은지 확인하십시오.
  6. Sprite.begin / Sprite.end 블록 내부에서 끄는 line.srain.
  7. 4 줄을 렌더링하거나 300을 렌더링합니다.
  8. 모든 스프라이트와 텍스트 렌더링을 끄고, 라인 렌더링을 4 줄로 남겨 두십시오 (이것이 일종의 모드 변화 문제인지 확인).
  9. 위의 대부분의 조합.

일반적으로, 이들 중 어느 것도 성능에 큰 영향을 미치지 않았습니다. #3 프로세서 사용량이 2% 감소했지만 심지어 여전히 8% 이상 높습니다. 가장 이상한 점은 위의 #7이 성능에 절대적으로 영향을 미쳤다는 것입니다. 300과 마찬가지로 4 라인만큼 느 렸습니다. 내가 생각할 수있는 유일한 것은 어떤 이유로 소프트웨어에서 실행되고 있다는 것입니다. 및/또는 그래픽 카드가 일종의 드로잉 모드 사이에서 지속적으로 앞뒤로 전환됩니다.

매트릭스 접근법 :

누군가 위의 문제에 대한 해결책을 알고 있다면, 나는 그것을 듣고 싶습니다!

그러나 나는 이것이 일반적으로 DirectX 내부의 문제 일 수 있다고 가정하므로 다른 경로를 추구하여 나만의 스프라이트 기반 라인을 만들었습니다. 본질적으로, 나는 1px 흰색 이미지를 가지고 있으며, 확산 색상을 사용하고 선을 그렸습니다. 이 작업은 성능 측면에서 작동합니다. 이와 같은 "라인"의 300을 그리기 위해 쿼드 코어에서 찾고있는 3-6% 프로세서 활용 성능 범위에 있습니다.

픽셀 스트레치 라인 기술에 두 가지 문제가 있습니다. 이는 누군가가 변환에 대해 더 잘 알고있는 사람이 저를 도울 수 있기를 바라고 있습니다. 수평선에 대한 현재 코드는 다음과 같습니다.

    public void DrawLineHorizontal( int X1, int X2, int Y, float HalfHeight, Color Color )
    {
        float width = ( X2 - X1 ) / 2.0f;
        Matrix m = Matrix.Transformation2D( new Vector2( X1 + width, Y ), 0f, new Vector2( width, HalfHeight ),
            Vector2.Zero, 0, Vector2.Zero );
        sprite.Transform = m;

        sprite.Draw( this.tx, Vector3.Zero, new Vector3( X1 + width, Y, 0 ), Color );
    }

이것은 대부분 스크린의 올바른 위치에서 대부분 올바른 크기의 선을 그린 한 작동합니다. 그러나 상황이 오른쪽으로 바뀌는 것처럼 보이며 이상합니다. 매트릭스 접근 방식이 전혀 옳은지 확실하지 않습니다. 1x1 스프라이트를 수평으로 수평으로, 수직으로 다른 양으로 확장하고 싶습니다. 그런 다음 중앙 지점 옆에 위치 할 수 있어야합니다. 그것이 괜찮습니다. 그것이 내가해야 할 일이라고 생각하지만, 왼쪽 상단으로 배치 할 수 있다면 더 나을 것입니다. 이것은 단순한 문제처럼 보이지만 매트릭스에 대한 나의 지식은 매우 약합니다.

이것은 순수하게 지배적이고 순수하게 지배적 인 라인이 나에게 작동하는데, 이는 대부분의 전투입니다. 나는 그와 함께 살 수 있고 현재 앵글 라인을 사용하고있는 위치에 다른 종류의 그래픽을 사용할 수 있습니다. 그러나이 스트레칭 픽셀 접근법을 사용하여 각진 선을 그릴 수있는 방법이 있다면 정말 좋을 것입니다. 다시 말해, 예를 들어 1,1에서 7,19의 선을 그립니다. 매트릭스 회전 등을 사용하면 이것이 가능해 보이지만 추측과 점검 외에는 어디에서 시작 해야할지 모르겠습니다. 영원히 걸릴 것입니다.

모든 도움이 감사합니다!

도움이 되었습니까?

해결책

파이프 라인 마구간처럼 들립니다. 렌더링 스프라이트와 렌더링 라인 사이에 일부 모드를 전환하여 새로운 원시를 시작하기 전에 그래픽 카드가 파이프 라인을 비우도록 강요합니다.

라인을 추가하기 전에 다른 모드를 사용하여 스프라이트가 렌더링되었거나 화면에 다른 요소가 있었습니까?

다른 팁

좋아, 나는 많은 실험 후에 수평선이 작동했다. 이것은 내가 전에 본 이상한 상쇄없이 작동합니다. 수직선에서도 동일한 원칙이 작동합니다. 이것은 있습니다 크게 라인 클래스보다 성능이 향상되므로 수평 및 수직 라인에 사용하는 것입니다. 코드는 다음과 같습니다.

    public void DrawLineHorizontal( int X1, int X2, int Y, float HalfHeight, Color Color )
    {
        float width = ( X2 - X1 );
        Matrix m = Matrix.Transformation2D( new Vector2( X1, Y - HalfHeight ), 0f, new Vector2( width, HalfHeight * 2 ),
            Vector2.Zero, 0, Vector2.Zero );
        sprite.Transform = m;

        sprite.Draw( this.tx, Vector3.Zero, new Vector3( X1, Y - HalfHeight, 0 ), Color );
    }

나는 각도에서 선에 맞는 버전을 갖고 싶습니다 (위에서 언급했듯이). 그것에 대한 제안이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top