inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

D3D12 프로그래밍 - 기초편

코드에 대한질문있습니다.

230

dltmddnr05

작성한 질문수 3

0

 

처음 디바이스 생성부분에서 어댑터를 순환하면서 Device 를 생성하는데

저같은경우에는 그래픽카드를 2개 사용중인데 1080과 4090을 사용중인데 첫번째 어댑터에 1080으로 인식되면서 1080을 이용해서 Device 를 생성하는것 같은데 , 이럴경우 문제가되지않나요? 4090 을 이용못하는거아닐까요?

	}	for (DWORD featerLevelIndex = 0; featerLevelIndex < FeatureLevelNum; featerLevelIndex++)

	{

		UINT adapterIndex = 0;

		while (DXGI_ERROR_NOT_FOUND != _factory->EnumAdapters1(adapterIndex, &pAdapter))

		{

			pAdapter->GetDesc1(&AdapterDesc);

			if (SUCCEEDED(D3D12CreateDevice(pAdapter.Get(), featureLevels[featerLevelIndex], IID_PPV_ARGS(&_device))))

			{

				break;

			}

			adapterIndex++;

		}

		if (_device)

		{

			break;

		}

directx directx-12 d3d directx12

답변 2

0

megayuchi

IDXGIAdapter::GetDesc()함수를 사용하면 Device ID를 얻을 수 있습니다.

RTX4090의 Device ID를 얻어서 다음과 같이 비교해서 4090이 아니면 스킵시키면 됩니다.

내부 코드로는 이 정도로 충분하고 배포를 한다면 그래픽 카드를 선택할 수 있는 옵션을 주는게 좋겠죠.

#define DEVICE_ID_RTX4090 XXXXXX

.

.

.

DXGI_ADAPTER_DESC desc;

pAdapter->GetDesc(&adapterDesc);

if (DEVICE_ID_RTX4090 != adapterDesc.DeviceId)

{

continue;

}

 

0

dltmddnr05

감사합니다. 추가질문있습니다!

1.어댑터를 어케고르느냐에 따라 성능차이가많이날까요? 예를들어 4090 이랑 1080 어댑터 차이 ..

2. 모든어댑터를 순회하면서 최고성능을 가진 어댑터를 이용하여 디바이스를 생성할수있도록 코드를 바꿨는데 , m_swapchain->setFullScreen 함수가 반복문의 첫번째 어댑터 가아니면은 작동을 안하는데 혹시 이유를 알수있을까요?

첫번째 꼽힌 1080으로 디바이스 생성을 하면 m_swapchain->setFullScreen 이 작동함.

두번째로 꼽힌 4090 으로 디바이스 를 생성시 m_swapchain->setFullScreen 이 브레이크 포인트에도 안걸림..

 

0

megayuchi

성능차이가 큽니다만 강좌의 예제 정도는 1080에서 돌리나 4090에서 돌리나 체감할만한 차이는 없습니다. 다만 D3D12에 추가된 기능은 Mesh Shader나 RayTracing은 1080에선 사용할 수 없습니다. SetFullScreen()함수가 실패하는 이유는 모르겠는데 D3D DebugLayer를 켜두셨다면 VS의 Ouput 윈도우에 실패 이유가 나와있을것 같네요.

0

dltmddnr05

감사합니다 ! 브레이크포인트에도 안걸려서 ... 이유를모르겠네요

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. dltmddnr05님.

그래픽 카드가 두 개 이상 있는 경우, 어떤 어댑터를 사용할지 명시적으로 제어하지 않으면 처음 발견된 어댑터가 선택될 수 있습니다. 따라서 현재 코드에서는 첫 번째로 발견된 어댑터(1080)를 사용하게 됩니다. 더 성능 좋은 4090을 사용하고 싶으시면 어댑터를 선택하는 과정에서 이를 반영해주는 로직이 필요합니다.

아래와 같은 방식으로 특정 어댑터(예, 4090의 VendorID 또는 DeviceID)를 찾게 하고, 해당 어댑터로 디바이스를 생성할 수 있습니다.

추천할 만한 유사한 답변:

  1. 디버깅 할 때 훨씬 직관적입니다. 이유가 따로 있나요? - DirectX 객체의 생성과 선택 과정에서 필요한 기초적인 정보를 확인할 수 있습니다.
  2. Comptr를 사용하는 대신 raw pointer를 사용할 이유가 있나요? - 메모리 관리와 관련하여 유사한 설명을 확인할 수 있습니다.

간단한 설명:

  • 어댑터 선택 로직 추가:

    IDXGIAdapter1* GetAdapter(IDXGIFactory1* pFactory, bool preferHighPerformanceAdapter)
    {
      IDXGIAdapter1* pAdapter = nullptr;
      IDXGIAdapter1* pTempAdapter = nullptr;
      DXGI_ADAPTER_DESC1 desc;
    
    
      for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != pFactory->EnumAdapters1(adapterIndex, &pTempAdapter); ++adapterIndex)
      {
          pTempAdapter->GetDesc1(&desc);
          if (preferHighPerformanceAdapter)
          {
              // Replace with your own logic to select a high-performance GPU (e.g., by Vendor ID or by checking the adapter's description)
              if (desc.VendorId == YOUR_HIGH_PERFORMANCE_GPU_VENDOR_ID)
              {
                  pAdapter = pTempAdapter;
                  break;
              }
          }
          else
          {
              pAdapter = pTempAdapter;
              break;
          }
      }
      return pAdapter;
    }
    

    위 코드를 통해, 더 높은 성능의 어댑터를 선택할 수 있습니다.

  • 디바이스 생성 시 적용:

    IDXGIAdapter1* pAdapter = GetAdapter(_factory.Get(), true);
    if (pAdapter)
    {
      D3D12CreateDevice(pAdapter, featureLevels[featerLevelIndex], IID_PPV_ARGS(&_device));
    }
    

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

