09.18 - TIL

김혁·2025년 9월 18일

TIL

목록 보기
21/84

오늘의 코드카타

등대

  • 트리 구조 + DP + DFS
  • LV3 - 26% (복습 필요)
    -> 문제 풀이

오늘의 공부

팀 프로젝트 진행 내용

  1. 스태미나 무제한 아이템 개발
    - 특정 시간동안 스태미나 무제한 버프 (Modifier : Override)
    - "Buff.StaminaBoost" 태그 부착

    ```
    UEGItem_StaminaBoostEffect::UEGItem_StaminaBoostEffect()
    	:BoostDuration(10.0f)
    {
    	DurationPolicy = EGameplayEffectDurationType::HasDuration;
    	DurationMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(BoostDuration));
    
    	FGameplayModifierInfo StaminaModifier;
    	StaminaModifier.ModifierOp = EGameplayModOp::Override;
    	StaminaModifier.ModifierMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(100.f));
    	StaminaModifier.Attribute = UEGCharacterAttributeSet::GetStaminaAttribute();
    	Modifiers.Add(StaminaModifier);
    
    	UTargetTagsGameplayEffectComponent* TargetTags = CreateDefaultSubobject<UTargetTagsGameplayEffectComponent>(TEXT("TargetTags"));
    	FInheritedTagContainer TagChanges = TargetTags->GetConfiguredTargetTagChanges();
    	TagChanges.Added.AddTag(FGameplayTag::RequestGameplayTag(FName("Buff.StaminaBoost")));
    	TargetTags->SetAndApplyTargetTagChanges(TagChanges);
    	GEComponents.Add(TargetTags);
    }
    ```

  2. 다른 플레이어를 몇 초동안 강제로 점프시키는 아이템 개발

    • 아이템 획득 시 월드의 다른 플레이어 캐릭터들에게 강제로 점프시키는 Ability 부여 및 실행
    • 주의할 점 : 오버랩 이벤트는 서버, 클라에서 동시에 발생시킬 수 있기 때문에 서버에서만 해당 로직 실행
    void AEGItem_ForceJump::OnPickUp_Implementation(AActor* PickUpActor)
    {
    	if (HasAuthority())
    	{
    		for (TActorIterator<AEGChickenCharacter> It(GetWorld()); It; ++It)
    		{
    			AEGChickenCharacter* OtherCharacter = *It;
    			if (OtherCharacter && OtherCharacter != PickUpActor)
    			{
    				if (UAbilitySystemComponent* ASC = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(OtherCharacter))
    				{
    					FGameplayAbilitySpec Spec = FGameplayAbilitySpec(ForceJumpAbilityClass, 1, INDEX_NONE);
    					FGameplayAbilitySpecHandle Handle = ASC->GiveAbility(Spec);
    					if (Handle.IsValid())
    					{
    						ASC->TryActivateAbility(Handle);
    					}
    				}
    			}
    		}
    	}
    	
    	Super::OnPickUp_Implementation(PickUpActor);
    }
    • Jump를 강제로 시키는 Ability 구현
    • 주의할 점 : NetExecutionPolicy를 ServerOnly로 설정하면 Server에서만 실행이 되고, 클라에서 동기화가 안 됨
    • 따라서, NetExecutionPolicy를 LocalPredicted로 설정하고, 서버,클라 둘 다에서 별도로 점프 실행이 필요
    UEGItem_ForceJumpAbility::UEGItem_ForceJumpAbility()
    {
    	...
        
    	NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
    }
    
    void UEGItem_ForceJumpAbility::ActivateAbility(...)
    {
    	...	
            
        // 서버 및 Predict을 진행하는 클라이언트에서 실행
    	if (HasAuthorityOrPredictionKey(ActorInfo, &ActivationInfo))
    	{
    		GetWorld()->GetTimerManager().SetTimer(
    			JumpTimerHandle,
    			FTimerDelegate::CreateUObject(this, &ThisClass::ForceJump, Character),
    			JumpInterval,
    			true);
    
    		GetWorld()->GetTimerManager().SetTimer(
    			DurationTimerHandle,
    			this,
    			&ThisClass::OnDurationFinished,
    			AbilityDuration,
    			false);
    	}
    }

오늘의 CS

캐시 메모리

  • 개념
    • CPU와 메인 메모리 사이에 위치한 고속 메모리 (속도 차이를 해결)
    • 자주 쓰는 데이터를 보관해 CPU가 빠르게 접근할 수 있도록 함
  • 3계층
    • L1 캐시 : CPU 코어 내부에 있고, 각 코어가 독점적으로 사용. 가장 빠름.
    • L2 캐시 : CPU 코어 내부 혹은 외부에 있음. L1보다 크고 느림.
    • L3 캐시 : 모든 코어가 공유하는 캐시. 가장 크고 가장 느림.

캐시 히트 vs 캐시 미스

  • 캐시 히트
    • CPU가 요청한 데이터가 캐시에 있어서 즉시 읽음 -> 빠름
  • 캐시 미스
    • 캐시에 해당 데이터가 없어서 RAM에서 가져와야 함 -> 느림
    • 종류
      • Cold Miss (Compulsory Miss) : 데이터가 아직 한 번도 캐시에 로드된 적이 없을 때 발생
      • Capacity Miss : 캐시 용량이 부족해서 발생
      • Conflict Miss : 캐시 메모리의 특정 위치에 여러 데이터가 매핑되어 충돌이 발생
profile
게임 개발자를 향해..

0개의 댓글