[GPG 1 글 1.14] [s1.14] 클래스로 구현한 게임 내 실시간 프로파일링

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

이 글은 예전 GPG 스터디 포럼에 gryu 님이 올리신 주제와 그에 대한 답글들입니다. 원본(Ezboard)은 "<a href="http://pub32.ezboard.com/fgpgstudyfrm2. ... D=34.topic" target="_blank">[s1.14] 클래스로 구현한 게임 내 실시간 프로파일링</a>"입니다.
<div class="imported">
<div class="sep"><span class="cfs">제목: [s1.14] 클래스로 구현한 게임 내 실시간 프로파일링
</span></div>
<div class="r">글쓴이: gryu , 글쓴때: 1/23/01 12:07:45 pm</div>

<a href="http://tsomang.hihome.com/" target="_blank">소망팀</a> godwish(고승민)님의 프로파일링 클래스입니다..

단일체 패턴을 적용한다던가.. install()로 모든 프로파일링 항목들을 한 번에 추가하는 대신 AddItem()이나 RemoveItem() 같은 멤버를 추가해서 개별적으로 항목들을 추가/제거할 수 있게 만든다던가...하는 개선 방향을 생각할 수 있겠네요. 물론 수행 부담을 최소한으로 유지하는 한에서... 또 public으로 되어 있는 변수들 중 일부는 private로 해도...

<pre>
#include <stdio.h>
#include <stdlib.h>
#include <mmsystem.h>
#include <dos.h>
typedef unsigned char byte;
typedef unsigned long DWORD;
//게임내 프로파일링
//프로파일될것들 많으면 그다지 좋지않다.
//속도가 느려지고 그만큼 프로파일링에 시간을 빼앗기게 된다.

//timeGetTime 함수에 대한 예기가 나오면 winmm.lib을 추가시키
//세요
#define MAX_PROFILE 100
//인스톨할때 쓰게될 구조체다. 지나가자.
struct ProfileItem{
//타이틀로 사용될것.
char title[100];
//계층 번호
byte soc;
};
class ProfileClass{
public:
//프로파일할 부분들.
DWORD now;
byte max;
//프로파일 타이틀
char title[MAX_PROFILE][100];
//계층이다.
byte tree[MAX_PROFILE];
//프로파일링을 한번해야만 출력할것이 생긴다. 출력하면
//1로 세트된다.
byte start;
struct {
//시작 시간.
DWORD START;
//끝난 시간.
DWORD END;
//사용한 시간.
long double USETIME;
//퍼센트.
DWORD per;
}Prev[MAX_PROFILE],ProfileData[MAX_PROFILE];

//생성자. 몇가지만 세트해줬다..
ProfileClass(){
start=0;
now=0;
}
//프로파일 아이템을 인스톨한다.
void install(ProfileItem a){
//타이틀을 복사한다.
strcpy(title[max],a.title);
//게층을 받는다.
tree[max]=a.soc;
//혹시모르니 버퍼를 청소해준다.
memset((char*)&ProfileData[max++],0,
sizeof(ProfileData[max]));
}
void Start(int num){
//프로파일 시작
ProfileData[num].START=timeGetTime();
}
void end(int num){
//프로파일 끝
ProfileData[num].END=timeGetTime();
ProfileData[num].USETIME+=ProfileData[num].END
- ProfileData[num].START;
}
//처음을 메인루프로 본다.
void result(){
//마지막에 호출해 주는것이다.

//%를 구해서 데이터에 저장해 준다.
//가장 처음이 메인 루프기 때문.
start=1;
long double max_ms=ProfileData[0].USETIME;
for(int i=0;i<max;i++){
ProfileData.per=
(DWORD)(ProfileData.USETIME*100000/max_ms);
}
//지금까지 구한정보는 미안하게도 바로 사용할수 없다.
//지금구한것은. 다른버퍼에 저장해줘야한다.
//다음에는 나와야하니까.
memcpy(Prev,ProfileData,sizeof(ProfileData));
//한번해서는 좋은 결과를 얻기 힘들다.
//여러번해서 계속 축적한후에 now로 나눠주면
//그럭저럭 정확한 결과가 나온다.
now++;
}
//프로파일 정보를 뿌려준다.
void put(){
if(start){
for(int i=0;i<max;i++){
char tmp[100];
wsprintf(tmp,"%s %dms %%%d.%d",
title,
(DWORD)Prev.USETIME/now,
Prev.per/1000,
Prev.per%1000);
//여기서 잘 참고해서 글줄 출력함수를 넣어라.
/*
box_fill(20+tree*16,20+(5+i)*16,20+tree *
16 + strlen(tmp) *8, 20 + (6+i) * 16,1);
print(20+tree*16,20+(5+i)*16,0,0,"%s",tmp);*/
}
}
}
void save(){
//파일로 세이브해준다.
FILE *fp;
fp=fopen("profile.txt","wt");
for(int i=0;i<max;i++){
for(int j=0;j<tree;j++){
fprintf(fp,"t");
}
fprintf(fp,"%s %dms %%%d.%dn",
title[i],
(DWORD)Prev[i].USETIME/now,
Prev[i].per/1000,
Prev[i].per%1000);
}
fclose(fp);
}
}Profile;

/*
사용법에 대해서 설명하겠다.
우선 게임같이 설명하겠다.
#define PROFILE_MAX 4
//메인 게임 루프
#define MAINLOOP 0
//그리기
#define DRAWSCREEN 1
//프로필 그리기
#define DRAWPROFILE 2
//플리핑
#define DRAWEND 3

//이렇게 있다고 하면
ProfileItem dp[PROFILE_MAX]={
{"MAINLOOP",0},
{"DRAWSCREEN",1},
{"PROFILE",2},
{"FLIPING",1}
};
//이렇게한후에
for(int i=0;i<PROFILE_MAX;i++){
Profile.install(dp[i]);
}
//이런식으로 인스톨한후 게임 루프에서..
game(){
while(loop){
//메인루프를 시작한다.
Profile.Start(MAINLOOP);
//화면에 그림을 그리기 시작한다.
Profile.Start(DRAWSCREEN);
//프로필 그리기 시작.
Profile.Start(DRAWPROFILE);
//프로필을 그린다.
Profile.put();
//프로필 그리기를 끝낸다.
Profile.end(DRAWPROFILE);
//플리핑 시작한다.
Profile.Start(DRAWEND);
//플리핑 한다.
Fliping();
//플리핑 끝낸다.
Profile.end(DRAWEND);
//화면 그리기 끝낸다.
Profile.end(DRAWSCREEN);
//메인루프 끝낸다.
Profile.end(MAINLOOP);
//마지막으로 결과를 만들어낸다.
Profile.result();
}
Profile.save();
}
//이런식으로 하면된다.
*/

</pre>

다른 분들도.. 응용하신 것 있으면 꼭 좀 올려주시길..

<p><center>
/*************************
as simple as possible,
but not simpler
*************************/
</center>

<br></p></div>


<font size=-1>[ 이 게시물 는(은) 수정됨 by : 류광 수정 시간: 2001-08-03 22:57 ]</font>