복습중에 커맨드 큐 관련 질문이 있습니다.

0

35

1

assimp-vc143-mtd.dll가 없어서 코드 실행을 진행할 수 없습니다 라는 에러가 뜹니다.

0

78

1

_vsBlob와 _psBlob에서 nullptr이 뜨면서 실행이 안됩니다

0

56

1

혹시 영상이 안되는 이유가 있을까요?

0

87

2

Model.cpp에서 ReadMaterial()의 SpecularTexture 부분 질문입니다.

0

55

0

노멀매핑 자료

0

72

1

셰이더 인텔리센스 문제

0

79

1

#include d3dx12.h 추가했지만 오류

0

81

1

MeshObject 공용 사용 방법

1

95

2

BuildBLAS 할당 리소스 사이즈

0

79

2

4강 삼각형띄우기 오류관련 질문있습니다

0

64

1

ConstnatBufferPool관련 질문

0

69

2

LNK1104 error, DirectXTexD.lib 파일을 열 수 없습니다.

0

122

1

64.애니메이션 강의의, AssimpTool 에서 FBX 애니매이션 데이터를 옮길 때의 강의 오류가 있는 것 같습니다.

1

65

1

SkyDemo에서 카메라 입력이 작동하지 않는 문제

0

81

2

섹션6. DirectX 11 3D 입문 강의부터 렌더링이 안됩니다

0

131

2

CommandList의 GraphicsCommandList 변경이유

0

113

2

[25:13] Virtual Interface 와 COM Interface간의 차이가 궁금합니다.

0

116

1

텍스처와 UV 강의 관련해서 문의드려요

0

162

2

frame간 보간에 대해서 질문이있습니다.

1

132

1

Descriptor를 복사하는 이유

0

315

2

Comptr 을 안쓸시 메모리 해제순서

0

282

2

raw pointer 쓰시는 이유가 따로 있으신가요?

0

384

1

질문있습니다.

0

431

2