Version: 2022.1
언어: 한국어
오디오 프로파일러 모듈
파일 액세스 프로파일러 모듈

CPU 사용 프로파일러 모듈

CPU 사용 프로파일러 모듈은 애플리케이션에서 시간을 소비한 위치를 표시하는 차트를 제공합니다. 이 모듈은 애플리케이션이 시간을 소비하는 모든 주요 영역(예: 렌더링, 스크립트, 애니메이션)에 대한 개요를 제공합니다. 문서의 이 섹션에서는 다음의 주제를 다룹니다.

차트 카테고리

CPU 사용 프로파일러 모듈의 차트는 애플리케이션의 메인 스레드에 사용된 시간을 추적합니다. 타이밍은 9개 카테고리로 나뉩니다. 차트의 카테고리 순서를 변경하려면 차트 범례에 카테고리를 끌어다 놓으십시오. 카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

CPU 사용 프로파일러 모듈
CPU 사용 프로파일러 모듈
카테고리 설명
Rendering 애플리케이션이 그래픽스 렌더링에 소비하는 시간입니다.
Scripts 애플리케이션이 스크립트 실행에 소비하는 시간입니다.
Physics 애플리케이션이 물리 엔진에 소비하는 시간입니다.
Animation 애플리케이션이 스킨드 메시 렌더러, 게임 오브젝트, 애플리케이션 내 기타 컴포넌트에 소비하는 시간입니다. 여기에는 Animation 및 Animator 컴포넌트가 사용하는 시스템의 계산에 소비된 시간도 포함됩니다.
GarbageCollector 애플리케이션이 가비지 컬렉터 실행에 소비하는 시간입니다.
VSync 애플리케이션이 targetFrameRate 또는 동기화할 다음 VBlank를 기다리는 데 프레임당 소비한 시간입니다. 이는 QualitySettings.vSyncCount 값, 타겟 프레임 속도, 또는 애플리케이션이 실행되는 플랫폼의 기본 또는 강제 VSync 설정을 따릅니다. VSync에 대한 자세한 내용은 렌더링 및 VSync 샘플 문서의 섹션을 참조하십시오.
Global Illumination 애플리케이션이 조명에 소비하는 시간입니다.
UI 애플리케이션이 UI 표시에 소비한 시간입니다.
Others 애플리케이션이 다른 어떤 카테고리에도 속하지 않는 코드에 소비하는 시간입니다. 여기에는 전체 EditorLoop 등과 같은 영역이나, 에디터에서 플레이 모드를 프로파일링할 때의 프로파일링 오버헤드가 포함됩니다.

모듈 세부 정보 창

CPU 사용 모듈을 선택하면 그 아래에 있는 세부 정보 창에 선택된 프레임에서 애플리케이션이 시간을 소비한 위치에 대한 분석이 표시됩니다. 타이밍 데이터는 타임라인 또는 계층 표로 표시할 수 있습니다. 표시 방식을 변경하려면 세부 정보 창의 왼쪽 상단 드롭다운을 사용하십시오(Timeline 으로 기본 설정됨). 다음의 세 가지 뷰를 이용할 수 있습니다.

기능
타임라인 특정 프레임에 대한 타이밍 분석 데이터를 프레임 길이의 시간 축을 따라 표시합니다. 이는 모든 스레드의 타이밍을 한 번에 그리고 발생한 프레임 내에서 확인할 수 있는 유일한 뷰 모드입니다. 따라서 전체 스레드에 대한 타이밍 간 상관 관계를 지정할 수 있습니다. 예를 들어 잡 시스템 워커 스레드는 메인 스레드의 시스템이 예약한 후에 시작됩니다.
계층 구조 내부 계층 구조를 기준으로 타이밍 데이터를 그룹화합니다. 이 옵션은 기본적으로 사용된 시간을 기준으로 애플리케이션이 호출한 요소를 내림차순 리스트 포맷으로 표시합니다. 할당된 스크립팅 메모리 양(GC Alloc) 또는 호출 횟수를 기준으로 정보를 정렬할 수도 있습니다. 표의 순서를 지정하는 열을 변경하려면 표의 열 헤더를 클릭하십시오.
원시 계층 구조 타이밍 데이터를 타이밍이 발생한 호출 스택과 유사한 계층 구조로 표시합니다. Unity는 계층 구조 뷰에서와 같이 각 호출 스택을 병합하지 않고 이 모드에서 개별적으로 나열합니다.

