출처 : http://www.virtualmore.org/wiki/index.php?title=Hello_GUI_example


The goal is to create a simple GUI that displays the string "Hello GUI!" above a text field for user input. There should also be a push button that copies the user input to a text box. Attach the HelloGUI script to a game object to achieve the goal and press Play:

 

 

 

C# - HelloGUI.cs


using UnityEngine;
using System.Collections;
 
public class HelloGUI : MonoBehaviour {
 
 public string writeThis="Hello GUI!";
 
 private string userInput="write something here";
 private string userInput2="";
 
 void OnGUI() {
  GUI.Label(new Rect(10,10,200,20),writeThis);
 
  userInput = GUI.TextField(new Rect(10,30,200,20),userInput); 
 
  if(GUI.Button(new Rect(10,60,80,40),"push me")) {
   userInput2+=userInput+'\n';
   userInput=""; 
  }
 
  GUI.TextArea(new Rect(10,110,200,200),userInput2);
 }
}


'Programmer의 텅빈 공간 > Unity3D' 카테고리의 다른 글

Unity 한글 폰트 적용  (0) 2014.05.06
C/C++로 작성한 DLL 사용  (0) 2014.05.06
scene간의 Fade in/out  (0) 2014.05.06
코루틴을 쓰레드처럼 사용하기  (0) 2014.05.06
마우스 화면 좌표 -> 월드 좌표  (0) 2014.05.06

출처 : http://wannemag.blogspot.kr/2014/03/glsl-function-mix.html

 

 

mix 에 대한 간단한 기능 구현

 

vec4 my_mix(vec4 x, vec4 y, float a) {
vec4 x_contribution = x * (1.0 - a);
vec4 y_contribution = y * a;

return x_contribution + y_contribution;
}

void main(void) {

vec4 white_layer = vec4(1.0, 1.0, 1.0, 1.0);
vec4 black_layer = vec4(0.0, 0.0, 0.0, 1.0);

float amount_of_second_layer = 0.5;

//gl_FragColor = mix(white_layer, black_layer, amount_of_second_layer);
gl_FragColor = my_mix(white_layer, black_layer, amount_of_second_layer);

}

 

clamp 에 대한 간단한 기능 구현

 

 

vec4 my_clamp(vec4 x, vec4 minVal, vec4 maxVal) {
float x_comp = x.x < minVal.x ? minVal.x : x.x > maxVal.x ? maxVal.x : x.x;
float y_comp = x.y < minVal.y ? minVal.y : x.y > maxVal.y ? maxVal.y : x.y;
float z_comp = x.z < minVal.z ? minVal.z : x.z > maxVal.z ? maxVal.z : x.z;
float w_comp = x.w < minVal.w ? minVal.w : x.w > maxVal.w ? maxVal.w : x.w;

return vec4(x_comp, y_comp, z_comp, w_comp);
}

'Programmer의 텅빈 공간 > OpenGL/GLSL' 카테고리의 다른 글

Emboss shader  (0) 2014.05.21
Mosaic Shader  (0) 2014.05.20
Hertzman Painterly Rendering  (0) 2014.05.16
embossing & sharpening  (0) 2014.05.12
Gaussian Filter  (0) 2014.05.09

출처 : http://www.iamcorean.net/140


Singleton Class (싱글톤 클래스) in C++

작성자 : 김문규
최초 작성일 : 2009. 1.29

1. 들어가며
싱글톤은 전역 객체가 필요할 경우에 유용하게 사용할 수 있습니다. 이에 대해서 구현하는 방법을 생각해 볼까 합니다.

2. 가벼운 구현

#include <iostream>
using namespace std;
class CSingleton
{
private:
 static CSingleton *pInstance;
 CSingleton() : m_iValue(10) {};
 ~CSingleton() {}
 
 int m_iValue;
public:
 static CSingleton& getInstance()
 {
  if(pInstance == NULL) pInstance = new CSingleton;
  return *pInstance;
 }
 static CSingleton* getInstancePtr()
 {
  if(pInstance == NULL) pInstance = new CSingleton;
  return pInstance;
 }
 static void releaseInstance()
 {
  if(pInstance != NULL) delete pInstance;
 }
 void setValue(int in) { cout << m_iValue << "-->" ; m_iValue = in; cout << m_iValue << endl; }
 int getValue() { return m_iValue; }
};
CSingleton *CSingleton::pInstance = NULL;
int main(){
 CSingleton::getInstance().setValue(3);
 CSingleton::getInstance().setValue(5);
 CSingleton::releaseInstance();

 return 0;
}


