예제에 텍스트 출력이 있길레 보니까. 그냥 알바벳 텍스쳐 만들어다가 찍어주는거라서
한글에는 적합하지 못하다는 생각이 들었습니다. ID3DXFont하는게 있긴 있는데.
속도저하가 굉장히 심하더라구여.
그래서 2001년11월달쯤에 곰곰히 생각 생각에 또 생각하다가 한가지 방법이 떠올랐습니다.
보통 프로그램 구조를 짤때 예전에 DC를 사용하는 구조처럼
GetDC가 느리니까. 화면에 찍어야될 Text를 쭈욱 저장하고 있다가
매 프레임 화면에 찍어주는 형태를 많이 사용했습니다.
Code: Select all
TEXTLIST::iterator it;
for(it = begin(); it != end(); it++)
{
TEXTOUT* pTextOut = *it;
pDC->DrawText( ..., pTextOut->m_pString, ...)
}
예전에 쓰던 매프레임 데이터를 만들고 그려주는 방식은 굉장히 느리다고 생각이 들었습니다.
실제로 ID3DXFont가 같은 방법인데 무지 느림
그래서 떠오른건데..
Texture를 폴리곤으로 찍어줄때 Texture에 들어갈 한글데이터는
명시적으로 한글데이터가 바뀔때만 Texture를 Update해주면 되는것 아닌가? 하는 생각이
들었습니다.
아.. 맞다. 텍스트(한줄또는 여러줄)를 하나의 객체로 만들어 놓고
텍스트가 바뀔때만 SetText함수를 만들어서 UpdateTexture를 해주고
그릴때는 그냥 폴리곤으로 그려주기만 하면, UpdateTexture할때는 느리지만
전체 게임을 놓고 보았을때는 Texture가 매 프레임 바뀌지 않는다면 속도면에서는 이득이 있겠구나!
라는 생각이 들었습니다.
결국 저는 이렇게 했습니다.
Code: Select all
class CText2D
{
...
bool SetText(LPCTSTR str);
bool SetTextF(LPCTSTR format,...);
bool Render();
};
// 실제 사용에서는
class CStatusWindow : CIWindow
{
...
CText2D m_txSTR;
CText2D m_txDEX;
CText2D m_txNickName;
CText2D m_txAttackPower;
....
};
// 상태값이 바뀔때만
int OnCS_CHARSTATUSCHANGE_ACK(CMsg &msg)
{
sString strTemp;
msg >> strTemp; pStatusWindow->m_txSTR.SetText( strTemp);
msg >> strTemp; pStatusWindow->m_txDEX.SetText( strTemp);
...
}
CStatusWindow::Render()
{
m_txSTR.Render();
m_txDEX.Render();
...
}
메세지가 올때만 이기 때문에, 실제 게임속도에 전체적으로 봤을때는 거의 영향이 없다는 거져
실제로 SetText함수는 1ms에서 20ms사이의 속도를 내는데.
게임 매 프레임 마다 해주것이 아니기 때문에, 순간적으로 잠깐 느려지는 체감적으로 느껴지지 않을
정도져.
결국 모듈 자체가 어떠냐 보다는 실제 이 모듈을 어떠한 관점에서 사용하는가 하는것도.
성능을 좌지우지 할 수도 있다는걸 알았습니다.
p.s : 폴리곤으로 찍어주니까 확대 축소, Alpha효과, 회전도 되구여 T_T
속도가 좀 나길레 외곽선 Filtering도 해줍니다.