Live 설정

각 뷰에서 사용할 수 있는 Live 설정은 플레이 모드 또는 에디터에서 새 데이터 기록을 시작할 때 모듈 세부 정보 창에 현재 프레임 또는 선택된 프레임에 대한 정보를 표시합니다. 이 설정을 활성화하려면 모듈 세부 정보 드롭다운 옆에 있는 Live 버튼을 클릭하십시오. 기본적으로 이 설정은 비활성화되었으며, 데이터를 기록할 때 모듈 세부 정보 창은 비어 있습니다. 참고: 이 설정은 프로파일러 창을 다시 칠할 때 EditorLoop의 오버헤드를 증가시킵니다.

Show Full Scripting Method Names 설정

또한 각 뷰에서 More Items 메뉴(⋮)를 선택하고 Show Full Scripting Method Names 를 활성화할 수 있습니다. 그러면 모든 스크립팅 메서드의 정규화된 이름(Assembly::Class::MethodName)을 표시합니다.

A: Show Full Scripting Method Names 가 활성화되지 않은 계층 구조 뷰와 타임라인 뷰의 스크립팅 메서드<br/> B: Show Full Scripting Method Names 가 활성화된 계층 구조 뷰와 타임라인 뷰의 스크립팅 메서드
A: Show Full Scripting Method Names 가 활성화되지 않은 계층 구조 뷰와 타임라인 뷰의 스크립팅 메서드
B: Show Full Scripting Method Names 가 활성화된 계층 구조 뷰와 타임라인 뷰의 스크립팅 메서드

타임라인(Timeline) 뷰

CPU 사용 프로파일러 모듈과 타임라인 뷰
CPU 사용 프로파일러 모듈과 타임라인 뷰

타임라인 뷰는 CPU 사용 프로파일러 모듈에 대한 기본 뷰입니다. 여기에는 애플리케이션에서 시간이 소요되는 위치와 타이밍이 서로 관련되는 방법에 대한 개요가 포함되어 있습니다.

타임라인 뷰는 계층 구조 뷰와는 달리 자체 하위 섹션의 모든 스레드에서 동일한 타임 축을 따라 프로파일링 데이터를 표시합니다. 계층 구조 뷰는 한 번에 한 스레드로 프로파일링 데이터를 표시하며 이는 메인 스레드에 기본값이 됩니다. 또한 이러한 뷰는 샘플의 기간만 표시하지만 타임라인 뷰는 각 샘플이 발생하는 시간을 보여줍니다.

타임라인 뷰를 사용하여 다른 스레드에 있는 활동이 병렬 실행에서 서로 연관되는 방법을 보여줄 수 있습니다. 잡 시스템의 워커 스레드와 같이 사용 중인 다른 스레드의 양, 스레드의 작업이 정렬되는 방식, 스레드가 대기 중이거나(대기 샘플) 다른 스레드나 잡이 종료하길 기다리는지(x 샘플 기다림) 여부를 알 수 있습니다.

항목 탐색 및 선택

타임 축의 영역을 확대하려면 마우스의 스크롤 휠을 사용하거나 마우스 오른쪽 버튼을 누른 상태로 드래그하는 동안 Alt 키를 누르고 있습니다. 또한 가로 스크롤 바의 끝을 사용하여 확대할 수도 있습니다. 전체 프레임 타임을 볼 수 있게 하려면 키보드의 A 키를 눌러서 줌을 초기화합니다.

스레드 하단에 흰색 화살표가 표시되면 클릭하여 스레드를 펼치고 모든 라인을 표시할 수 있습니다. 다시 클릭하면 최상단 라인만 표시됩니다. 스레드를 구분하는 라인을 드래그하여 표시되는 라인 개수를 다시 조정할 수도 있습니다. 라인을 두 번 클릭하면 스레드 섹션의 높이가 호출 스택의 최대 뎁스로 설정됩니다. 뷰를 패닝하려면 마우스 가운데 버튼을 누르거나, Alt 키(macOS의 경우 Command 키)를 길게 누른 상태로 마우스 왼쪽 버튼을 누르십시오.