구현의 핵심은 아래와 같습니다.
1) 생성자를 private으로 감추어서 새로운 객체가 외부에서 마구 생성되는 것을 방지한다.
2) 유일하게 생성된 객체에 접근하는 방법을 제공한다. getInstance()가 여기에 해당!


대부분의 경우에는 위와 같은 패턴을 그대로 적용하시면 Singleton Class를 사용하실 수 있습니다.

3. 고민 1 : 메모리 해제
new로 생성한 인스턴스를 삭제하지 않아도 될까요? 프로그램이 종료되는 시점에는 어차피 new로 생성한 메모리까지 싸그리 해제가 됩니다. 따라서, 어차피 생성한 목적이 프로그램 종료시까지 단 하나의 객체가 동작하는것이라면 그 크기가 어마어마한 것이 아니라면 명시적으로 메모리 해제를 수행할 필요는 없다는 거지요.
다만, 외부 시스템과 정리해야 하는 것이 있다면 명시적인 해제 함수(releaseInstance)를 만드시고 실행하여야 하겠습니다.

4. 고민 2
그냥 static 변수로 CSingleton을 정의하면 어떨까요? 왠지 찝찝하지 않고 깔끔하게~

static CSingleton pInstance;


좋은 생각이네요~ 하지만 다른 문제가 다시 발생합니다. static 객체는 생성의 시점이 명확하게 정의되지 않습니다. 따라서, 다른 전역 객체에서 이를 참조하고자 할 때는 생성 순서 때문에 문제가 발생할 수 있습니다. 그래서, 소위 위의 예시와 같은 '늦은초기화'를 수행합니다. (new를 이용한 동적 생성)
의견이 분분하지만, new를 이용한 방법이 조금 더 안전해 보입니다.

5. 템플릿을 활용한 구현
그런데, 앞선 구현은 영 모양새가 안 나옵니다. 이런식이라면 싱글톤으로 구현해야 하는 클래스마다 해당 패턴을 적용해야 해야 합니다. 
템플릿과 상속을 이용해서 약간 폼나게 바꾸어 보겠습니다.

#include <iostream>
using namespace std;
template <typename T>
class CSingleton
{
private:
 static T *pInstance;
public:
 static T& getInstance()
 {
  if(pInstance == NULL) pInstance = new T;
  return *pInstance;
 }
 static T* getInstancePtr()
 {
  if(pInstance == NULL) pInstance = new T;
  return pInstance;
 }
 static void releaseInstance()
 {
  if(pInstance != NULL) delete pInstance;
 }
};
class Test
{
public:
 Test() : m_iValue(10) {};
 ~Test() {};
 void setValue(int in) { cout << m_iValue << "-->" ; m_iValue = in; cout << m_iValue << endl; }
 int getValue() { return m_iValue; }
private:
 int m_iValue;
};
Test* CSingleton<Test>::pInstance = NULL;
int main(){
 cout << "Singleton 객체 생성" << endl;
 CSingleton<Test>::getInstancePtr()->setValue(3);
 CSingleton<Test>::getInstancePtr()->setValue(5);
 cout << "Singleton 객체 해제" << endl;
 CSingleton<Test>::releaseInstance();
 
 return 0;
}


이제 뭔가 기능의 분리가 확실히 되었다는 느낌이 옵니다. Test라는 클래스를 Singleton 객체로 사용할 수 있게 했습니다. 제 생각에는 이 정도면 충분해요 ^^
물론 Singleton의 속성을 상속하고 있지 않기 때문에 new로 개별 생성도 가능합니다. 이 문제는 제가 고민을 많이 했지만 결론은 프로그래머의 선택에 넘겨야 할 듯합니다. 이게 정상인지..싱글톤 클래스라면 new로 생성이 안되야 하는데... Test의 생성자를 private으로 선언할 수도 없고...흠 하튼 이부분은 잘 모르겠어요 ^^;
이 부분에 대해서 좀 더 깊은 지식이 있으신 고수분께서 좋은 방법을 설명해 주시면 좋겠어요~


