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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class InGameManager : MonoBehaviour
{
    private static InGameManager _instance;
 
    public static InGameManager Instance
    {
        get
        {
            if(_instance == null)
            {
                _instance = GameObject.FindObjectOfType(typeof(InGameManager)) as InGameManager;
                if (_instance == null)
                {
                    GameObject ingameManager = new GameObject();
                    ingameManager.name = "InGameManager";
                    _instance = ingameManager.AddComponent<InGameManager>();
                }
            }
            return _instance;
        }
    }
 
    private void Awake()
    {
        DontDestroyOnLoad(this);
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
 

 

Posted by Dongkey
,
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;
using System;
 
public class CameraFade : MonoBehaviour
{
    public event Action OnFadeComplete;  //Camera Fade In,Out 완료시 호출
 
    [SerializeField] private bool fadeInOnStart = true;
    [SerializeField] private bool fadeInOnSceneLoad = false;
 
    [SerializeField] private float fadeDuration = 2f;
 
    [SerializeField] private Image fadeImage;
    [SerializeField] private Color fadeColor = Color.black;
 
    private bool isFading;
    private float fadeStartTime;
    private Color fadeOutColor;
 
    public bool IsFading
    {
        get
        {
            return isFading;
        }
    }
 
    private void Awake()
    {
        SceneManager.sceneLoaded += HandleSceneLoaded;
 
        fadeOutColor = new Color(fadeColor.r, fadeColor.g, fadeColor.b, 0f);
        fadeImage.enabled = true;
    }
 
 
    // Start is called before the first frame update
    void Start()
    {
        if(fadeInOnStart)
        {
            fadeImage.color = fadeColor;
            FadeIn();    
        }
    }
 
    private void HandleSceneLoaded(Scene arg0, LoadSceneMode arg1)
    {
        if(fadeInOnSceneLoad)
        {
            fadeImage.color = fadeColor;
            FadeIn();
        }
    }
 
 
    public void FadeIn()
    {
        if (isFading)
            return;
 
        StartCoroutine(BeginFade(fadeColor, fadeOutColor, fadeDuration));
    }
 
    public void FadeOut()
    {
        if (isFading)
            return;
 
        StartCoroutine(BeginFade(fadeOutColor,fadeColor, fadeDuration));
    }
 
    public IEnumerator BeginFadeOut()
    {
        yield return StartCoroutine(BeginFade(fadeOutColor, fadeColor, fadeDuration));
    }
 
    public IEnumerator BeginFadeIn()
    {
        yield return StartCoroutine(BeginFade(fadeColor, fadeOutColor, fadeDuration));
    }
 
    private IEnumerator BeginFade(Color startCol, Color endCol , float duration)
    {
        //Start Fade
        isFading = true;
 
        float timer = 0f;
        while(timer <= duration)
        {
            fadeImage.color = Color.Lerp(startCol, endCol, timer / duration);
 
            timer += Time.deltaTime;
 
            yield return null;
        }
 
        isFading = false;
 
        if (OnFadeComplete != null)
            OnFadeComplete();
    }
 
    private void OnDestroy()
    {
        SceneManager.sceneLoaded -= HandleSceneLoaded;
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
Posted by Dongkey
,

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 대응

DX11 대응 그래픽 장치는 반드시 D3D11 능력 집합 전체를 지원합니다.

( DX9에서는 하드웨어의 기능점검이 필요했지만 DX11에서는 기능정검이 불필요)



★COM 객체 (Component Object Model)

 - MSDN 에서 제공하는 ABI(Application Binary Interface) 입니다.


특성

1. 언어독립성 (언어에 국한X)

2. Binary Standard ( VC++ 소스 필요없음 )

3. Version Control 하위 및 상위 호환성 제공

4. 자기만의 고유한 메모리 관리 ( delete 가 아닌 Realse로 호출로 자원해제 )

-> DX11 에서는 보통 대문자 I 로 시작


★텍스처 및 자료 자원 형식

2차원 텍스처는 사실상 2차원 배열 or 행렬


용도  

1. 2차원 이미지 자료를 저장 ( 각 원소는 픽셀의 색상을 담음)

2. 색상이 아닌 3차원 벡터를 담는용도 등등


형식

DXGI_FORMAT 열거형으로 지정


DXGI_FORMAT_성분_방식 

성분 - R32G32B32 , R16G16B16A16 등.

방식 - FLOAT,UNROM,UINT 등


★교환사슬과 페이지 전환

presenting(제시) : 후면 버퍼와 전면 버퍼의 포인터 변경 ( 더블버퍼링 시스템 )

교환사슬(SwapChain) : 버퍼를 제시(presenting)하기 위한 변경시스템


★깊이 버퍼 ( Depth Buffer or Z-Buffer )

텍스처의 이미지 자료를 담지 않는 형식중 하나 , 0(가까움) ~ 1.0(멈) 까지의 값

픽셀의 깊이 정보를 담는 하나의 텍스쳐


작동원리

1.백버퍼 지우기

2.물체그리기

3.충돌된 픽셀의 depth 조사

4.결과값에 의한 픽셀 갱신


★스텐실 버퍼 ( Stencil Buffer )

일정부분 렌더링을 막기위해 사용 ( Masking 효과 )

깊이-스텐실버퍼 사용 (  스텐실 버퍼를 사용한다면 반드시 깊이버퍼에 부착해야함으로 )


※ 깊이-스텐실 이라고 많이 부른다고 합니다....


★텍스처 자원 뷰

렌더링 파이프라인에는 묶을(Bind) 수 있는 단계(Stage)들이 존재


흔한 용도

1. 텍스처를 렌더 대상으로 묶는 것 ( D3D가 텍스처에 렌더링 하는 경우 )

2. 셰이더 자원으로 묶는 것 ( 셰이더 안에서 텍스처를 추출하는 경우 )


이 두가지 용도로 사용할 텍스쳐를 생성 할 때 파이프 라인 단계를 지정한 결속플래그 (Bind Flag)를 사용


직접 바인딩 되는 것이 아닌

자원 뷰(Resource View)라는 것을 생성해야 하고 이 자원 뷰가 바인딩 됨

Flag값을 지정해야  이 값에 따른 특정 자원 뷰를 생성or불가능 해짐


★앨리어싱 ( Aliasing , 계단현상 )

화면의 계단현상을 제거(앨리어싱제거AntiAliasing) 기법


SSAA(SuperSamlingAntiAliasing,초과표본화) : 후면버퍼+깊이-스텐실버퍼 4배 후 하향표본화(DownSampling)하는 기법


- 픽셸처리량과 메모리소비량의 비용이 큼


MSAA(MultiSamlingAntiAliasing,다중표본화) : 도형과 겹치는 픽셀칸에서 가운데 한점 + 주변에서 정보를 수집하여 처리하는 기법


- 가장보편적인 AA기법 , 디퍼드와 같이 쓰기에 무겁다고 함 , CPU기반

- 이미징 대해 상관없이 그냥 여러 번 샘플링


그 외 기법들 ( 자세한 설명은 생략하겠습니다...)

FXAA(Fast Approximate AA)

QAA (Quincunx AA)

EQAA (Enhanced Quality AA)

MLAA (Morphological AA)

DLAA (Directionally Localized Anti-Aliasing

TXAA (Temporal Approximate(?) AA)

SMAA(Enhanced Subpixel Morphological AA)

SPUAA(The Saboteur Anti-Aliasing)

SRAA(Subpixel Reconstruction Antialiasing)

DEAA(Distance-to-Edge AA)

GBAA(Geometry Buffer AA)

CSAA(Coverage Sampling AA)

HRAA(High Resolution AA)

SMAA(Enhanced Subpixel Morphological Antialiasing)

MSAA(Multi Frame AA)

FXAA (Fast Approximate AA)


★기능 수준 (Feature Level)

DirectX11 은 버전을 어느 수준까지 지원하는지 파악하고 순서대로 점검후 사용 가능

( DirectX11 이 지원이 안된다면 DirectX9 으로 Feature Level 을 줄일 수 있음 )

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
,