반응형


double	g_timePerFrame;// 임의로 정해놓은 프레임 제한시간


int APIENTRY WinMain(
	HINSTANCE a_hInst, 
	HINSTANCE a_hPrevInst, 
	LPSTR a_lpszCmdParam, 
	int a_iCmdShow)
{	
	//윈도우 클래스 등록
	if (!InitWndClass(a_hInst))
	{
		return false;
	}

	//윈도우 생성 및 화면에 보여주기
	if (!InitInstance(a_hInst, a_iCmdShow))
	{
		return false;
	}

	
	MSG Message;

	std::chrono::system_clock::time_point worktime_old = std::chrono::system_clock::now();
	std::chrono::system_clock::time_point worktime_now;
	g_timePerFrame = 200.0; 
	while (1)
	{
		if (PeekMessage(&Message, 0, 0, 0, PM_REMOVE))
		{
			if (Message.message == WM_QUIT || Message.message == WM_DESTROY)
			{
				break;
			}
			TranslateMessage(&Message);
			DispatchMessage(&Message);
		}
		else
		{
			worktime_now = std::chrono::system_clock::now();

			//루프가 끝나고, 다시 시작하는 시점 까지의 경과시간(공백시간)
			std::chrono::duration<double, std::milli> work_time = worktime_now - worktime_old; 
            
			if (work_time.count() < g_timePerFrame)
			{
				double d = g_timePerFrame - work_time.count(); //임의로 정해놓은 프레임 제한시간에서 실제 프레임당 걸리는 시간을 빼준다, 그렇게 남는시간은
				std::chrono::duration<double, std::milli> sleepTime(d);
				std::chrono::milliseconds sleepTime_ms_duration = std::chrono::duration_cast<std::chrono::milliseconds>(sleepTime);
				std::this_thread::sleep_for(sleepTime_ms_duration); // 해당 thread를 sleep 시키는 시간으로 쓴다
			}
			worktime_old = std::chrono::system_clock::now();
			
            
			//ToDo : GameLogic 처리 Update, Rendering
		}
	}
	return Message.wParam;

}
반응형
반응형

코드

template <typename T>
class SingleTonBase
{
private:
	static T* instance;

public:
	static T* GetInstance()
	{
		if (!instance)
		{
			instance = new T;
		}
		return instance;
	}
    
    	static void DeleteInstance()
	{
		if (instance)
		{
			delete instance;
            		instance = nullptr;
		}
	}

protected:
	SingleTonBase(){}
	virtual ~SingleTonBase(){}

public:
	SingleTonBase(const SingleTonBase&) = delete;
	SingleTonBase& operator = (const SingleTonBase&) = delete;
};

template<typename T>
T* SingleTonBase<T>::instance = nullptr;



//클래스에서 상속을 받고 friend 키워드를 통해 적용
class MyClass : public SingleTonBase<MyClass>
{
	friend class SingleTonBase<MyClass>;
private:
	MyClass() {};
	~MyClass() {};

public:
	void print(HDC a_hDC, int a_x, int a_y)
	{
		std::wstringstream wss;
		wss << L"MyClass : " << (int)GetInstance();
		TextOut(a_hDC, a_x, a_y, wss.str().c_str(), wss.str().length());
	}
};

 

테스트

같은 주소를 가리키고 있다, 즉 언제나 GetInstance() 통해서만 instance를 받을수 있고 그 주소는 오직 하나의 주소만 가리키는걸 볼 수 있다.

반응형
반응형

 

 

Mutable

Immutable

생성된후 변경 가능 여부

가능

불가능

예시

list, dict, set,

byte array

int, float, complex,
string, tuple, frozen set,
bytes

복사 대입 방식 a = b

shallow copy

deep copy

비용

Immutable 비해 싸다

mutable 비해 비싸다

 

반응형

+ Recent posts