슬라이드 1

Similar documents
<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

슬라이드 1

슬라이드 1

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Chapter_02-3_NativeApp

슬라이드 1

PowerPoint 프레젠테이션

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

BMP 파일 처리

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

Chapter #01 Subject

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

슬라이드 1

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

설계란 무엇인가?

chap7.key

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - C++ 5 .pptx

제1장 Unix란 무엇인가?

KARAAUTO_4¿ù.qxd-ÀÌÆå.ps, page Normalize

The Pocket Guide to TCP/IP Sockets: C Version

텀블러514

K&R2 Reference Manual 번역본

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Microsoft PowerPoint - IP11.pptx

03_queue

1장. 유닉스 시스템 프로그래밍 개요

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - es-arduino-lecture-03

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

adfasdfasfdasfasfadf

설계란 무엇인가?

쉽게 풀어쓴 C 프로그래밍

vi 사용법

슬라이드 1

(Microsoft PowerPoint - \301\24615\260\255 - \303\346\265\271\303\263\270\256)

슬라이드 1

Microsoft PowerPoint - chap11-포인터의활용.pptx

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

Microsoft PowerPoint - 05장(함수) [호환 모드]

PowerPoint 프레젠테이션

UI TASK & KEY EVENT

문서의 제목 나눔명조R, 40pt

API 매뉴얼

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드]

자바 웹 프로그래밍

2009년 상반기 사업계획

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

Lab 3. 실습문제 (Single linked list)_해답.hwp

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

쉽게 풀어쓴 C 프로그래밍

ch15

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

untitled

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

슬라이드 1

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - Chapter 6.ppt

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

PowerPoint Presentation


Microsoft PowerPoint - 09-CE-5-윈도우 핸들

Microsoft PowerPoint - [2009] 02.pptx

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

EA0015: 컴파일러

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Java Programing Environment

17장 클래스와 메소드

Microsoft PowerPoint - ch07 - 포인터 pm0415

Chapter 4. LISTS

untitled

The Pocket Guide to TCP/IP Sockets: C Version

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

gnu-lee-oop-kor-lec06-3-chap7

Microsoft PowerPoint - Chap12-OOP.ppt

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

좀비프로세스 2

chap 5: Trees

윈도우시스템프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Transcription:

2007 년 2 학기윈도우게임프로그래밍 제 7 강프레임속도의조절 이대현 핚국산업기술대학교

학습내용 프레임속도의조절 30fps 맞추기 스프라이트프레임속도의조절

프레임속도 (Frame Rate) 프레임속도란? 얼마나빨리프레임 ( 일반적으로하나의완성된화면 ) 을만들어낼수있는지를나타내는척도 일반적으로초당프레임출력횟수를많이사용핚다. FPS(Frame Per Sec) 현대의컴퓨터게임에서는일반적으로최소 25~30 fps 이상이기준임. 프레임시갂 (frame time) 이란? 핚프레임을만들어내는데걸리는시갂. 프레임시갂과프레임속도의관계 Frame per sec = 1 / Frame time

게임루프에서프레임속도의조절이필요! 일반적으로게임루프의마지막부분에서프레임속도를동기화시킴.

실습 Lecture07-01: 프레임속도의출력

Lecture07-01 프로젝트의구성 C++ 소스파일들 gameengine.cpp 실습시갂에작성. main.cpp 실습시갂에작성. introstate.cpp playstate.cpp sprite.cpp C++ 헤더파일들 gameengine.h gamestate.h introstate.h playstate.h sprite.h

gameengine.cpp (1) void CGameEngine::Init(const char* title, int width, int height, int bpp, bool fullscreen) int flags = 0; SDL_Init(SDL_INIT_EVERYTHING); if ( fullscreen ) flags = SDL_FULLSCREEN; screen = SDL_SetVideoMode(width, height, bpp, flags); m_fullscreen = fullscreen; m_running = true; TTF_Init(); font = TTF_OpenFont("HYNAMB.ttf", 20); curticks = SDL_GetTicks(); void CGameEngine::UpdateScreen(void) SDL_Flip(screen);

gameengine.cpp (2) void CGameEngine::RegulateFPS() SDL_Color fgcolor=0,0,0, bgcolor = 128, 128, 128; char fps[40]; Uint32 elapsedticks = SDL_GetTicks() - curticks; curticks += elapsedticks; sprintf(fps, "%3d ms, %6.1f fps", elapsedticks, 1000.0 / (float)elapsedticks); SDL_Surface *fpsmsg = TTF_RenderText_Shaded(font, fps, fgcolor, bgcolor); SDL_Rect pos = 10, 240, 0, 0; SDL_BlitSurface(fpsMsg, NULL, screen, &pos); SDL_FreeSurface(fpsMsg);

main.cpp int main(int argc, char *argv[]) CGameEngine game; game.init("engine Test v1.0"); freopen("con", "w", stdout); freopen("con", "w", stderr); game.changestate(&introstate); while ( game.running() ) game.handleevents(); game.update(); game.draw(); game.regulatefps(); game.updatescreen(); game.cleanup(); return 0;

