이번 장은 게임만들면서 최적화 관련에 겪었던 점을 적겠습니다.

(서론이 길거 같습니다... 제 공부 관련 얘기도 적을거 같습니다)


제가 군대 전역직후 6개월 정도 공부한 후에 Cocos2d-x 엔진을 접하고 나서 모바일 게임을 만들었습니다. 당시에는 C언어도 제대로 알지 못하고 구현이 먼저였던 시점이라 많은 시행착오를 겪으면서 개발했습니다. 1280*720 이미지를 아무생각 없이 그대로 20장을 넣고 라이팅을 넣어보면서 게임이 느려지기 시작하며 최적화에 대해서 알아보게 되었습니다.



★POT ( Power of Texture or Power of Two) 

// 어느 분은 텍스처의 제곱이라고 하고 어느 분은 2의 제곱이라 하여 정확히 몰라 2개를 작성합니다ㅠ

컴퓨터 내 리소스는 2^n * 2^n 으로 잡히게 됩니다.

예를 들어 900*900 이면 1024*1024로 크게 잡히게 됩니다.

1025 1025 면 2048 2048 로 잡히게 되어 메모리가 크게 낭비가 되는 상황이 발생할 수 있습니다.


☆아틀라스 이미지

아틀라스 이미지는 한장의 이미지에 여러개의 이미지를 묶어놓은 것입니다.

이미지출처:http://dlgnlfus.tistory.com/80

아틀라스 이미지에 대한 이미지 검색결과


게임 내 UI 들은 POT 사이즈에 맞게 제작을 할수가 없습니다.

그래서 이미지들을 한대 묶어 하나의 이미지로 뭉쳐서 최대한 메모리 손실을 피하기 위해 아틀라스 이미지를 사용합니다.



★이미지 포맷

리소스가 메모리에 올라가는 과정은 

1. 디스크에서 이미지 가져오기

2.이미지 압축 포맷 압축 해제

3.메모리 블록에 해당 이미지 할당

으로 이루어져 있습니다.


주로 사용하는 이미지 포맷들은 jpg,png,tga 등을 많이 사용하고 있습니다.

하지만 게임에서는 이 이미지 포맷들을 사용하기엔 그렇게 적합하지 않습니다.


Window는 DirectX를 사용하기에

DDS 파일플랫폼을 사용하고 있습니다

DDS는 DirectX 의 텍스쳐 포맷과 일대일로 대응하는 파일 포맷으로

메모리를 대역폭을 아끼며 비디오카드가 하드웨어 가속을 지원하므로 성능 저하도 없으며

또한 DXT같은 경우엔 손실압축치고는 퀄리티가 나쁘지 않습니다.


안드로이드는 

GPU에 의해 직접 지원되는 텍스처 압축을 사용합니다.

아이폰(PowerVR) : PVRCT

안드로이드(Tegra) : DXT

안드로이드(Adreno) : ATC

안드로이드(공통) : ETC1


Posted by Dongkey
,

★행렬(matrix)이란?


m개의 행(row) 과 n개의 열(column)으로 이루어진것입니다.

행렬을 m by n matrix라 읽습니다


이미지 출처 : 위키백과

이미지 검색결과


★상등행렬

행렬의 같은 꼴 : 행의 개수와 열의 개수가 각각 같은 행렬

행렬의 상등 : 같은 꼴이면서 대응하는 각 성분이 서로 같은 것


★정방행렬

행의 수 == 열의 수 인 것을 정방 행렬이라고 합니다.

n개의 행과 n개의 열을 가진 정방 행렬은 차수가 n이라고 하고

n 정방 행렬 (n by n Matrix) 라고 합니다.


★단위행렬(항등행렬,Identity Matrix)

이미지출처 : http://mp3119.tistory.com/entry/%ED%96%89%EB%A0%AC


단위 행렬은 어떤 행렬을 곱해도 같은 값이 나오는 행렬입니다.



★전치행렬

n by n 의 원소에 대칭되게 전치를 시켜준 행렬입니다.


★벡터과 행렬

벡터는 하나의 행 or 하나의 열로 표현할 수 있습니다.


행과 열로 표현한 행렬식