6. 마치며
싱글톤은 전역변수를 대신에 사용할 수 있는 구현 패턴입니다. 전역 변수 자체는 생성되는 시점과 해제되는 시점이 매우 모호하기 때문에 칼코딩시에 문제를 일으킬 수 있기 때문입니다. 이에 반해 싱글톤은 getInstance가 호출되는 순간이 해당 변수가 생성되는 시점이기 때문에 그 시점이 명확하다 할 수 있습니다.
이처럼 싱글톤은 프로그램의 상태를 관리할 때나 전역에서 관리되어야 할 변수가 있는 경우에는 편리하게 혼돈없이 에러의 가능성을 줄이면서 사용할 수 있습니다.
근데..아직도 모호해요. ㅎㅎ

'Programmer의 텅빈 공간 > C/C++' 카테고리의 다른 글

VS 2013 확장 기능  (0) 2016.04.22
visual studio 단축키 정리  (0) 2015.08.04
non-mfc에서 TRACE, ASSERT 사용  (0) 2014.05.06
메모리 풀을 왜 사용해야 하는가 ?  (0) 2014.05.06
메모리 풀이란 ?  (0) 2014.05.06

참고 : http://www.gamedev.net/page/resources/_/technical/general-programming/assert-verify-and-trace-for-non-mfc-appl-r1846

 

 

디버깅 시 편리한 TRACE, ASSERT 를 C++에서도 사용해 보자 ! 

 

첨부파일의 debug.h 와 debug.cpp를 해당 프로젝트에 추가 ! 

 

<debug.h>

 

// file debug.h
#ifndef __DEBUG_H__
#define __DEBUG_H__
#ifdef _DEBUG
void _trace(char *fmt, ...);
#define ASSERT(x) {if(!(x)) _asm{int 0x03}}
#define VERIFY(x) {if(!(x)) _asm{int 0x03}}
#else
#define ASSERT(x)
#define VERIFY(x) x
#endif
#ifdef _DEBUG
#define TRACE _trace
#else
inline void _trace(LPCTSTR fmt, ...) { }
#define TRACE  1 ? (void)0 : _trace
#endif
#endif // __DEBUG_H__

 

<debug.cpp>

 

//file debug.cpp
#ifdef _DEBUG
#include <stdio.h>
#include <stdarg.h>
#include <windows.h>
void _trace(char *fmt, ...)
{
char out[1024];
 va_list body;
 va_start(body, fmt);
 vsprintf(out, fmt, body);
 va_end(body);
 OutputDebugString(out);
}
#endif


'Programmer의 텅빈 공간 > C/C++' 카테고리의 다른 글

visual studio 단축키 정리  (0) 2015.08.04
singleton  (0) 2014.05.06
메모리 풀을 왜 사용해야 하는가 ?  (0) 2014.05.06
메모리 풀이란 ?  (0) 2014.05.06
메모리 누수체크  (0) 2014.05.06

참고 : http://www.codeproject.com/Articles/27487/Why-to-use-memory-pool-and-how-to-implement-it

 

사용해야 하는 이유 

1. 메모리 할당하는 시간이 짧다.

 

memory pool 사용 안 했을 시

 


 

(Intel 3.0G Hz CPU / 512 MB of RAM / Win XP SP2 / VC6.0) 기준 결과값 

 

Interval = 8735ms

 

memory pool 사용시


 

 

Interval = 391 ms

 

2. 단편화 문제를 줄일 수 있다. 

 

적합한 예제를 찾지 못했다 ㅠㅠ


Test 결과






'Programmer의 텅빈 공간 > C/C++' 카테고리의 다른 글

visual studio 단축키 정리  (0) 2015.08.04
singleton  (0) 2014.05.06
non-mfc에서 TRACE, ASSERT 사용  (0) 2014.05.06
메모리 풀이란 ?  (0) 2014.05.06
메모리 누수체크  (0) 2014.05.06


Content 

1. 무엇을 메모리 풀 memory pool 이라고 하는가? 

메모리 풀을 역활로 정의를 하면, 메모리 할당/해제/용량 최적화 등을 효율적으로 처리해 주는 웅덩이/수영장/도구/장치/관리자 이다. 단어 자체로 정의를 하면, 메모리 저수지 정도로 이해하면 되겠다. 

pool 이라는 것을 예를 들면, 농업을 들 수 있다. 농작물을 제배하기 위해선, 물이 필요한데, 기후가 변덕을 부리어, 비가 오지 않을 때, 미리 저수지에 모아 두었던 물을 양수기로 퍼올려 농작물에 물을 공급함으로써, 효율적으로 농작물을 기를 수 있게 된다. 

