일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 작업 집합
- ColorGradingLutPass
- Windows Build
- OculusMotionVectorPass
- Cell Shader
- 메모리 누수
- 개인 바이트
- URP
- ASW(Application SpaceWarp)
- Private Bytes
- 3d
- Virtual Byte
- 벡터
- Toon Shader
- 프로그래밍 기초
- Cell Look
- Rim Light
- 게임 수학
- Cartoon Rendering
- AppSW
- C언어
- Three(Two) Tone Shading
- URP로 변경
- 가상 바이트
- working set
- Specular
- VR
- Today
- Total
목록게임 프로그래밍(학습 내용 정리)/시스템 프로그래밍 (17)
WinCNT
참고 사이트 https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/beginthread-beginthreadex?view=msvc-170 _beginthread, _beginthreadex 자세한 정보: _beginthread, _beginthreadex docs.microsoft.com https://docs.microsoft.com/ko-kr/cpp/parallel/concrt/concurrency-runtime?view=msvc-170 동시성 런타임 자세한 정보: 동시성 런타임 docs.microsoft.com 동시성 런라임에서 PPL(병렬 패턴 라이브러리)를 특히 추천! 다만 동시성 런타임을 사용하기 위해서는 Modern C++를 배울..
프로세스와 DLL 코드와 데이터를 분리해서 생각하자 DLL 만들기(.dll) 무엇을 제공할 것인가 {코드와 데이터} dll은 보통 코드(함수)의 제공이 목적이다 무엇을 사용할 것인가 DLL 사용하기(.exe) 키워드 심볼 - 링커 입장에서 바라보는 이름이 심볼 심볼릭 obj파일에 포함에 들어있다 링커는 여러 obj, lib, dll에 있는 글로벌 변수, 스태틱 변수, 함수 이름(심볼)을 가져온다 심볼이 된 것들은 바이너리 파일(exe 등)에 포함되어 있다 dll의 심볼(함수)를 사용하는 방법은 2가지가 존재한다 1. 암시적(로드 타임) 2. 명시적(런 타임) DLL 파일의 이미지( = 내용물)는 어플리케이션이 DLL 파일 내에 포함된 함수를 호출하기 전에 반드시 프로세스의 주소 공간에 매핑되어 있어야 한..
DLL의 암시적 링킹과 명시적 링킹 DLL의 암시적 링킹(Implicit Linking)인 경우, 로드 타임에 DLL를 로드하기 때문에 프로그래머가 코드에 DLL를 넣지 않는다 (물론 DLL의 lib파일을 포함시켜야 한다) 하지만 DLL의 암시적 링킹의 경우는 DLL이 없을 경우는 실행 자체가 불가능해진다 반면 DLL의 명시적 링킹의 방법은 DLL의 로드가 런 타임 중에 일어나기 때문에 (적절한 예외 처리를 하면)프로그램의 실행에는 문제가 없다 명시적인 DLL 모듈 로딩 std::string path = "../x64/Debug/MyTestDLL.dll"; HMODULE hDll = ::LoadLibraryA(path.c_str()); LoadLibrary는 내부적으로 ANSI로 처리하기 때문에 보통 A..
정적은 복사본, 동적은 링킹만 함 (파일 안에 포함되지 않음) 명시적, 암묵적이 다르다 암묵적은 실행 시에 링킹됨 명시적은 프로그래머가 원하는 타이밍에 링킹함(교체 등의 컨트롤 가능) https://docs.microsoft.com/ko-kr/windows/win32/dlls/about-dynamic-link-libraries Dynamic-Link 라이브러리 정보 - Win32 apps 동적 연결을 사용하면 모듈이 로드 시간 또는 런타임에 내보낸 DLL 함수를 찾는 데 필요한 정보만 포함할 수 있습니다. docs.microsoft.com DLL을 로드하는 모든 프로세스는 해당 가상 주소 공간에 매핑한다 즉, 각각의 프로세스에 DLL이 로드된 가상 주소 공간은 다를 수 있다! DLL 내의 전역 및 정적 ..
프로세스의 가상 주소 공간 범위를 예약한다는 것은 --> 프로세스가 컴파일 될 때 코드 영역, BBS, 데이터, 스택 영역이 결정된다는 의미이다 주소 공간을 예약해도 실제 스토리지는 할당되지 않지만 다른 할당 작업에서 지정된 범위를 사용할 수 없다 VirtualAlloc 프로세스의 가상 주소 공간 범위를 예약합니다. 주소 공간을 예약해도 실제 스토리지는 할당되지 않지만 다른 할당 작업에서 지정된 범위를 사용할 수 없습니다. 다른 프로세스의 가상 주소 공간에는 영향을 주지 않습니다. 페이지를 예약하면 물리적 스토리지를 불필요하게 사용할 수 있지만 프로세스는 동적 데이터 구조가 증가할 수 있는 주소 공간 범위를 예약할 수 있습니다. 프로세스는 필요에 따라 이 공간에 대한 물리적 스토리지를 할당할 수 있습니다..
작업 집합(Working Set) 작업 집합은 프로세스에서 사용하는 총 물리적 메모리(RAM)을 나타내며, 프로세스의 스레드가 최근에 사용한 적이 있는 메모리 페이지 집합을 뜻한다 (작업 집합은 메모리에 매핑된 파일과 리소스도 포함) 작업 집합은 작업 관리자의 메모리 사용량에 모니터링되는 값과 동일하다 작업 집합의 메모리 페이지는 사용된 적이 있다는 것이지 현재 메모리에 로드되어 있다 뜻은 아니다(!) 컴퓨터의 여유 메모리가 임계값보다 높으면 사용 중인 아니더라도 메모리 페이지는 작업 집합에 남아있다 정리하자면 작업 집합은 페이징되지 않은 개인 바이트와, 메모리 매핑된 파일이라고 할 수 있다 가상 바이트(Virtual Byte) 가상 바이트는 프로세스가 차지하는 총 가상 주소 공간이다 가상 바이트는 작업..
데이터와 파일 파일은 메모리에 올라간다 (파일 --> 리소스 --> 메모리에 적재) 그럼 리소스를 어떻게 관리해야 할까? 프로그래머는 플레이 진행 상태만 파일 형태로 저장할 수 있다 (정확히는 DB지만 DB도 결국엔 파일과 다를 것이 없다) 그렇기 때문에 구조와 규칙을 먼저 만들 필요가 있다 그에 대해 필요한 것이 보통 DB와 그에 따른 SQL이다 SQL Structured Query Language 몽고DB(NoSQL의 분류) 이미지 등의 리소스를 대용량으로 저장하고 빠르게 가져오게 하기 위한 DB(페이스북 등) 레디스(Redis) 메모리 DB - 메모리에 잔뜩 데이터를 적재해두는 것 결국은 설계다!! 메모리 메모리는 다음의 영역을 가진다 스택 영역, 힙 영역, 데이터 영역, 코드 영역 메모리 할당 프..
네트워크 프로그래밍 연결 여부 --> TCP 데이터 송수신 --> TCP/UDP 1. 비동기식 --> OS가 APP에게 전달함 어떻게? Windows OS의 특성을 이용 --> WM 메시지로 알려줌 조금 더 범용적인 방식: 이벤트 방식 Windows OS의 Event 커널 객체 --> 소켓 신호를 이벤트로 받겠다 (Linux에서도 비슷한 방식이 존재함) Windows OS 성능의 극대화: IOCP + 오버랩드 I/O 오버랩드 I/O라는 구조체를 이용해서 CP(Complete Port)로 주고 받음 (CP 이외에도 콜백이나 이벤트로도 받을 수는 있다 - 옛날 방식) 2. 동기식 --> APP가 계속 기다림 동기화 방법들 https://docs.microsoft.com/en-us/windows/win32/s..
같은 스레드라도 유저 모드와 커널 모드 간 Context Switch가 발생한다 따라서 유저 모드에서 동기화하는 것이 커널 모드에서의 동기화 보다 조금 더 가볍다 (커널 모드의 동기화 중 하나는 Mutext) 참고로 C++의 STL는 스레드의 동기화를 보장하지 않는다 동기화를 보장 받기 위해서는 concurrent*와 같은 클래스를 사용하자 (concurrent_unordered_map, concurrent_queue 등) 스레드는 공유 자원을 같는다(유저 모드에서는 주로 메모리 - 전역 변수 혹은 힙이다) Thread-safe하다는 것은 그러한 공유 자원의 무결성이 보장된다는 뜻이다 사실 MS Windows는 모든 스레드가 상호 통신 없이 각자의 작업을 수행할 때 최고의 성능을 발휘한다 하지만 스레드는..
1. GetTickCount64() GetTickCount64() 함수는 시스템이 시작된 이후의 경과된 시간(밀리초)를 검색한다 시간을 측정하기 위해 타이머를 사용하는데 그 타이머의 간격(보통 10~16ms)으로 시간을 측정하기 때문에 다른 함수들 보다 때문에 해상도가 낮다는 단점이 있다 참고로 GetTickCount()라는 함수도 있지만 최대 49.7일 이상이 넘어가면 오버플로우가 발생한다는 단점이 존재하며, 이러한 문제점을 해결하기 위해 등장한 것이 GetTickCount64() 함수이다 (GetTickCount64() 함수는 약 5억 8천년까지 측정 가능함) 2. timeGetTime() timeGetTime() 함수는 Windows가 시작된 이후 경과된 시스템 시간(밀리초)을 검색한다 GetTic..