스레드 그룹을 접거나 펼치려면 뷰의 왼쪽 끝에 있는 스레드 이름 옆의 폴드아웃 화살표를 클릭하십시오.

CPU 차트에 항목의 기여도를 보려면 하단 창에서 선택합니다. 프로파일러는 기여도를 강조 표시하고 차트의 나머지를 어둡게 나타냅니다. 항목 선택을 해제하려면 뷰의 다른 곳을 클릭합니다. F 키를 눌러 선택한 현재 샘플에 초점을 맞추거나 아무 것도 선택하지 않은 경우 기본 줌으로 나타냅니다.

선택된 항목이 있는 타임라인 뷰의 CPU 사용 모듈
선택된 항목이 있는 타임라인 뷰의 CPU 사용 모듈

위의 이미지에서 선택된 샘플에 있는 툴팁은 모든 스레드에 걸친 인스턴스의 수와 이 샘플의 총 시간과 같이 심도있는 세부 정보를 제공합니다. 툴팁 안에서 해당 텍스트를 선택하고 복사할 수 있을 뿐 아니라 버튼을 사용하여 다음과 같이 샘플과 더 깊이 상호 작용할 수 있습니다.

작업 설명
Copy 클립보드에 호출 스택과 툴팁의 전체 콘텐츠를 복사합니다.
Show 다음의 옵션에서 고르려면 이 드롭다운을 선택합니다.
Hierarchy 계층 구조 뷰에 있는 이 샘플로 전환합니다.
Raw Hierarchy 원시 계층 구조 뷰에 있는 이 샘플로 전환합니다.
Full Details for Call Stacks Unity는 호출 스택을 메서드 포인터 주소의 리스트로 기록하며 이를 사용하여 메서드 이름, 파일 경로, 스택 줄 번호로 표시합니다. 포인터 주소만 있을 때마다 Unity는 이를 무시하여 사용할 수 있는 상세한 정보를 가진 실행 가능한 항목을 위해 화면 공간을 보존합니다. 이 프로퍼티를 활성화하면 호출 스택의 메서드 포인터 주소에 대한 전체 리스트를 볼 수 있습니다.
Selected Sample Stack 샘플 스택의 세부 정보를 봅니다. Unity는 개별 창에서 이 정보를 엽니다. 그러면 해당 샘플 스택 정보를 클립보드로 복사할 수 있습니다.

샘플 스택은 Unity가 모든 샘플을 특정 메서드와 묶거나 모든 호출을 샘플로 기록하지 않기 때문에 메서드의 호출 스택과는 구분됩니다. 다른 프레임에서 샘플을 고르고 표시된 프레임에 동일한 샘플 스택을 가진 샘플이 없는 경우 이 창은 원래의 선택에 대한 샘플 스택과 이 프레임에 대한 대략적인 선택을 둘 다 보여줍니다.

GC.Alloc 샘플은 붉은 계열인 자홍색으로 컬러가 지정되어 표시되며 해당 할당의 크기를 보여줍니다.

툴팁에 관리되는 호출 스택을 표시하려면 프로파일러 창의 툴바로 이동하여 호출 스택 버튼을 선택합니다. 프레임에 대해 해당 호출 스택을 표시하기 위해 프레임을 프로파일하기 전에 반드시 이 프로퍼티를 활성화해야 합니다. 자세한 내용은 호출 스택에서 해당 섹션을 참조하십시오.

플로 이벤트

Unity가 여러 스레드 간에 잡을 예약하는 방법을 시각화하려면 Flow Events 설정을 사용하십시오. 이 설정은 시스템, 잡 및 스레드 간의 관계를 표시합니다. 이 설정을 사용하려면 타임라인 뷰 창의 오른쪽 상단에 있는 More 메뉴(⋮) 를 선택한 후 Show Flow Events를 선택하십시오.

이 설정을 활성화하면 프로파일러는 잡을 예약하는 프로파일러 샘플에 흰색 이벤트 마커를 추가하거나 예약된 잡이 완료될 때까지 대기합니다. 또한 관련이 없는 샘플은 어둡게 표시하므로 선택하는 샘플을 보다 쉽게 ​​시각화할 수 있습니다.

