C++ standard output에 대해서 알아보겠습니다.


조정자(Manipulator)

#include <iostream> 안에 있는 조정자

  • showbase/noshowbase
출력의 진법을 표기
  • showpos/noshowpos (pos -> positive)
양수 일때 + 표기/표기X
  • dec(decimal) 
10진수로 표기
  • hex(hexa decimal) 
16진수로 표기
  • oct(octal decimal) 
8진수로 표기
  • uppercase/noupeercase
대문자로 표기
  • left/internal/right
왼쪽 정렬 / 내부 정렬(부호는 왼쪽,숫자는 오른쪽)/ 오른쪽 정렬
  • showpoint/noshowpoint
소수점 값 표기 / 소수점 값 없으면 표기X 
ex)  showpoint 경우 10.1 -> 10.100
noshowpoint 경우 10.1 -> 10.1

  • fixed/scientific
고정적으로 표기 / 과학적으로 표기 ( 123.456789 -> 1.234568E+02 )

  • boolalpha / noboolalpha
true,false 로 표기 / 값으로 표기 (1,0)

#include <iomanip>
함수처럼 매개변수를 받음
  • setw(n)
n만큼의 공간차지


  • setfill(char형)

빈공간의 char형 문자를 채우기


  • setprecision(n)
n만큼의 유효한 소수점 표기