★행렬 연산




행렬의 곱





(벡터의 내적을 모아놓은것과 행렬의 곱셈은 같습니다)



★행렬의 성질



★행렬식(Determinant)



행렬식 구하는 법 - 소행렬식


그외 다른 방법들: http://twlab.tistory.com/41



★역행렬

( 이 역행렬을 배우기 위해 앞에 있던 것을 배웠다 해도 과언이 아닙니다. 그만큼 중요합니다)




 




★역행렬의 성질


'프로그래밍 > 게임수학' 카테고리의 다른 글

1. Vector (벡터)  (0) 2018.01.03
Posted by Dongkey
,

벡터는 방향+크기로 이루어져 있습니다.

게임에서 방향은 매우 소중합니다. 기본적으로 캐릭터가 이동을 하기 위해선 방향이 필요하기 때문이죠. 방향을 알기 위해 벡터를 알아보겠습니다.



★Vector 의 정의

Vector (벡터)  : 크기 + 방향에 의해 결정되는 양

Scalar (스칼라) : 벡터의 크기에 의해서만 결정되는 양


시점 (P) : 벡터가 시작되는 화살표의 꼬리

종점 (Q) : 벡터가 마지막 부분인 화살표의 머리

크기(P와 Q사이의 거리) : 방향과 상관없는 화살표의 길이


★Vector 의 크기

이미지 출처 : https://www.slideshare.net/QuentinKang/1-52920181

3차원 벡터의 크기
v = (vx, vy, vz)
||v|| = v2
x + v2
y + v2
z
vy
l1
l
l1
vx
vz
vy
(vx, vy, vz)
l2
1 = v2
x + v2
z
l2
= l2
1 + v2
...


벡터의 크기는 |V| 로 표기하며

V = (x,y,z)라 하면 피타고라스의 증명에 의하여

|V| = √x^2 + y^2  + z^2 이 됩니다



★Unit Vector (단위 벡터)

단위 벡터 : 벡터의 크기가 1인 벡터

벡터의 크기를 1로 만드는 행위를 Normalize(정규화) 라고 합니다.

 Uv = V / |V| 입니다.



★Vector 의 사칙 연산

덧셈 : 각각의 성분을 더해주면 됩니다. 

스칼라곱 : 각각의 성분에 스칼라를 곱하면  됩니다.

뺄셈 :  각각 성분을 빼주시면 됩니다.




★Vector 의 내적 (Dot)

내적(Dot product,Inner product,Scalar product)라고 합니다.

A ● B = A.x * B.x + A.y * B.y + A.z * B.z = |A||B|cosθ 입니다.


(증명은 생략하겠습니다.)


Vector에서 내적은 두 벡터의 사이각을 구할수 있기 때문에 매우 중요합니다. ★★★★★★★★★

A.x * B.x + A.y * B.y + A.z * B.z / |A||B| = cosθ 로

벡터 A와 B가 단위 벡터라면

A.x * B.x + A.y * B.y + A.z * B.z = cosθ 로 빠르게 각도를 구할 수 있습니다.

그래서 게임에서 캐릭터클래스가 방향을 가지고 있다면 주로 단위벡터로 방향만을 가지고 있습니다.


이미지 출처 : http://blog.naver.com/PostView.nhn?blogId=push1104&logNo=220863257036&parentCategoryNo=&categoryNo=20&viewDate=&isShowPopularPosts=false&from=postView


cos그래프에 대한 이미지 검색결과

A ● B > 0 이면 예각

A ● B = 0 이면 직각

A ● B < 0 이면 둔각 이라는 것을 알수 있습니다.


또한 내적으로 빛의 계산을 할 수 있으며 ( 이번 파트에는 다루지 않고 넘어 가겠습니다.)

투영 벡터를 구할 수 있습니다.



★벡터의 외적 (Cross)

벡터의 외적 : 두 벡터 모두에 수직인 벡터


벡터의 외적으로 법선 벡터를 구하여 평면의 앞과 뒤를 구분할 수 있습니다.


'프로그래밍 > 게임수학' 카테고리의 다른 글

2.Matrix (행렬)  (0) 2018.01.08
Posted by Dongkey
,