프로파일러가 샘플에 추가하는 세 가지 유형의 화살표는 다음과 같습니다.

  • 아래쪽 화살표: 플로의 시작을 나타내고, 이 샘플이 일부 작업을 예약했음을 표시합니다.
  • 오른쪽 화살표 : 플로의 다음 항목을 나타내고, 다른 샘플이 이 잡을 예약했음을 표시합니다.
  • 위쪽 화살표: 플로의 끝을 나타내고, 이 샘플에 대한 작업이 끝났거나 동기화되었음을 표시합니다.

샘플을 선택하면 프로파일러가 관련 플로 이벤트 마커를 라인으로 연결합니다. 더 두꺼운 라인은 선택한 특정 플로 라인을 강조 표시합니다. 예를 들어 begin 샘플이 두 개의 다른 next 샘플을 가리키는 경우 next 샘플 중 하나를 클릭하면 프로파일러가 더 두꺼운 라인을 그립니다.

이 뷰는 코드 실행 플로, 그리고 완료를 대기 중인 작업을 찾는 데 유용하며 시각적인 방식으로 코드의 종속성을 발견하는 데 도움이 됩니다.

Flow Events가 활성화되어 있고 샘플이 선택되어 있는 타임라인 CPU 프로파일러 뷰
Flow Events가 활성화되어 있고 샘플이 선택되어 있는 타임라인 CPU 프로파일러 뷰

계층 구조 및 원시 계층 구조 뷰

계층 구조 또는 원시 계층 구조 뷰로 전환하면 해당 샘플이 메인 스레드에 있는 한 선택 항목이 계속 이어집니다. 선택 항목을 즉시 찾을 수 없으면 F 키를 눌러 포커스를 맞추십시오.

CPU 사용 프로파일러 모듈과 계층 구조 뷰
CPU 사용 프로파일러 모듈과 계층 구조 뷰

계층 구조 뷰는 프로파일링한 모든 샘플을 나열하고, 공유된 호출 스택과 ProfilerMarkers 계층 구조로 그룹화합니다. 원시 계층 구조 뷰는 샘플들을 서로 그룹화하지 않으므로, 세분화된 수준으로 샘플을 살펴볼 때 유용합니다. 또한 Thread 드롭다운에서 특정 스레드(예: 메인 스레드 또는 렌더 스레드)를 선택하여 이러한 뷰로 검사할 수 있습니다.

기본적으로 모든 EditorOnly 샘플은 이러한 뷰에서 축소됩니다. EditorOnly 샘플은 에디터 전용 안전 검사로 인해 발생하는 플레이어 루프의 샘플입니다. 샘플이 축소되면 해당 GC.Alloc 값이 둘러싸는 샘플의 GC.Alloc 값에 영향을 주지 않습니다. 이러한 샘플을 표시하려면 세부 정보 창의 오른쪽 상단에 있는 More Items 메뉴(⋮)를 선택한 후 Collapse EditorOnly Samples 설정을 비활성화하십시오. 자세한 내용은 이 문서의 에디터 전용 샘플 섹션을 참조하십시오.

두 가지 뷰 모두 계층 구조의 각 항목에 대해 다음의 상세 정보를 제공합니다.

프로퍼티 기능
Total Unity가 특정 함수에 소비한 총 시간(백분율)입니다.
Self Unity가 특정 함수에 소비한 총 시간(백분율)이며, Unity가 하위 함수를 호출하는 데 소비한 시간은 제외입니다.

예를 들어 스크린샷에서 16.7%의 시간은 Camera.Render 함수에 소비한 시간입니다. 이는 수많은 드로잉 및 컬링 함수를 호출하기 때문입니다. 하지만 함수 호출을 제외하면 0.2%의 시간만 Camera.Render 함수 자체에 소비되었습니다.
Calls 이 프레임에서 이 함수를 호출한 횟수입니다. Raw Hierarchy 뷰에서 이 열의 값은 항상 1이며, 이는 프로파일러가 샘플의 계층 구조를 병합하지 않기 때문입니다.
GC Alloc Unity가 현재 프레임에 할당한 스크립팅 힙 메모리 양입니다. 가비지 컬렉터는 스크립팅 힙 메모리를 관리합니다.

