제가 D3D에서 사용하고 있는 한글 출력방식

OpenGL 한글 (입)출력 라이브러리 "glan"에 대한 포럼입니다.

Moderator: 류광

ke7789
Posts: 224
Joined: 2003-03-26 21:21

제가 D3D에서 사용하고 있는 한글 출력방식

Post by ke7789 »

차음에 DirectX 8에 GetDC함수가 없어져서 굉장히 당황한적이 있었습니다.

예제에 텍스트 출력이 있길레 보니까. 그냥 알바벳 텍스쳐 만들어다가 찍어주는거라서

한글에는 적합하지 못하다는 생각이 들었습니다. 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, ...)
   }
그런데 만약 Texture에 한글데이터를 Bitmap으로 Update시켜놓고 폴리곤을 그리는 형태라면

예전에 쓰던 매프레임 데이터를 만들고 그려주는 방식은 굉장히 느리다고 생각이 들었습니다.

실제로 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();
       ...
   }

이렇게 해놓으면 Text가 바뀌는 시점은 서버에서 CS_CHARSTATUSCHANGE_ACK라는

메세지가 올때만 이기 때문에, 실제 게임속도에 전체적으로 봤을때는 거의 영향이 없다는 거져

실제로 SetText함수는 1ms에서 20ms사이의 속도를 내는데.

게임 매 프레임 마다 해주것이 아니기 때문에, 순간적으로 잠깐 느려지는 체감적으로 느껴지지 않을

정도져.

결국 모듈 자체가 어떠냐 보다는 실제 이 모듈을 어떠한 관점에서 사용하는가 하는것도.

성능을 좌지우지 할 수도 있다는걸 알았습니다.

p.s : 폴리곤으로 찍어주니까 확대 축소, Alpha효과, 회전도 되구여 T_T
속도가 좀 나길레 외곽선 Filtering도 해줍니다.
ke7789
Posts: 224
Joined: 2003-03-26 21:21

Post by ke7789 »

참 덧붙여서
NullDC (CreateComparibleDC(NULL)를 사용해서 Font세팅해주고
GetGlyphOutline함수 사용해서 Bitmap으로 뽑아다가 Update에 업데이트
시켜줍니다.

TrueType Font로 사이즈 조절이나, 언어나 문자 코드에 구애받지 않습니다.
플밍사랑
Posts: 10
Joined: 2003-07-26 15:44

Post by 플밍사랑 »

안녕하세요... 저도 이방법을 사용하여 폰트를 출력하려고 자료를 찾고 있었는데 많은 도움이 됐습니다.

제가 API 쪽이 좀 약해서.. - -;;
CText2D::SetText() 함수 구현부좀 부탁드려도 될까요 ^^;;;
비회원

썬-

Post by 비회원 »

제가 DirectX초보라서 그러는데요..
rendering함수에서 그냥 단순히
pDevice->clear(...);
pDevice->Present(...);
이런식으로 directX로 만든 윈도만 뿌려주는 프로그램에 글씨를 써주려고 하는데요..
나름대로 여러 방법을 찾아봤는데 힘들더군요..
ID3DXFONT를 사용하려고 해도 안되고 힘들어서 그러는데요..
이 방법을 좀 사용해 보고 싶은데
pDC가 어떤 형태의 인스턴스인지도 모르겠고 해서요..
좀 자세한 방법을 가르쳐주세요
비회원

그렇게 안하셔도 되는데..

Post by 비회원 »

쩝...다른좋은 방법이 있긴한데 공개하긴 좀 그렇소이다.
imays
Posts: 1044
Joined: 2003-02-18 10:29
Contact:

Post by imays »

어떤 방법인가요?
개념만이라도 공개해주실 수 있나요?
온라인 게임 서버 엔진 ProudNet
http://www.nettention.com
비회원

Post by 비회원 »

쩝...다른좋은 방법이 있긴한데 공개하긴 좀 그렇소이다.
쩝... 그 방법은 안좋습니다. 공개하지 마세요. 저런 쓸데없는 답글은 왜 답니까. 약올릴려고요?
corba
Posts: 29
Joined: 2004-02-06 10:45

Post by corba »

저랑 같은 방식을 쓰신 분이 있어서 정말 반갑습니다. -.ㅜ

3D에서 한글 문제 참 난감하더라구요...

이 방식이 폰트나 크기를 다양하게 쓸 수 있어서 좋긴 한데...

텍스쳐를 효율적으로 사용하기가 관건 같습니다...

그리고 갱신이 자주 필요한 경우엔 쥐약이란 것도 좀 문제긴 하구요...

저번에 어떤 분이 글자 캐쉬를 만들어 쓰는 것을 봤는데...

이 방식과 그 방식 두가지가 있으면 단점을 서로 보완해 줄수 있을것 같습니다....
psyche04
Posts: 282
Joined: 2004-04-08 12:01
Location: 누리엔 소프트웨어

Post by psyche04 »

3번째 비회원님 글에 공감합니다.
지켈섭 nao
Post Reply