본문 바로가기

일하면서 사용한 짧은 지식/C++, DirectX11

(10)
Handle Leak 디버깅 Go 버튼 Break 버튼 0:000> !htrace -enable htrace 활성화 - 윈도우가 모든 핸들의 생성과 소멸에 관련된 호출에 대해서 기록하게 된다. Go 버튼 대기 또는 Handle Leak 상황 재현 Break 버튼 0:000> !htrace -diff !htrace -diff - 동일한 핸들 값에 OPEN만 있고 CLOSE가 없는 것들을 출력해준다. 이후 출력되는 Call Stack으로 Handle Leak 원인 추적 https://learn.microsoft.com/ko-kr/windows-hardware/drivers/debugger/ WinDbg 설치 - Windows drivers Windows 디버거 및 WinDbg 설치에 대한 개요는 여기에서 시작합니다. learn.micr..
C++에서 std::to_string으로 int를 string으로 변환, c_str()로 string에서 const char* 반환 1. 상황 GStreamer를 사용중에 GObject의 property를 설정할 필요가 있었다. property를 설정하기 위해서는 g_object_set()의 두 번째 파라미터로 property이름을 const gchar* 형태로 넘겨줘야한다. 여기서 property 이름을 원하는 조건에 맞는 string값으로 조합할 필요가 있었다. 이때 C++로 string을 조작한 방법을 복습하기 위해 정리한다. 2. 사용했던 string 조작 방법 1) std::to_string으로 int를 string으로 변환 2) '+' 연산자로 string 합치기 3) c_str()로 string에서 const char* 반환 3. 예제 코드 작성 #include #include void MakeStringAndShow()..
DirectX11 COM 객체 메모리 누수 원인 추적하기 https://social.msdn.microsoft.com/Forums/SECURITY/en-US/2b043a3a-2320-4cf5-8b9b-4fe5c2a7f119/what-does-setprivatedata-mean-in-directx-11?forum=vcgeneral What does SetPrivateData(...) mean in DirectX 11? I've read the documentation about SetPrivateData but I don't know how to use it, I know that it's a memory leak detection according to the documentation but I don't know how to use it. There are ..
Direct2D에서 SetTransform으로 설정한 값 초기화하기 1. 상황 Direct2D를 이용하여 기존 이미지를 Transform하여 렌더링할 필요가 있었다. ID2D1DeviceContext2의 SetTransform 메서드에 Matrix3x2F::Scale(D2D1_SIZE_F,D2D1_POINT_2F)를 전달하여 원하는 모양으로 렌더링하였다. 하지만 이렇게만 하니 이 과정 이후에 진행되는 기존에 Direct2D를 통해 렌더링하던 부분도 SetTransform으로 설정한 영향을 받게 되었다. 2. SetTranform을 호출하고 적용하면 이후 drawing에서도 해당 설정이 남아있다. The transform is applied to all later drawing operations until you call SetTransform again. 3. 만약 설..
DirectX11의 Shader를 컴파일하여 헤더파일로 만들기 1. 상황 DirectX11 렌더러 구성 작업 중 셰이더 코드를 수정하면서 동작을 확인해야할 필요가 있어서 렌더링할 때마다 셰이더 파일에서 컴파일하는 방법으로 구성했었다. 테스트를 완료하여 이제 셰이더 코드를 변경할 필요가 없어졌고, 현재 상태는 셰이더 코드가 그대로 노출되어 있기에 미리 컴파일하여 렌더링할 필요가 있었다. 검색결과 .cso(compiled shader object) 파일로 만들어서 패키지에 포함시킬 건지, 아니면 .header파일에 BYTE 배열로 만들어 빌드하여 렌더러 DLL에 합치는 방법 이렇게 2가지로 고민했었다. 이번 작업에서는 Shader를 미리 컴파일하는 목적이 셰이더 코드를 노출하지 않기 위함이라 헤더파일로 만들어서 DLL에 포함시키는 방법을 선택하였다. 2. 셰이더 컴파일..
C++에서 인터페이스로 사용하기 위해 Class를 정의한다면, 소멸자에 virtual를 지정해 줘야 한다. 1. 문제 상황 C++ 코드로 DirectX11을 활용하여 렌더러를 만드는 작업 중이었다. 여러 조건에 따라 옵션을 교체하여 사용하기 위해 인터페이스 클래스를 구현하고 이를 상속받아 각각의 클래스를 구현하였었다. 그런데 해당 클래스에서 사용하는 DirectX 리소스가 해제가 안되어, 재할당할 때 프로그램이 다운되는 에러가 발생했었다. 디버깅하여 확인해보니 리소스가 해제되는 조건에서 delete가 호출되어도 소멸자가 호출 안되고 있었다. 2. 원인 인터페이스를 정의할 때 공통으로 사용할 메시지만 정의하였지 소멸자를 신경 쓰지 않았었다. 인터페이스에 가상 소멸자를 추가하지 않아 delete 호출 시 인터페이스를 상속받은 클래스의 소멸자가 실행되지 않는다. public class Interface { publ..
ID2D1GeometrySink의 AddLines 메서드를 이용해 ID2D1PathGeometry*에 Underline(밑줄), Strikethrough(취소선) 추가하기 1. AddLines 메서드를 이용해 직접 윤곽선을 추가해야 했던 동기 https://myoung-min.tistory.com/60 GDI의 LOGFONT에서 DirectWrite 폰트를 생성할 때 가져오지 못하는 정보도 있다. (Underline, StrikeOut) Glyph를 이용해 텍스트를 그리는데 Bold, Italic, Underline, StrikeOut 효과를 적용할 필요가 있었다. IDWriteFontFace*에서 GlyphIndices 받아와 ID2D1PathGeometry*를 생성하고 그려야하는 상황이었다. IDWrite.. myoung-min.tistory.com 위 내용처럼 LOGFONT에 밑줄, 취소선의 값을 설정하고 IDWriteGdiInterop*로 CreateFontFrom..
GDI의 LOGFONT에서 DirectWrite 폰트를 생성할 때 가져오지 못하는 정보도 있다. (Underline, StrikeOut) Glyph를 이용해 텍스트를 그리는데 Bold, Italic, Underline, StrikeOut 효과를 적용할 필요가 있었다. IDWriteFontFace*에서 GlyphIndices 받아와 ID2D1PathGeometry*를 생성하고 그려야하는 상황이었다. IDWriteFont를 GDI의 LOGFONT를 통해 생성하여 위 과정을 수행. https://docs.microsoft.com/en-us/windows/win32/directwrite/interoperating-with-gdi Interoperating with GDI - Win32 apps DirectWrite provides a migration path from, and some interoperability with, GDI's font..