문제
필드 선택 모드가 열려 있는 동안 Update가 프레임마다 네 종류의 할당을 만든다. (1) GetCasterPosition → FindPlayerObject가 FindObjectsByType<PlayerNameSetter>(FindObjectsSortMode.None)(135행)로 씬 전체를 스캔하며 매번 새 배열을 할당한다. (2) LogMagicParametersIfChanged가 동등성 비교(384행)보다 먼저 보간 문자열 키를 만들어(383행) 변경이 없어도 문자열이 할당된다. (3) TryGetCurrentMagicParameters(263행) → CardInputSender.TryGetCurrentMagicData → GetCurrentRecipeTypes가 호출마다 new List<CardType>(...)(CardInputSender.cs:306)를 만든다. (4) PointerInputUtility.IsPointerOverUiOrSelectable → RefreshRaycastResults가 new 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에 캐시하고 선택이 바뀔 때만 재생성하며, PointerInputUtility의 PointerEventData는 재사용되는 static 필드로 끌어올린다.
심각도: medium · 분류: performance
자동 코드 리뷰(멀티 에이전트 검증 통과)에서 발견됨.
문제
필드 선택 모드가 열려 있는 동안
Update가 프레임마다 네 종류의 할당을 만든다. (1)GetCasterPosition→FindPlayerObject가FindObjectsByType<PlayerNameSetter>(FindObjectsSortMode.None)(135행)로 씬 전체를 스캔하며 매번 새 배열을 할당한다. (2)LogMagicParametersIfChanged가 동등성 비교(384행)보다 먼저 보간 문자열 키를 만들어(383행) 변경이 없어도 문자열이 할당된다. (3)TryGetCurrentMagicParameters(263행) →CardInputSender.TryGetCurrentMagicData→GetCurrentRecipeTypes가 호출마다new List<CardType>(...)(CardInputSender.cs:306)를 만든다. (4)PointerInputUtility.IsPointerOverUiOrSelectable→RefreshRaycastResults가new 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에 캐시하고 선택이 바뀔 때만 재생성하며,PointerInputUtility의PointerEventData는 재사용되는 static 필드로 끌어올린다.심각도: medium · 분류: performance
자동 코드 리뷰(멀티 에이전트 검증 통과)에서 발견됨.