Unity가 GC.Collect()를 호출하거나 힙의 현재 크기에 맞지 않는 스크립팅 힙 할당이 있을 때마다 가비지 컬렉터는 트리거합니다. 더 이상 레퍼런스하지 않는 모든 할당을 표시하고 수집합니다. 이 프로세스는 프로파일러의 GC.Collect 샘플로 나타납니다.

Unity는 애플리케이션이 해당 힙에 더 많이 할당하기 때문에 더 자주 가비지 컬렉터를 실행합니다. 관리되는 힙이 커질 수록 Unity가 메모리를 표시하고 수집하는 시간이 더 오래 걸립니다. 이처럼 애플리케이션을 실행하는 동안에는 가비지 컬렉터가 애플리케이션의 프레임 속도에 영향을 미치는 것을 방지하고 전체 힙 크기를 작게 유지하기 위해 GC Alloc 값을 0으로 유지해야 합니다.

관리되는 힙에 관한 자세한 내용은 자동 메모리 관리 이해에 있는 문서를 참조하십시오.
Time ms Unity가 특정 함수에 소비한 총 시간(밀리초)입니다. 애플리케이션이 잡 시스템이나 멀티스레드 렌더링을 사용하는 경우 이러한 정보는 잘못되었을 수 있습니다. 이는 현재 선택한 스레드에서 Unity가 소비한 시간만 포함되기 때문입니다. 스레드를 변경하려면 계층 구조 창 상단의 Thread 드롭다운을 선택하십시오.
Self ms Unity가 특정 함수에 소비한 총 시간(밀리초)이며, Unity가 하위 함수를 호출하는 데 소비한 시간은 제외입니다.
Warning 경고 아이콘으로 표시되며, 현재 프레임 동안 애플리케이션이 경고를 트리거한 횟수를 표시합니다. 자세한 내용은 이 문서의 성능 경고 섹션을 참조하십시오.

애플리케이션이 프로파일된 함수를 호출하고 사용하는 위치에 대한 자세한 정보를 얻으려면 모듈 세부 정보 창의 오른쪽 상단 코너에 있는 Details 드롭다운을 선택하고 Related Data 또는 Calls 뷰를 선택합니다.

관련된 데이터 패널
관련된 데이터 패널

The Related Data view displays a list of UnityEngine.Objects that use a Begin() overload and are associated with the Profiler sample. Some samples that Unity reports have these associations built in, such as Camera.Render samples that are linked to the Camera GameObject that does the rendering. Unity reports these objects via their instance ID and resolves them to a name in the Profiler window, if you profile in the Editor.

이러한 오브젝트 중 하나를 클릭하면 Unity는 씬 계층 구조를 통해 해당 오브젝트를 찾아 ping합니다. 이 연결은 인스턴스 ID를 사용하므로 에디터에서 애플리케이션을 프로파일링할 때 그리고 오브젝트가 여전히 존재할 때에만 ping이 동작합니다.

GC.Alloc 샘플의 경우 이 뷰는 N/A 항목 리스트를 표시합니다. 이 리스트는 이 계층 수준에서 발생한 각 할당에 대해 하나씩, 그리고 GC.Alloc 열에 나열된 할당 크기와 함께 표시됩니다. Call Stacks 설정이 활성화된 상태로 애플리케이션을 프로파일링하는 경우 이 뷰에서 GC.Alloc 샘플을 선택하면 세부 프로파일링 설정을 활성화하지 않아도 프로파일러 창에 선택된 할당 스크립팅 오브젝트의 호출 스택이 표시됩니다. 자세한 내용은 이 문서의 할당 호출 스택 섹션을 참조하십시오.

호출 패널
호출 패널

Calls 뷰는 선택된 샘플이 호출되는 위치뿐 아니라 호출한 다른 함수도 표시합니다.

호출 스택

ProfilerMarkers는 프로파일러가 프로파일링 정보를 표시하고 다른 시간 뷰와 계층 구조 뷰로 구성하기 위해 사용하는 샘플 세트를 방출합니다. 따라서 프로파일러 창에 표시되는 모든 샘플은 샘플 스택의 일부입니다.

