Skip to content

FieldSelector.Update의 전체 씬 FindObjectsByType 및 매 프레임 할당 #421

Description

@dev-yunseong

문제

필드 선택 모드가 열려 있는 동안 Update가 프레임마다 네 종류의 할당을 만든다. (1) GetCasterPositionFindPlayerObjectFindObjectsByType<PlayerNameSetter>(FindObjectsSortMode.None)(135행)로 씬 전체를 스캔하며 매번 새 배열을 할당한다. (2) LogMagicParametersIfChanged가 동등성 비교(384행)보다 먼저 보간 문자열 키를 만들어(383행) 변경이 없어도 문자열이 할당된다. (3) TryGetCurrentMagicParameters(263행) → CardInputSender.TryGetCurrentMagicDataGetCurrentRecipeTypes가 호출마다 new List<CardType>(...)(CardInputSender.cs:306)를 만든다. (4) PointerInputUtility.IsPointerOverUiOrSelectableRefreshRaycastResultsnew PointerEventData(eventSystem)(PointerInputUtility.cs:52)를 할당하고 전체 EventSystem.RaycastAll을 수행한다. 265/271행의 WDebug.LogWarning 자체는 #if UNITY_EDITOR || DEVELOPMENT_BUILD로 릴리스에서 제거되지만, 271행의 보간 인자 문자열은 호출 지점에서 여전히 생성된다.

위치

  • client/Assets/Scripts/GameScene/FieldSelector.cs:76

재현 / 영향

서버 오브젝트가 약 30개 살아 있는 상태에서 플레이어가 필드 선택 모드를 유지하면, 매 프레임 클라이언트가 PlayerNameSetter 컴포넌트를 찾기 위해 씬 전체를 훑고 배열, List, 문자열, PointerEventData를 할당한다. 인디케이터 메시 재생성 비용까지 겹친다. 에디터나 개발 빌드에서는 해석 불가능한 레시피가 있을 때 프레임마다 경고 로그가 추가로 쏟아진다.

수정 방향

필드 선택 모드에 진입할 때 시전자 ServedObject를 한 번 해석해 캐시하고, 키 문자열을 만드는 대신 serverName/range/radius를 필드 단위로 비교한다. 레시피 리스트는 CardInputSender에 캐시하고 선택이 바뀔 때만 재생성하며, PointerInputUtilityPointerEventData는 재사용되는 static 필드로 끌어올린다.


심각도: medium · 분류: performance
자동 코드 리뷰(멀티 에이전트 검증 통과)에서 발견됨.

Metadata

Metadata

Assignees

Labels

fixfix bugspriority:P2운영 리스크 / 성능

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions