카테고리 없음2019. 1. 2. 17:20

아래 링크로 이사 했어요~

클릭해 주세요~

 

 

https://s-engineer.tistory.com/

 

Posted by J.sean
Computer/Programming2009. 9. 11. 18:20

Milliseconds vs. FPS

I've come to the realization that many new graphics/game programmers don't know how to accurately measure the speed of their rendering. Most of them fall into the common pitfall of utilizing frames per second (FPS) as their method of profiling. This is the wrong thing to do.

많은 그래픽/게임 프로그래머들이 그들의 프로그램에서 랜더링 속도를 정확히 측정 모르더군요. 대부분이 frames per second(FPS) 속도 측정의 방법으로 사용하고 있는데 이는 정확한 방법이 아닙니다.


Let's see a little bit of the mathematics. First, the definition of millisecond, better visualized as .
We can now build a relationship between the frames per second and the number of milliseconds it takes to render one frame. The inverse of the frames per second gives us the number of seconds it takes to render one frame e.g. 1/2 FPS = 0.5 s, 1/10 FPS = 0.01 s, etc. Since there are 1,000 milliseconds in a second, we then multiply the value, given above, by 1,000 to retrieve the number of milliseconds it takes to render one frame.

잠깐 수학책을 들여다 봅시다. 우선 millisecond 정의 입니다.  이렇게 보면 명확해 보이죠. Frames per second 프레임을 랜더링 하기 위해 걸리는 milliseconds 대한 관계를 정리해 보겠습니다. Frames per second 역수는 프레임을 랜더링 하는데 초가 걸리는지를 말해줍니다. 예를 들어 1/(2 FPS) = 0.5s, 1/(10 FPS) = 0.01s 입니다. 1초는 1,000milliseconds이므로 위의 수에 1,000 곱하면 프레임에 milliseconds 걸리는지 계산이 됩니다.


Here's a graph that shows the number of milliseconds it takes to render one frame as a function of the frames per second:

아래는 FPS 프레임을 랜더링 하는데 milliseconds 걸리는지를 보여주는 그래프입니다.


As you can see, the two values are not linearly related. While the frames per second increase, the number of milliseconds decreases at a slower rate. (In mathematical terms, the limit of the function approaches 0.) What does this mean to the general programmer? The difference between 900 FPS and 870 FPS is negligible while the difference between 60 FPS and 30 FPS is quite noticeable.

보시는 것처럼 값은 1차원적으로 비례하지 않습니다. Frames per second 증가하지만 milliseconds 천천히 감소합니다(수학적 용어로 함수가 0으로 수렴한다고 합니다). 그래프가 의미 하는 뭘까요? 60FPS 30FPS 차이를 보이는 변화이지만 900FPS 870FPS 의미가 없다는 것입니다.


To conclude, I will give you a little real world example. Your program has a pixel shader that operates on 100 pixels giving you 1,000 FPS. You move closer to the object, now the pixel shader is operating on 150 pixels (50% more) and your framerate drops to 666 FPS. Some graphics programmers would think, "Oh no! I'm doing something wrong." With our new knowledge, this change is to be expected: We've gone from 1 millisecond to 1.5 milliseconds to render one frame. Given that we are shading 50% more pixels, this change in rendering speed is not bad at all.

결론으로 실제적인 예를 하나 들어 보이겠습니다. 100픽셀에 적용되고 있는 픽셀 셰이더가 포함된 프로그램을 만들었다고 생각해 봅시다. 물체에 다가갈수록 FPS 1,000에서 666으로 떨어지고 픽셀 셰이더는 150픽셀에(50% 많아졌습니다) 적용됩니다. 일부 그래픽 프로그래머는 .. 뭔가 잘못된 아냐?” 라고 생각할 있겠지만 우리는 이제 이런 변화가 당연하다고 받아들일 있습니다: 프레임을 랜더링 하는데 1millisecond에서 1.5milliseconds 느려졌지만 50% 많은 픽셀에 적용된 픽셀 셰이더를 생각해 보면 그다지 크게 느려지진 않은 겁니다..


Now get out there, use those milliseconds, and never stop the crusade to convert everyone from using FPS!

이제부터 milliseconds 사용하도록 하고 FPS 사용하는 사람들을 milliseconds 사용하도록 일깨워 줍시다!

Posted by J.sean
Computer/Crack2009. 5. 25. 20:32


Step 9까지 모두 푸셨다면 이제 웬만한 게임은 대부분 혼자서도 원하는 값을 찾아 고치실 수 있을 겁니다. 이번 강좌에선 간단한 tip 몇 가지를 소개해 드리겠습니다.

오늘 함께할 게임은 또 다른 고전 명작 게임 Prehistorik 1입니다.






이 게임의 간단한 줄거리는 먹을게 부족한 원시인이 가족을 위해 식량을 구하러 다닌다는 이야기 입니다. TITUS사의 1991년 작품입니다. XP에서도 게임이 실행은 되지만 원활한 진행을 위해 DOSBox를 사용 했습니다.
게임이 시작되면 아래 그림과 같이 원시인 한 명이 공중에서 뛰어 내리고 몽둥이로 공룡, 곰, 알, 뱀등을 때려 기절시킨 후 'FOOD' 게이지를 채워가야 합니다. 처음 'FOOD'게이지는 0, 'LIVES'는 03, 'TIME'은 99, ENERGY는 가득 차 있는 상태로 시작 됩니다.


그럼 우리는 TIME부터 정지시켜 놓도록 하겠습니다. TIME은 99부터 천천히 1씩 감소하는데 감소하는 속도가 그리 빠르지 않으므로 타이밍을 잘 맞춰 검색 하면 됩니다. Cheat Engine으로 이 게임을 오픈시키고 TIME수치를 찾아 보도록 하죠.