2. 왜 메모리 풀이 필요한가? 

첫번째 이유 

C/C++ 에선 메모리를 할당 하기 위해서 시스템 콜(OS 내부 함수를 요청)을 해야만 한다. 이 시스템 콜 생각보다 부하를 많이 잡아 먹는다. 이처럼 성능이 스택에 메모리를 생성 하는 것 만큼 빠르지 않으므로, 잦은 할당/해제는 많은 오버헤드를 불러 일으킨다.

두번째 이유

메모리 할당으로 4Byte 를 요구 했을 때, 실제로 4Byte 말고도, 몇 바이트를 할당 했는지, 할당한 메모리에 추가적으로 4Byte ~ 32Byte 를 추가하여 할당을 한다. 왜냐하면, 얼마 만큼 메모리를 할당했는지 기록을 해야 나중에 해제 할 수 있기 때문이다. 

이는 메모리를 더 많이 사용하므로, 메모리 고갈을 불러 일으킬 수 있다. 또한 메모리 할당을 더 많이 하므로써, OS의 페이징/프레임 기법에 영향을 미칠 수도 있다. 이는 오버헤드를 불러 일으킨다. 

세번째 이유 

할당 해제가 잦을 수록 메모리 단편화가 일어 날 수 있다. 단편화가 일어날 경우, 메모리가 여러 곳에 흩어져 있기 때문에, 메모리를 블럭 단위로 끌고 와 처리하는 작업이 더 많이 지게 된다. 

하지만... 
몇년전인지는 모르겠지만, 메모리 단편화는 신경쓸 필요가 없어졌다. 프로그래밍으로 메모리 할당을 요청한다는 것은 OS에 요청하는 것인데, OS가 메모리 단편화가 일어나지 않게 프레임 기법/페이징 기법을 처리해 주기 때문이다. 만약 임베비드 환경에서, 이러한 기능이 없는 OS가 쓰인다면, 메모리 풀이 필요 할 수도 있다. : ) 

참조 링크 

3. 다른 라이브러리가 있는데 왜 메모리 풀을 만들어야 하는가? 

공부하기 위해서다. 알고 쓰는것과 모르고 쓰는건 나중에 버그가 생길 때, 그 버그를 고치는 능력 차이를 만들기 때문이다.

 

 

 

참조 : http://ikpil.com/1151

'Programmer의 텅빈 공간 > C/C++' 카테고리의 다른 글

visual studio 단축키 정리  (0) 2015.08.04
singleton  (0) 2014.05.06
non-mfc에서 TRACE, ASSERT 사용  (0) 2014.05.06
메모리 풀을 왜 사용해야 하는가 ?  (0) 2014.05.06
메모리 누수체크  (0) 2014.05.06

CheckLeak.h

 

#if defined(_DEBUG)
# include <crtdbg.h>
# if defined(malloc)
# undef malloc
# endif
# define malloc(s) (_malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__ ))
# if defined(calloc)
# undef calloc
# endif
# define calloc(c, s) (_calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__ ))
# if defined(realloc)
# undef realloc
# endif
# define realloc(p, s) (_realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__ ))
# if defined(_expand)
# undef _expand
# endif
# define _expand(p, s) (_expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__  ))
# if defined(free)
# undef free
# endif
# define free(p) (_free_dbg(p, _NORMAL_BLOCK))
# if defined(_msize)
# undef _msize
# endif
# define _msize(p) (_msize_dbg(p, _NORMAL_BLOCK))
# define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )
class CheckMemoryLeakForWin32 {
public:
CheckMemoryLeakForWin32() {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// 중단점 트리거
//_CrtSetBreakAlloc(2774);
}
~CheckMemoryLeakForWin32() {}
}CheckMemoryLeakForWin32;
#endif


사용법

stdafx.h

#include "CheckLeak.h"

포함 시킴




출처 : 


'Programmer의 텅빈 공간 > C/C++' 카테고리의 다른 글

visual studio 단축키 정리  (0) 2015.08.04
singleton  (0) 2014.05.06
non-mfc에서 TRACE, ASSERT 사용  (0) 2014.05.06
메모리 풀을 왜 사용해야 하는가 ?  (0) 2014.05.06
메모리 풀이란 ?  (0) 2014.05.06

+ Recent posts