실행화면

시간의계산 Uint32 SDL_GetTicks(void); void CGameEngine::Init(const char* title, int width, int height, int bpp, bool fullscreen) int flags = 0; SDL_Init(SDL_INIT_EVERYTHING); if ( fullscreen ) flags = SDL_FULLSCREEN; screen = SDL_SetVideoMode(width, height, bpp, flags); m_fullscreen = fullscreen; m_running = true; TTF_Init(); font = TTF_OpenFont("HYNAMB.ttf", 20); curticks = SDL_GetTicks(); SDL 라이브러리의초기화 (SDL_Init() 함수호출 ) 이후경과된시간을얻음. ms 단위로표현.(ms 보다작은시간은표현못함.)

SDL_Flip 의중앙처리 void CGameEngine::UpdateScreen(void) SDL_Flip(screen); 앞선강의에서는, SDL_Flip 의호출을각 State 의 Draw 에서했으나, 여기서는 gameegine 클래스에서중앙처리. 프레임속도를출력하고, 최종적으로 SDL_Flip() 을호출하여, 화면을업데이트하기위해. while ( game.running() ) game.handleevents(); game.update(); game.draw(); game.regulatefps(); game.updatescreen();

프레임처리시간의계산 CGameEngine::Init() 에서 SDL_GetTicks() 호출. CGameEngine::RegulateFPS 에서 SDL_GetTicks 호출. SDL_Init() 호출. CGameEngine::RegulateFPS 에서 SDL_GetTicks 호출. curticks elapsedticks curticks elapsedticks curticks 경과시간 elapsedticks = SDL_GetTicks() - curticks; 프레임속도 FPS = 1000 / elapsedticks;

코드 void CGameEngine::RegulateFPS() SDL_Color fgcolor=0,0,0, bgcolor = 128, 128, 128; char fps[40]; 경과시간의계산 Uint32 elapsedticks = SDL_GetTicks() - curticks; curticks += elapsedticks; curticks 의갱신. sprintf(fps, "%3d ms, %6.1f fps", elapsedticks, 1000.0 / (float)elapsedticks); 프레임시간및프레임속도를문자열로변환. SDL_Surface *fpsmsg = TTF_RenderText_Shaded(font, fps, fgcolor, bgcolor); 사각박스안에문자출력. SDL_Rect pos = 10, 240, 0, 0; SDL_BlitSurface(fpsMsg, NULL, screen, &pos); SDL_FreeSurface(fpsMsg);

실습 Lecture07-02: 프레임속도의조절

프레임속도를낮추는무식한방법 int main(int argc, char *argv[]) CGameEngine game; game.init("engine Test v1.0"); freopen("con", "w", stdout); freopen("con", "w", stderr); game.changestate(&introstate); while ( game.running() ) game.handleevents(); game.update(); game.draw(); 강제로쓸데없는반복을돌린다. for (int i = 0; i < 100; i++) printf("slowing the logic"); game.regulatefps(); game.updatescreen(); game.cleanup(); return 0;

실행결과 : fps 가낮아진다!

왜무식한방법인가? 일단, PC 의성능에따라, fps 가달라진다. 더심각핚것은, 운영체제의시갂자원을모두다잡아먹는다.

똘똘한방법 : gameengine.cpp #define TARGET_FPS 30 void CGameEngine::RegulateFPS() SDL_Color fgcolor=0,0,0, bgcolor = 128, 128, 128; char fps[40]; Uint32 elapsedticks = SDL_GetTicks() - curticks; if (1000 > TARGET_FPS * elapsedticks) SDL_Delay(1000 / TARGET_FPS - elapsedticks); elapsedticks = SDL_GetTicks() - curticks; curticks += elapsedticks; sprintf(fps, "%3d ms, %6.1f fps", elapsedticks, 1000.0 / (float)elapsedticks); SDL_Surface *fpsmsg = TTF_RenderText_Shaded(font, fps, fgcolor, bgcolor); SDL_Rect pos = 10, 240, 0, 0; SDL_BlitSurface(fpsMsg, NULL, screen, &pos); SDL_FreeSurface(fpsMsg);

SDL_Delay() 함수의사용 void SDL_Delay(Uint32 ms); Uint32 elapsedticks = SDL_GetTicks() - curticks; if (1000 > elapsedticks * TARGET_FPS) 현재 fps 가목표 fps 보다높으면 SDL_Delay(1000 / TARGET_FPS - elapsedticks); 목표 fps 를맞추기위해, 필요한시간만큼지연시킨다. SDL_Delay() 함수는단순히지연을시킬뿐만아니라, 운영체제의다른프로세스에게기회를준다.

실행결과

실습 Lecture07-03: 캐릭터프레임속도의조절

sprite.cpp void Sprite::updateFrame(void) static int count = 0; if (count % 3 == 0) frame = (frame + 1) % 8; count = (count + 1) % 3; 스프라이트애니메이션의초당프레임수를 1/3 로낮춘다.