
오늘의 코드카타
오늘의 공부
팀 프로젝트 진행 내용
1. 점프 PSD 수정

- 위와 같이 점프를 진행할 때, 공중에 걷는 듯한 모션이 보임

- Rewind Debugger를 활용해서 보니, Jump_F_Off_Run_Rfoot, Jump_F_Off_Run_Lfoot이 번갈아가면서 자주 스위칭됨
- 해당 액션은 PSD_Jump 에셋을 통해 재생되고 있었는데, 기존의 애니메이션을 더 유지하게끔 해서 자연스럽게 하고자 함
-> 따라서 PSD_Jump 에셋의 Continuing Pose Cost Bias를 -0.05에서 -0.5로 증가시킴

2. 앉기 기능 구현
- CharacterMovement 컴포넌트에 존재하는
Crouch()를 통해 앉기 기능을 구현하려고 함
- 해당 함수를 사용하기 위해서는
CanCrouch = true로 해줘야 해당 함수를 사용할 수 있음
- 블루프린트에서 CanCrouch는 아래와 같이 CharacterMovement에서 체크할 수 있음

- c++에서는
GetCharacterMovement()->NavAgentProps.bCanCrouch = true;를 통해 활성화할 수 있음
- 앉아있는 상태에서 절벽 같은 데에서 이동하게 되면 투명 벽에 막혀있듯이 공중을 걷게 됨
- 따라서
GetCharacterMovement()->bCanWalkOffLedgesWhenCrouching = true;를 통해 설정 변경
| bCanWalkOffLedgesWhenCrouching = false | bCanWalkOffLedgesWhenCrouching = true |
|---|
 |  |
- 앉는 동작을 하게 되면 카메라 이동이 뚝뚝 끊어지는 현상이 있다. 이는 캡슐 컴포넌트 높이를 순간적으로 변경하기 때문에 뒤에 보고 있던 카메라가 한 번에 이동해서 끊어지게 보이게 된 것이다.
- 이를 해결하기 위해서는 Spring Arm Component의
bEnableCameraLag = true로 설정을 해서 카메라 이동을 보간하여 자연스러운 카메라 이동을 연출
오늘의 CS
컨텍스트 스위칭
- 멀티 프로세스 환경에서 인터럽트가 발생하면 CPU가 처리 중인 프로세스를 바꾸는 것
- 이를 통해 CPU가 여러 프로세스/스레드를 번갈아 사용할 수 있음
- 레지스터에 로드하는 동안 CPU가 일을 못하기 때문에 오버헤드가 발생함
실행과정
- CPU가 P1을 처리하던 중 인터럽트 발생
- CPU 스케줄러는 레지스터에 있는 실행 중이던 프로세스의 상태를 PCB에 저장
- P2의 PCB에 있는 정보를 가져와 레지스터에 로드하고 CPU는 P2를 처리함
- P2 처리가 끝나면 다시 P1을 레지스터에 로드하고 프로세스를 계속 실행
PCB (Process Control Block)
- OS가 프로세스를 관리하는 데 필요한 정보를 가지고 있는 자료구조
- 각각의 프로세스는 고유한 PCB를 가지며, 레지스터 값, 프로그램 카운터, 스택 포인터 등을 저장
TCB (Thread Control Block)
- 스레드를 관리하는 데 필요한 정보를 가지고 있는 자료구조
- 스레드 고유의 프로그램 카운터, 레지스터 값, 스택 포인터 등을 저장
스레드 컨텍스트 스위칭이 비용이 적은 이유
- 스레드는 가상 주소 공간을 공유하고 있기 때문에 스위칭이 발생해도 페이지 테이블 교체나 TLB 무효화가 필요하지 않음
- 프로세스는 주소 공간 전체가 바뀌므로 MMU의 페이지 테이블 포인터를 새로 로드해야 하고, 캐시 정보도 초기화되기 때문에 상대적으로 많은 비용이 필요함