//실행 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    int num = 1234;
 
    cout << showbase << dec << num << endl;        //1234
    cout << showbase << oct << num << endl;        //02322
    cout << showbase << hex << num << endl;        //0x4d2
 
    cout << noshowbase << dec << endl;            //초기화&줄맞춤
 
    cout << showpos << num << endl;                //+1234
    cout << noshowpos << num << endl;            //1234
    
    cout << endl;                                //줄맞춤
 
    cout << uppercase << hex << num << endl;    //4D2
    cout << nouppercase << hex << num << endl;    //4d2
    
    cout << noshowbase << dec << endl;            //초기화&줄맞춤
 
    cout << setw(6<< left << -num << endl;    //-1234
    cout << setw(6<< internal << -num << endl;//- 1234
    cout << setw(6<< right << -num << endl;    // -1234
    
    cout << endl;                                //줄맞춤
 
 
    float decimal1 = 10.0f;
    float decimal2 = 10.12f;
 
    cout << noshowpoint << decimal1 << " " << decimal2 << endl//10      10.12
    cout << showpoint << decimal1 << " " << decimal2 << endl;    //10.0000 10.1200
 
    cout << fixed << decimal2 << endl;                //10.120000
    cout << scientific << decimal2 << endl;            //1.012000e+01
 
    bool boolean = true;
 
    cout << fixed << endl;                                    //줄맞춤
 
    cout << boolalpha << boolean << endl;            //true
    cout << noboolalpha << boolean << endl;            //1
 
    cout << endl;                                    //줄맞춤
 
    cout << setfill('*'<< setw(6<< num << endl;    //**1234
 
    cout << endl;                                    //줄맞춤
 
    cout << setprecision(7<< decimal2 << endl;    //10.1199999
 
    system("pause");
 
    return 0;
}
cs


'프로그래밍 > C++' 카테고리의 다른 글

C++ namespace/using  (0) 2019.01.02
Posted by Dongkey
,
  • namespace(이름공간)
C++ 에서는 동일한 함수,변수의 충돌을 막기 위해 이름공간이 존재합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
namespace Test1
{
    void Func() {}
}
 
namespace Test2
{
    void Func() {}
}
 
int main()
{
    Test1::Func();
    Test2::Func();
    return 0;
}
cs


다음과 같이 이름공간을 부여해 함수의 충돌을 막을 수 있는 코드를 작성할 수 있습니다.


  • using
이름공간을 사용함으로써 타이핑을 줄일 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace Test1;
//using namespace Test2;
 
namespace Test1
{
    void Func() {}
}
 
namespace Test2
{
    void Func() {}
}
 
int main()
{
    Func();            //Test1::Func();
    Test1::Func();
    Test2::Func();
    return 0;
}
cs


하지만 4번째 줄의 주석을 풀면 Func() 함수 모호함이 생기기 때문에 에러가 발생할 수 있으니

조심히 다뤄서 사용하시면 좋겠습니다.

'프로그래밍 > C++' 카테고리의 다른 글

C++ 조정자(Manipulator)  (0) 2019.01.02
Posted by Dongkey
,

유니티 최신버전에서는 뷰포리아가 지원되기 되는 것 같더라구요


이번장은 유니티를 이용해 마커를 인식하는 것을 작성하겠습니다.



0. Vuforia 이미지 등록

먼저 뷰포리아(https://developer.vuforia.com)를 가입하시고 DevPortal 에서

  1. License 생성(Type이 Developer 이면 비용이 들지 않습니다.)
  2. DataBase 생성
  3. Add Taget(이미지 타겟)을 통해 이미지를 추가하고
  4. Download Database를 통해 UnityPackage를 뽑을 수 있습니다.
  5. 생성한 License의 키를 복사하여 Unity의 License Key에 붙여넣으시면 됩니다.

(Resource->VuforiaConfiguration -> App License Key )

다음의 뷰포리아 셋팅을 추가하시면 License키를 등록할 수 있습니다.


1. Unity Vuforia Setting

Edit->ProjectSettings->Player



XR Settings-> Vuforia Augemented Reality Supptorted Check




2. 기존의 카메라 삭제 후 ARCamera 등록

GameObject->Vuforia->ARCamera



3. 이미지 마커 객체 생성

GameObject->Vuforia->Image 



이미지 마커 위에 객체 생성시에 휴대폰 혹은 웹캠을 통해 이미지 인식 위에 생성되는 걸 확인할 수 있습니다.


Posted by Dongkey
,

저는 개인적으로 메모리의 개념을 알고 있어야 더 좋은 코드를 작성할 수 있다고 생각합니다.


2017/08/13 - [프로그래밍/C] - 메모리 영역 ( Code , Data , Heap, Stack )


메모리 영역 중 프로그래머가 관리하는 영역이 Heap 영역을 관리여부에 따른 언어가 Managed 와 Umanaged로 나뉘게 됩니다.

  • Managed Language 매니지드 언어

 대표적인 언어로는 C,C++로 메모리의 할당과 해제를 통한 메모리를 관리하여야 메모리의 누수가 없게 신경을 써줘야 하지만 언매니지드 언어에 비해 속도가 빠릅니다.

 또한, 메모리를 구체적인 관리를 할수 있기 때문에 프로그래밍의 자유도가 높습니다.

  • UnManaged Language 언매니지드 언어

 대표적인 언어로는 C#,Java로 메모리의 할당과 해제를 통한 메모리를 관리없이 언어자체적으로 메모리를 관리합니다.

 또한, 메모리를 구체적인 관리를 할수 없기 때문에 프로그래밍의 자유도가 낮으며 비정기적인 

 메모리 정리가 이루어집니다.


개인적인 생각으로 매니지드 언어를 공부해온 사람들은 언매니지드 언어를 사용을 할 때도 더 효율적인 코드를 작성할 수 있다고 생각합니다.

'프로그래밍' 카테고리의 다른 글

.Net Framework ( 닷넷 프레임워크 )  (0) 2017.08.14
Posted by Dongkey
,

Unity.EventSystems 네임스페이스에서 Unity는 IPointer 인터페이스를 제공합니다.


인터페이스가 적용되기 위해서는 UI의 경우에는 그래픽레이캐스터가 존재해야하며 Raycast Target이 On이어야 실행되며 3D혹은 2D의 경우에는 Collider가 존재해야 합니다.


IPointer 인터페이스의 종류는 다음과 같습니다.


1. IPointerClickHandler

 - 마우스의 클릭 혹은 터치시에 들어오는 이벤트


1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class TestIPointer : MonoBehaviour , IPointerClickHandler{
 
    public void OnPointerClick(PointerEventData eventData)
    {
        //Click Event
    }    
}
cs


2. IPointerDownHandler

 - 마우스의 다운 혹은 터치다운 시에 들어오는 이벤트


1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class TestIPointer : MonoBehaviour , IPointerDownHandler{
 
    public void OnPointerDown(PointerEventData eventData)
    {
        //Down Event
    }
}
cs


3. IPointerEnterHandler

 - 마우스의 포인터가 충돌범위안에 들어 올때 들어오는 이벤트


1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class TestIPointer : MonoBehaviour , IPointerEnterHandler{
 
    public void OnPointerEnter(PointerEventData eventData)
    {
        //Up Event
    }
}
cs



4. IPointerExitHandler

 - 마우스의 포인터가 충돌범위밖으로 나갈 때 들어오는 이벤트


1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class TestIPointer : MonoBehaviour , IPointerExitHandler{
 
    public void OnPointerExit(PointerEventData eventData)
    {
        //Exit Event
    }
}
cs


5. IPointerUpHandler

 - 마우스의 업 혹은 터치업 시에 들어오는 이벤트


1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class TestIPointer : MonoBehaviour , IPointerUpHandler{
 
    public void OnPointerUp(PointerEventData eventData)
    {
        //Up Event
    }
}
cs



'프로그래밍 > Unity 공부' 카테고리의 다른 글

유니티 뷰포리아 AR 이미지인식  (0) 2018.12.21
Posted by Dongkey
,

(DX11 물방울 책 보고 공부한 내용을 정리.)



(들어가기전 사전공부)

DirectX 11의 D3DX 라이브러리에는 3차원 수학코드가 포함되어 있지 않다고 합니다.

그 대신 D3D와 개별적으로 개봘된 XNAMath 라이브러리를 제공합니다.


※ XNAMath 라이브러리 ->  DirectXMath 라이브러리

     (2.xx대 버전)                  (3.xx 대 버전)


이 라이브러리는 SSE2 명령 집합을 사용합니다.

(Streaming SIMD Extension 2)


※ SIMD ( Single Instruction Multiple Data) 

하나의 명령어로 여러개의 데이터 처리


ex)


XMVECTOR : 16바이트 정렬, SIMD 지원 ,레지스터 타입 ( 지역변수 or 전역변수로 사용 )

XMFLOAT4 : SIMD 미지원 , 스토리지 타입 , 클래스 자료 멤버 ( 흔히 사용하는 Vector의 4성분 )

XMFLOAT3 : SIMD 미지원 , 스토리지 타입 , 클래스 자료 멤버 ( 흔히 사용하는 Vector의 3성분 )

XMFLOAT2 : SIMD 미지원 , 스토리지 타입 , 클래스 자료 멤버 ( 흔히 사용하는 Vector의 2성분 )


XMMATRIX : SIMD 지원

XMFLOAT4X4 : SIMD 미지원


XMVECTOR는 쉽게 생각하면 FLOAT가 연속되게 저장되어 있다고 생각하시면 됩니다.

연속되어 있기 때문에 따로뜯기가 조금 어렵다고 생각하시면 편할 것 같습니다.


사용법

1. XMFLOAT4(~2)를 XMVECTOR로 적재

2. XMVECTOR를 계산

3. XMVECTOR를 XMFLOAT4(~2)로 바꾸어 사용

(SIMD 로 인해 덧셈,뺄셈,스칼라 곱셈 등 의 이점을 가져올 수 있습니다.)

Posted by Dongkey
,


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

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


제가 군대 전역직후 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
,

STL 이란? 


STL( Standard Template Library ) 로 C++ 표준 라이브러리 입니다.

표준으로 정해져있으므로 매우 안전하며 개발시간을 단축하기 위해서 많이 사용합니다.

STL 을 알기 전에 자료구조가 무엇인지 알고 가는게 좋습니다.


STL은 C++의 Template 로 구현되어져 있습니다.


게임에서 주로 사용하는 STL 들은 list,vector,map 등이 있습니다.


STL의 구성요소에는 크게 컨테이너,할당기,반복자,어댑터,알고리즘,함수 객체로 이뤄져 있으며


컨테이너,알고리즘,반복자가 가장 중요한 요소입니다.


Containter (컨테이너)


 - 객체를 저장하는 객체,자료구조 라고도 합니다.클래스 템플릿으로 구현되어 있습니다.

 - 컨테이너는 크게 Sequence Container 와 Associative Container로 나뉩니다.


 Sequence Container ( 연속된 컨테이너 ) : array ( c++ 11 ) , vector , list , deque

 Associative Container ( 연관된 컨테이너 ) : set,multiset,map,multimap


Iterator (반복자)

- 컨테이너를 순회하는 방법과 컨테이너의 한 요소를 참조하는 방법을 획일화 함으로써 알고리즘들이 컨테이너 내부 구조에 대해 독립성을 가지도록 한 것입니다.

- 컨테이너 종류에 따라 접근 방식이 다릅니다.

- 컨테이너의 요소 하나를 가리키는 기본적인 열할

- 가리키는 지점의 요소를 읽고 쓸 수 있습니다.

- 증감에 의해 주변요소로 이동가능합니다(++.-- 연산자 오버로딩)


Algorism (알고리즘)

- STL의 알고리즘 함수들은 대부분 특정 컨테이너의 멤버함수가 아닌 일반 전역 함수로 작성되어있습니다.

 - 






'프로그래밍 > STL & 자료구조' 카테고리의 다른 글

0. 자료구조란?  (0) 2017.12.30
Posted by Dongkey
,