96초에서 한번, 94초에서 다시 검색을 했는데 아무런 결과도 갖지 못했습니다. Cheat Engine이 찾지 못했다는 말이지요. 왜 그럴까 다시 생각해 보니 이 게임은 1991년도 작품이라는게 생각 났습니다. 그 당시는 32비트가 아닌 16비트가 주류를 이루던 시대였지요. 요즘 게임과는 달리 이 게임은 2 Bytes를 사용할거 같습니다.

만약 어떤 수치는 정확히 알지만 데이터 타입은 모를때 그 수치를 담을 수 있는 가장 작은 데이터 타입을 선택해 주는것이 더 정확한 검색을 할 수 있도록 도와줍니다.

그럼 'Value type'을 2 Bytes로 바꾸고 다시 검색을 시도해 보겠습니다.


이번엔 제대로 찾았습니다. 그리고 'Value'를 90으로 freeze시켜 놓았습니다. 이 값이 100이상으로 수정되면 게임이 다운되어 버리더군요. 가끔 이런 경우가 발생하기도 하므로 오류가 나지 않는 범위에서 적절한 값으로 수정해 주도록 합니다. 그럼 다른 값을 찾기 전에 헷갈리지 않도록 이름을 붙여 주도록 하지요. 'No description'을 더블 클릭해 줍니다.


description을 바꿀 수 있는 윈도우가 나오는군요. TIME이라고 바꿔 주겠습니다.

그전에 여기서 잠깐 리스트 윈도우의 단축키를 알아 보고 가죠.

Enter : Change value
Ctrl + Enter : Change description
Alt + Enter : Change address
Space : Freeze
+ : Positive freeze
- : Negative freeze
Delete : Delete address
Ctrl + S : Switch the position of 2 selected addresses
Ctrl + E : Edit the selected address
Ctrl + Alt + A : Open the auto assembler



제대로 바뀌었으면 이번엔 LIVES를 찾아 바꿔 보도록 하겠습니다. 처음엔 03이므로 03으로 검색을 시작해 값을 찾은 후 리스트 박스에서 description을 LIVES라고 바꾸고 수치를 10으로 바꿔놓겠습니다.


우리의 원시인이 영원한 생명을 갖도록 freeze시켜 주겠습니다. 그러데 이번엔 그냥 freeze시키는게 아니라 값이 증가 하는것은 허용하는 freeze를 해보죠. 우선 'Frozen'체크 박스를 클릭해 freeze시키고 왼쪽에 있는 '='를 한번 클릭해 줍니다. '-'로 표시가 바뀌는데 이것은 감소만 허용하는 freeze입니다. 우리는 증가만을 허가할 것이므로 한번더 클릭해 '+'로 표시를 바꿉니다.


자, 그럼 이제 우리의 원시인은 생명이 늘어나긴 해도 줄어들진 않는 신과 같은 존재가 되었습니다. 이번엔 'ENERGY'를 줄어들지 않도록 해보죠. 우선 에너지가 가득차 있는 상태의 수치정보는 나와 있지 않으므로 'Unknown initial value'로 시작해서 ENERGY를 조금씩 잃어가며 'Decreased value'로 재 검색을 해보겠습니다.


굉장히 많은 검색 결과가 나왔지만 결국 2개만 남았습니다. 값이 768인 주소와 3인 주소입니다. 그럼 잠시 게임 화면으로 돌아가 보죠.


'ENERGY'게이지를 보니 막대가 3개 남았군요. 그럼 어느 주소가 우리가 찾는 주소일까요? 당연히 3이라는 값을 가진 057085CA번지겠죠? 리스트 박스로 옮겨 Description을 ENERGY로 바꿔주고 'Value'를 20으로 바꾼 후 freeze시키겠습니다.


이제 'FOOD'게이지 하나 남았군요. FOOD는 아무것도 먹지 않은 상태에선 0인 상태일것이라 추측할 수 있습니다. 0으로 초기 검색을 시작하고 공룡이나 과일 따위를 하나 먹을때 마다 'Increased value'로 재검색을 해주겠습니다.


3개의 결과가 남았습니다. 2560, 10, 720 셋중에 어느것일까요? 대충 생각해 봐도 10일것 같군요. 공룡을 한마리 더 잡아 먹은후 다시 수치를 확인해 보겠습니다.


2816, 11, 770으로 바뀌었습니다. 아무래도 11일거 같죠? 리스트 박스로 옮겨놓고 Description을 FOOD라 바꾸고 'Value'는 100으로 바꿔보겠습니다.


이제 다시 게임으로 돌아가 게임을 약간 진행해 보겠습니다.


FOOD는 가득차 있고 LIVES는 10, TIME은 89에서 90을 왔다 갔다 하고 ENERGY는 게이지를 넘어가 있군요. 슈퍼 원시인이 되었습니다. Cheat Engine으로 돌아가 언제든지 원하는 수치를 변경, 고정 시킬 수 있겠죠?



Level 7입니다. Level 7이 시작하자 마자 FOOD를 가득 채웠고 LIVES는 특별히 바꾸지 않았지만 22로 증가되어 있군요.


가끔 LIFE를 주기도 하는 할아버지는 이제 가볍게 무시할 수 있습니다.


Level 7까지 모두 가볍게 클리어 하고 그리운 가족의 품으로 돌아 왔습니다.

더 많은 tip과 좋은 내용들이 Cheat Engine help에 들어 있습니다. 조금더 공부 하고 싶으시다면 꼭 한번 읽어 보시기 바랍니다.

Posted by J.sean