강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của dltmddnr053959
dltmddnr053959

câu hỏi đã được viết

Lập trình D3D12 - Cơ bản

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

Viết

·

223

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;

		}
directxdirectx-12d3ddirectx12

Câu trả lời 2

0

megayuchi님의 프로필 이미지
megayuchi
Người chia sẻ kiến thức

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;

}

 

dltmddnr05님의 프로필 이미지
dltmddnr05
Người đặt câu hỏi

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

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

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

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

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

 

megayuchi님의 프로필 이미지
megayuchi
Người chia sẻ kiến thức

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

dltmddnr05님의 프로필 이미지
dltmddnr05
Người đặt câu hỏi

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

0

안녕하세요, 인프런 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));
    }
    

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

Hình ảnh hồ sơ của dltmddnr053959
dltmddnr053959

câu hỏi đã được viết

Đặt câu hỏi