샘플 스택은 Unity가 모든 샘플을 특정 메서드로 묶거나 모든 호출을 샘플로 기록하지 않기 때문에 메서드 호출 스택과 다릅니다. 세부 프로파일링ProfilerMarker를 모든 함수 호출에 추가하지만 네이티브 코드에 대해서는 추가하지 않으며 이러한 모든 샘플을 기록하면 잠재적으로 높은 오버헤드를 발생시킵니다.

GC.Alloc, UnsafeUtility.Malloc, JobHandle.Complete가 방출하는 샘플에 대한 전체 호출 스택을 활성화할 수 있습니다. 이는 세부 프로파일링과 높은 오버헤드 발생 없이 이러한 샘플이 발생한 위치를 추적하려는 경우 유용합니다. 이러한 마커에 대한 자세한 내용은 공통 프로파일러 마커에 있는 문서를 참조하십시오.

이러한 샘플에 대한 전체 호출 스택을 활성화하려면 프로파일러 창의 툴바로 이동하여 Call Stacks 버튼을 활성화합니다. 기본적으로 이렇게 하면 GC.Alloc 샘플에 대한 호출 스택을 활성화합니다. 다른 호출 스택을 활성화하려면 드롭다운 화살표를 선택하고 호출 스택을 보려는 다른 마커를 활성화합니다.

에디터나 실행 중인 플레이어에서 프로파일할 때 이 기능을 사용할 수 있습니다. 이 기능은 이 옵션을 활성화한 후에 프로파일하는 프레임에만 효과가 있습니다.

예를 들어 모든 스크립팅 힙 할당은 Hierarchy 뷰와 Timeline 뷰에 모두 GC.Alloc 샘플로서 나타납니다. 타임라인 뷰에서는 밝은 자홍색으로 컬러가 지정됩니다. 호출 스택을 보려면 CPU 프로파일러 모듈을 선택한 다음 타임라인 뷰에서 GC.Alloc 샘플을 선택합니다. 호출 스택은 선택 강조 표시로 나타납니다.

호출 스택을 복사하려면 툴팁의 Copy 버튼을 선택합니다. 또한 해당 파일 경로가 파란색 링크로 강조 표시가 되어 있는 경우 이 뷰에서 관련된 코드 파일을 열 수 있습니다. 링크를 클릭하면 파일이 기본 IDE에서 열립니다. 참고: 호출 스택 정보는 해당 메서드 안에 있는 정확한 줄 번호를 포함하고 있지는 않지만 해당 메서드 시작 부분에 있는 줄만 포함합니다.

GC.Alloc 샘플이 선택된 타임라인 뷰의 프로파일러 창과(위) 계층 구조 뷰에서 선택된 동일한 샘플의 프로파일러 창
GC.Alloc 샘플이 선택된 타임라인 뷰의 프로파일러 창과(위) 계층 구조 뷰에서 선택된 동일한 샘플의 프로파일러 창

또한 Show 드롭다운을 사용하여 GC.Alloc의 샘플 스택인 전체 세부 정보를 보거나 Hierarchy 또는 Raw Hierarchy 뷰에서 볼 수 있도록 전환할 수 있습니다.

전체 호출 스택 세부 정보를 보려면 계층 구조 또는 원시 계층 구조 뷰에서 Details 뷰를 Related Data로 설정합니다. 이 뷰는 이 샘플과 연관된 메타데이터를 나열하며 연관되어 있는 UnityEngine.Object를 포함할 수도 있습니다. UnityEngine.Object와 연관되지 않은 메타데이터 엔트리의 경우 해당 이름이 이 패널에서 N/A로 표시됩니다. N/A 엔트리를 선택하면 프로파일러는 세부 정보 뷰의 아래쪽 절반에 있는 호출 스택을 포함하여 메타데이터를 표시합니다.

관리되는 할당에 관한 자세한 내용은 자동 메모리 관리 이해에 있는 문서를 참조하십시오.

일반 마커

Unity의 코드는 애플리케이션에서 시간을 소비하는 항목에 대한 인사이트를 제공하는 수많은 프로파일러 마커로 계측됩니다. 프로파일링 데이터에서 볼 수 있는 가장 일반적인 마커의 전체 리스트는 일반 프로파일러 마커 문서를 참조하십시오.

오디오 프로파일러 모듈
파일 액세스 프로파일러 모듈
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961