현재 위 3개 이외에는 Window SDK로 통합됨
#include <timeapi.h>
#pragma comment (lib, "winmm.lib")
DWORD timeGetTime();
milisecond 단위로 반환
49.71일 정도
BOOL QueryPerformanceFrequency(
[out] LARGE_INTEGER *lpFrequency
);
BOOL QueryPerformanceCounter(
[out] LARGE_INTEGER *lpPerformanceCount
);
LARGET_INTEGER GetTime()
{
QueryPreformaceFrequency(&frequency);
QueryPerformanceCounter(&start);
//do something
QueryPerformanceCounter(&end);
return (end - start) / frequency;
}
LARGE_INTEGER : long long 타입
micro second까지 측정 가능
최대 4800년
물론 점검, 패치 등의 명목으로 껏다 키는 경우도 있음
이를 통해 Memory Leak도 어느정도 커버 가능
DirectInput, Win API등 다양한 방법 존재
/* VK_0 ~ VK_9, VK_A ~ VK_Z는 정의되어있지 않음. 문자로 직접 읽어와야함, 소문자 불가능 */
GetAsyncKeyState() // 키 입력 정보
GetCursorPos() // 마우스 위치, 화면좌표계 기준
ScreenToClient() // 화면좌표계를 Client 좌표계로 변환
함수를 통해 가볍게 사용 가능
DXTK를 통해 쉽게 출력 가능
다양한 Font 지원
단, 출력마다 GPU에서 VertexBuffer, Rect 크기 등을 연산해야하므로 비용이 비쌈
대신 미리 작성된 font image를 통해 출력하는 방식 사용
DirectWrite의 경우 디버깅, 채팅 구현용으로 추천
collection(흔히 말하는 글꼴)->family(이텔릭, 볼드 등)->face로 분류
#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>
#pragma comment (lib, "d2d1.lib")
#pragma comment (lib, "dwrite.lib")
{
D2D1_RENDER_TARGET_PROPERTIES props;
ZeroMemory(&props, sizeof(props));
props.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
props.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED);
// windows의 폰트는 보통 96 dpi
props.dpiX = 96;
props.dpiY = 96;
props.usage = D2D1_RENDER_TARGET_USAGE_NONE;
props.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;
// 3d의 RenderTarget을 통해 2d의 RenderTarget을 생성할 경우, device생성 때 D3D11_CREATE_DEVICE_BGRA_SUPPORT플래그 설정 필수
// 이 함수를 통해 3d의 RenderTarget을 통해 2d의 RenderTarget 생성, 연동
HRESULT hr= m_d2dFactory->CreateDxgiSurfaceRenderTarget(
DXGISurface1* dxgiSurface,
&props,
&m_d2dRT);
hr = m_d2dRT->CreateSolidColorBrush({0,0,0,1}, &m_pTextColor);
hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_d2dFactory);
hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory),
(IUnknown**)&m_pDWriteFactory);
// IDWriteTextFormat은 출력문자 이외의 폰트, 크기 등 변경 불가
hr = m_pDWriteFactory->CreateTextFormat(
L"Gabriola", //L"고딕",
NULL,
DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
30, // 폰트 사이즈는 pixel단위
L"en-us",//, // L"ko-kr",//
&m_pTextFormat);
// IDWriteTextLayout은 출력문자 이외의 속성 변경 가능
// IDWriteTextLayout <-> IDWriteTextFormat
m_szDefaultText = L"KGCA Game Academy";
hr = m_pDWriteFactory->CreateTextLayout(
m_szDefaultText.c_str(),
m_szDefaultText.size(),
m_pTextFormat,
g_rtClient.right,
g_rtClient.bottom,
&m_pTextLayout);
// 출력은 항상 BeginDraw()와 EndDraw()사이에서 수행(D3D9 방식)
m_d2dRT->BeginDraw();
// Rect의 크기는 Client Window에서의 값
D2D1_RECT_F rt = { x, y,g_rtClient.right,g_rtClient.bottom };
m_pTextColor->SetColor(color);
m_pTextColor->SetOpacity(1.0f);
//m_pTextColor->SetTransform()
m_d2dRT->DrawText(text.c_str(), text.size(),
m_pTextFormat, rt, m_pTextColor);
m_pTextLayout->SetFontSize(50, {0, (UINT)m_szDefaultText.size()});
m_pTextLayout->SetFontStyle(DWRITE_FONT_STYLE_ITALIC, { 0, (UINT)m_szDefaultText.size() });
m_d2dRT->DrawTextLayout({ 400, 300 }, m_pTextLayout, m_pTextColor);
m_d2dRT->EndDraw();
}