Unity Profiler에서 데이터 가져오기 정보
4554 단어 Unity
이 문장에 관하여
ProfilerReader에 대한 글을 썼습니다.
https://github.com/unity3d-jp/ProfilerReader
Unity Profiler에서 내보낸 로그 데이터, 총 데이터를 csv로 내보내는 도구입니다.
CSV의 형식은 몇 가지 준비가 되어 있지만, 사용자 자신도 IAnalyze FileWriter 등의 인터페이스를 계승한 클래스를 만들면 혼자서 CSV를 쓸 수 있다는 등도 고려하고 있다.
Profiler에서 데이터를 가져오는 이유는...?
Unity에서 성능을 조정할 때 UnityProfiler는 매우 유용한 도구입니다.
일에도 자주 쓰인다.
그냥 불만이 있어서.
그것은 한 프레임마다 데이터를 열람하는 수단만으로'평균화된 데이터를 얻거나 특별히 무슨 프레임이 발생했는지 발견하기'라고 말하기 어렵기 때문이다.
UI 디스플레이에서 이것저것 볼 수 있는 것도 좋은데... 아무튼 데이터를 빼고 원하는 형식으로 출력했으면 좋겠어요.
이렇게 생각하면 데이터를 추출하는 계기가 된다.
데이터를 추출할 때, 우선 두 가지 방법을 토론하였다.
막 생각났을 때 다음과 같은 두 가지 방법을 토론했다.
1. Unity API 등을 통해 ProfilerWindow에 표시된 내용을 추출하는 방법
2. 저장된 로그 파일을 직접 읽는 방법
1의 기법, 바른 형식의 줄무늬가 좋아서 처음에 이쪽의 수단을 토론했는데...
그러나 이 방법에서는 Profiler Windows에 300 프레임만 표시되는 데이터가 있습니다.
300프레임이라면 "프로파일러로 1분 정도 게임을 갈림길 위에 올려놓고...나중에는 평균을 맞추고 싶다! 병목 부분만 보고 싶다"는 식으로 할 수 없기 때문에 1의 방안이 없어진다.
Profiler.로그파일이 실행될 때 내보내는 로그를 지정합니다. 300 프레임이 넘더라도 정보는 유지됩니다.
2. 저장된 로그 파일을 직접 읽습니다.
(이것이 지옥의 시작이다...)
별말씀을..
1 방법으로 제작된 것은 PackageManager에서 다운로드할 수 있는 ProfilerAnalyzer입니다.
https://blogs.unity3d.com/jp/2019/05/13/introducing-the-profile-analyzer/
UnityEditorInternal.ProfilerFrameDataIterator라는 API를 통해 데이터를 가져옵니다.
당신은 어떻게 2진 데이터를 해석했습니까?
유니티 직원들의 특권 때문에... 엔진 코드를 보면서 이식했어요.
C++ 옆에 설치된 서열화된 주위 코드를 보면서 손으로 C#에 이식합니다.
착실하게 이식 & 디버깅하는 거예요.
2진 데이터의 두 가지 형식
Unity Profiler에서 내보낸 바이너리 파일은 크게 두 가지 형식입니다.
실행할 때 쓰십시오.원본 형식.ProfilerWindow 저장을 통해 수행됩니다.데이터 형식.
.원본 형식 정보
실행할 때 내보낼 때, 실행할 때의 성능에 영향을 주지 않기 위해 데이터량도 감소한다.
어떤 함수(Sample)가 몇 미터를 썼는지 통계하지 말고 사건이 발생했을 때의 몸을 기록해라.
예를 들어, Sample은 몇 밀리 초에 시작됨 Sample은 몇 밀리 초에 종료됨 과 같은 데이터 형식입니다.
또한 샘플 이름 등도 사전에 넣어 여러 개의 같은 문자열이 나타나지 않도록 한다.
또 데이터는 이른바'무상태'가 아니어서 지금까지 읽은 데이터를 이용하지 않으면 해독할 수 없다.
그리고 만약에 특정한 프레임만 자르면 특정 구역의 추출 형식이 아니라 필요한 데이터를 처음부터 모두 핥는 등 처리해야 한다.
(데이터 읽기 힘들어)
.데이터 형식 정보
ProfilerWindow에서 저장하고 내보냅니다.
어떤 샘플이 얼마나 많은 ms를 썼는지는 통계가 끝난 상태이며, 다른 샘플 이름은 문자열로 내보냅니다.
이것은 읽기가 비교적 쉽다.
이렇게 현실화하면 끝날 것 같아서...
또한 각 프레임 데이터는 독립적이며 잘라내기 쉬운 특징도 있다.
자세한 설명
상세한 상황은 이쪽 강연 슬라이드의 P73~P79를 보십시오.
https://learning.unity3d.jp/1365/
Unity 버전 및 바이너리 데이터 형식 정보
Unity 버전이 올라갈 때마다 바이너리 형식이 변경됩니다.
따라서 각 Unity의 새 버전을 읽어들이는 프로그램이 필요합니다.
특히데이터 형식은struct를 직접 넣는 느낌이기 때문에 데이터를 추가할 때마다 데이터가 멀어지고 곧 손상됩니다.
그래.raw 형식은 블록에 따라 분할되어 새로운 블록을 읽지 못해도 성립되기 때문에 그런대로...
그나저나 실제로 설치한 사람이...
여러 버전에 대응하기 위해 대개 따로 열거된 폭풍우...
※ 단순히 if가 아닌 Reflection을 이용하여 현실화하고, 변수의 속성에 대응하는 Unity의 버전 등을 기술하는 데 공을 들였음...
그럼 결과는 어때요?
나는 csv화가 정말 좋다고 생각한다.
GCAlloc의 부분을 찾을 때 도구에 걸면 GCAlloc 일람이 csv에 나타납니다.
전체 게임을 통해 어느 부분(Sample)이 무겁고 어디에 주의해야 하는지를 대충 알 수 있다.
가장 중요한 것은 "어느 부분이 무거워요?"이렇게 하면 다른 사람과 공유할 때 csv화하면 데이터를 쉽게 전달하고 쉽게 전달할 수 있다.
또 2진 형식을 이해했기 때문에 다음 2진 로그를 분할하는 도구 등도 만들었다.
https://github.com/wotakuro/ProfilerBinarylogSplit
또한 Profiler가 모르는 사양은 내부 형식으로도 알 수 있습니다.
예를 들어 Profielr Windows에서 Timeline의 Sample 이름을 클릭하면 관련 객체를 선택합니다
이것은 Profiler 2진법을 분석하는 과정에서 샘플을 저장할 때 샘플 With Instance라는 항목이 있고 실제 샘플과 대상이 관련된 규격이 있기 때문에 이런 일을 알 수 있다.
또한 Sample With Metadata 형식으로 좋아하는 데이터를 Sample With Metadata와 연관시킬 수 있는 형식이라는 것을 알기 때문에 새로운 API "Emit FrameMeta Data"가 왔을 때에도 말하겠죠. 여기에 데이터를 삽입해서...
바이너리 시리즈의 C++ 코드를 봤는데 C#에 이식하는 게 힘들었지만 정말 잘했어요.
앞으로 뭐...
모든 버전이 형식을 읽어서 대응하는 날...
앞으로의 Profiler 프레임 제한 문제도 해결됐으면 좋겠다는 예견이 있었는데... 직접 2진법을 읽는 것 외에 API를 추가로 이용하여 Profiler Window를 통해 데이터를 얻고 싶습니다.
그리고 편하면 데이터의 완전성 검사를 좀 더 구성하고 싶습니다.
(지금은 csv를 써보고 눈으로 확인하는 상황입니다...)
Reference
이 문제에 관하여(Unity Profiler에서 데이터 가져오기 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/wotakuro/items/1375b882d9f6a9989b17
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Unity에서 성능을 조정할 때 UnityProfiler는 매우 유용한 도구입니다.
일에도 자주 쓰인다.
그냥 불만이 있어서.
그것은 한 프레임마다 데이터를 열람하는 수단만으로'평균화된 데이터를 얻거나 특별히 무슨 프레임이 발생했는지 발견하기'라고 말하기 어렵기 때문이다.
UI 디스플레이에서 이것저것 볼 수 있는 것도 좋은데... 아무튼 데이터를 빼고 원하는 형식으로 출력했으면 좋겠어요.
이렇게 생각하면 데이터를 추출하는 계기가 된다.
데이터를 추출할 때, 우선 두 가지 방법을 토론하였다.
막 생각났을 때 다음과 같은 두 가지 방법을 토론했다.
1. Unity API 등을 통해 ProfilerWindow에 표시된 내용을 추출하는 방법
2. 저장된 로그 파일을 직접 읽는 방법
1의 기법, 바른 형식의 줄무늬가 좋아서 처음에 이쪽의 수단을 토론했는데...
그러나 이 방법에서는 Profiler Windows에 300 프레임만 표시되는 데이터가 있습니다.
300프레임이라면 "프로파일러로 1분 정도 게임을 갈림길 위에 올려놓고...나중에는 평균을 맞추고 싶다! 병목 부분만 보고 싶다"는 식으로 할 수 없기 때문에 1의 방안이 없어진다.
Profiler.로그파일이 실행될 때 내보내는 로그를 지정합니다. 300 프레임이 넘더라도 정보는 유지됩니다.
2. 저장된 로그 파일을 직접 읽습니다.
(이것이 지옥의 시작이다...)
별말씀을..
1 방법으로 제작된 것은 PackageManager에서 다운로드할 수 있는 ProfilerAnalyzer입니다.
https://blogs.unity3d.com/jp/2019/05/13/introducing-the-profile-analyzer/
UnityEditorInternal.ProfilerFrameDataIterator라는 API를 통해 데이터를 가져옵니다.
당신은 어떻게 2진 데이터를 해석했습니까?
유니티 직원들의 특권 때문에... 엔진 코드를 보면서 이식했어요.
C++ 옆에 설치된 서열화된 주위 코드를 보면서 손으로 C#에 이식합니다.
착실하게 이식 & 디버깅하는 거예요.
2진 데이터의 두 가지 형식
Unity Profiler에서 내보낸 바이너리 파일은 크게 두 가지 형식입니다.
실행할 때 쓰십시오.원본 형식.ProfilerWindow 저장을 통해 수행됩니다.데이터 형식.
.원본 형식 정보
실행할 때 내보낼 때, 실행할 때의 성능에 영향을 주지 않기 위해 데이터량도 감소한다.
어떤 함수(Sample)가 몇 미터를 썼는지 통계하지 말고 사건이 발생했을 때의 몸을 기록해라.
예를 들어, Sample은 몇 밀리 초에 시작됨 Sample은 몇 밀리 초에 종료됨 과 같은 데이터 형식입니다.
또한 샘플 이름 등도 사전에 넣어 여러 개의 같은 문자열이 나타나지 않도록 한다.
또 데이터는 이른바'무상태'가 아니어서 지금까지 읽은 데이터를 이용하지 않으면 해독할 수 없다.
그리고 만약에 특정한 프레임만 자르면 특정 구역의 추출 형식이 아니라 필요한 데이터를 처음부터 모두 핥는 등 처리해야 한다.
(데이터 읽기 힘들어)
.데이터 형식 정보
ProfilerWindow에서 저장하고 내보냅니다.
어떤 샘플이 얼마나 많은 ms를 썼는지는 통계가 끝난 상태이며, 다른 샘플 이름은 문자열로 내보냅니다.
이것은 읽기가 비교적 쉽다.
이렇게 현실화하면 끝날 것 같아서...
또한 각 프레임 데이터는 독립적이며 잘라내기 쉬운 특징도 있다.
자세한 설명
상세한 상황은 이쪽 강연 슬라이드의 P73~P79를 보십시오.
https://learning.unity3d.jp/1365/
Unity 버전 및 바이너리 데이터 형식 정보
Unity 버전이 올라갈 때마다 바이너리 형식이 변경됩니다.
따라서 각 Unity의 새 버전을 읽어들이는 프로그램이 필요합니다.
특히데이터 형식은struct를 직접 넣는 느낌이기 때문에 데이터를 추가할 때마다 데이터가 멀어지고 곧 손상됩니다.
그래.raw 형식은 블록에 따라 분할되어 새로운 블록을 읽지 못해도 성립되기 때문에 그런대로...
그나저나 실제로 설치한 사람이...
여러 버전에 대응하기 위해 대개 따로 열거된 폭풍우...
※ 단순히 if가 아닌 Reflection을 이용하여 현실화하고, 변수의 속성에 대응하는 Unity의 버전 등을 기술하는 데 공을 들였음...
그럼 결과는 어때요?
나는 csv화가 정말 좋다고 생각한다.
GCAlloc의 부분을 찾을 때 도구에 걸면 GCAlloc 일람이 csv에 나타납니다.
전체 게임을 통해 어느 부분(Sample)이 무겁고 어디에 주의해야 하는지를 대충 알 수 있다.
가장 중요한 것은 "어느 부분이 무거워요?"이렇게 하면 다른 사람과 공유할 때 csv화하면 데이터를 쉽게 전달하고 쉽게 전달할 수 있다.
또 2진 형식을 이해했기 때문에 다음 2진 로그를 분할하는 도구 등도 만들었다.
https://github.com/wotakuro/ProfilerBinarylogSplit
또한 Profiler가 모르는 사양은 내부 형식으로도 알 수 있습니다.
예를 들어 Profielr Windows에서 Timeline의 Sample 이름을 클릭하면 관련 객체를 선택합니다
이것은 Profiler 2진법을 분석하는 과정에서 샘플을 저장할 때 샘플 With Instance라는 항목이 있고 실제 샘플과 대상이 관련된 규격이 있기 때문에 이런 일을 알 수 있다.
또한 Sample With Metadata 형식으로 좋아하는 데이터를 Sample With Metadata와 연관시킬 수 있는 형식이라는 것을 알기 때문에 새로운 API "Emit FrameMeta Data"가 왔을 때에도 말하겠죠. 여기에 데이터를 삽입해서...
바이너리 시리즈의 C++ 코드를 봤는데 C#에 이식하는 게 힘들었지만 정말 잘했어요.
앞으로 뭐...
모든 버전이 형식을 읽어서 대응하는 날...
앞으로의 Profiler 프레임 제한 문제도 해결됐으면 좋겠다는 예견이 있었는데... 직접 2진법을 읽는 것 외에 API를 추가로 이용하여 Profiler Window를 통해 데이터를 얻고 싶습니다.
그리고 편하면 데이터의 완전성 검사를 좀 더 구성하고 싶습니다.
(지금은 csv를 써보고 눈으로 확인하는 상황입니다...)
Reference
이 문제에 관하여(Unity Profiler에서 데이터 가져오기 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/wotakuro/items/1375b882d9f6a9989b17
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
유니티 직원들의 특권 때문에... 엔진 코드를 보면서 이식했어요.
C++ 옆에 설치된 서열화된 주위 코드를 보면서 손으로 C#에 이식합니다.
착실하게 이식 & 디버깅하는 거예요.
2진 데이터의 두 가지 형식
Unity Profiler에서 내보낸 바이너리 파일은 크게 두 가지 형식입니다.
실행할 때 쓰십시오.원본 형식.ProfilerWindow 저장을 통해 수행됩니다.데이터 형식.
.원본 형식 정보
실행할 때 내보낼 때, 실행할 때의 성능에 영향을 주지 않기 위해 데이터량도 감소한다.
어떤 함수(Sample)가 몇 미터를 썼는지 통계하지 말고 사건이 발생했을 때의 몸을 기록해라.
예를 들어, Sample은 몇 밀리 초에 시작됨 Sample은 몇 밀리 초에 종료됨 과 같은 데이터 형식입니다.
또한 샘플 이름 등도 사전에 넣어 여러 개의 같은 문자열이 나타나지 않도록 한다.
또 데이터는 이른바'무상태'가 아니어서 지금까지 읽은 데이터를 이용하지 않으면 해독할 수 없다.
그리고 만약에 특정한 프레임만 자르면 특정 구역의 추출 형식이 아니라 필요한 데이터를 처음부터 모두 핥는 등 처리해야 한다.
(데이터 읽기 힘들어)
.데이터 형식 정보
ProfilerWindow에서 저장하고 내보냅니다.
어떤 샘플이 얼마나 많은 ms를 썼는지는 통계가 끝난 상태이며, 다른 샘플 이름은 문자열로 내보냅니다.
이것은 읽기가 비교적 쉽다.
이렇게 현실화하면 끝날 것 같아서...
또한 각 프레임 데이터는 독립적이며 잘라내기 쉬운 특징도 있다.
자세한 설명
상세한 상황은 이쪽 강연 슬라이드의 P73~P79를 보십시오.
https://learning.unity3d.jp/1365/
Unity 버전 및 바이너리 데이터 형식 정보
Unity 버전이 올라갈 때마다 바이너리 형식이 변경됩니다.
따라서 각 Unity의 새 버전을 읽어들이는 프로그램이 필요합니다.
특히데이터 형식은struct를 직접 넣는 느낌이기 때문에 데이터를 추가할 때마다 데이터가 멀어지고 곧 손상됩니다.
그래.raw 형식은 블록에 따라 분할되어 새로운 블록을 읽지 못해도 성립되기 때문에 그런대로...
그나저나 실제로 설치한 사람이...
여러 버전에 대응하기 위해 대개 따로 열거된 폭풍우...
※ 단순히 if가 아닌 Reflection을 이용하여 현실화하고, 변수의 속성에 대응하는 Unity의 버전 등을 기술하는 데 공을 들였음...
그럼 결과는 어때요?
나는 csv화가 정말 좋다고 생각한다.
GCAlloc의 부분을 찾을 때 도구에 걸면 GCAlloc 일람이 csv에 나타납니다.
전체 게임을 통해 어느 부분(Sample)이 무겁고 어디에 주의해야 하는지를 대충 알 수 있다.
가장 중요한 것은 "어느 부분이 무거워요?"이렇게 하면 다른 사람과 공유할 때 csv화하면 데이터를 쉽게 전달하고 쉽게 전달할 수 있다.
또 2진 형식을 이해했기 때문에 다음 2진 로그를 분할하는 도구 등도 만들었다.
https://github.com/wotakuro/ProfilerBinarylogSplit
또한 Profiler가 모르는 사양은 내부 형식으로도 알 수 있습니다.
예를 들어 Profielr Windows에서 Timeline의 Sample 이름을 클릭하면 관련 객체를 선택합니다
이것은 Profiler 2진법을 분석하는 과정에서 샘플을 저장할 때 샘플 With Instance라는 항목이 있고 실제 샘플과 대상이 관련된 규격이 있기 때문에 이런 일을 알 수 있다.
또한 Sample With Metadata 형식으로 좋아하는 데이터를 Sample With Metadata와 연관시킬 수 있는 형식이라는 것을 알기 때문에 새로운 API "Emit FrameMeta Data"가 왔을 때에도 말하겠죠. 여기에 데이터를 삽입해서...
바이너리 시리즈의 C++ 코드를 봤는데 C#에 이식하는 게 힘들었지만 정말 잘했어요.
앞으로 뭐...
모든 버전이 형식을 읽어서 대응하는 날...
앞으로의 Profiler 프레임 제한 문제도 해결됐으면 좋겠다는 예견이 있었는데... 직접 2진법을 읽는 것 외에 API를 추가로 이용하여 Profiler Window를 통해 데이터를 얻고 싶습니다.
그리고 편하면 데이터의 완전성 검사를 좀 더 구성하고 싶습니다.
(지금은 csv를 써보고 눈으로 확인하는 상황입니다...)
Reference
이 문제에 관하여(Unity Profiler에서 데이터 가져오기 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/wotakuro/items/1375b882d9f6a9989b17
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Unity 버전이 올라갈 때마다 바이너리 형식이 변경됩니다.
따라서 각 Unity의 새 버전을 읽어들이는 프로그램이 필요합니다.
특히데이터 형식은struct를 직접 넣는 느낌이기 때문에 데이터를 추가할 때마다 데이터가 멀어지고 곧 손상됩니다.
그래.raw 형식은 블록에 따라 분할되어 새로운 블록을 읽지 못해도 성립되기 때문에 그런대로...
그나저나 실제로 설치한 사람이...
여러 버전에 대응하기 위해 대개 따로 열거된 폭풍우...
※ 단순히 if가 아닌 Reflection을 이용하여 현실화하고, 변수의 속성에 대응하는 Unity의 버전 등을 기술하는 데 공을 들였음...
그럼 결과는 어때요?
나는 csv화가 정말 좋다고 생각한다.
GCAlloc의 부분을 찾을 때 도구에 걸면 GCAlloc 일람이 csv에 나타납니다.
전체 게임을 통해 어느 부분(Sample)이 무겁고 어디에 주의해야 하는지를 대충 알 수 있다.
가장 중요한 것은 "어느 부분이 무거워요?"이렇게 하면 다른 사람과 공유할 때 csv화하면 데이터를 쉽게 전달하고 쉽게 전달할 수 있다.
또 2진 형식을 이해했기 때문에 다음 2진 로그를 분할하는 도구 등도 만들었다.
https://github.com/wotakuro/ProfilerBinarylogSplit
또한 Profiler가 모르는 사양은 내부 형식으로도 알 수 있습니다.
예를 들어 Profielr Windows에서 Timeline의 Sample 이름을 클릭하면 관련 객체를 선택합니다
이것은 Profiler 2진법을 분석하는 과정에서 샘플을 저장할 때 샘플 With Instance라는 항목이 있고 실제 샘플과 대상이 관련된 규격이 있기 때문에 이런 일을 알 수 있다.
또한 Sample With Metadata 형식으로 좋아하는 데이터를 Sample With Metadata와 연관시킬 수 있는 형식이라는 것을 알기 때문에 새로운 API "Emit FrameMeta Data"가 왔을 때에도 말하겠죠. 여기에 데이터를 삽입해서...
바이너리 시리즈의 C++ 코드를 봤는데 C#에 이식하는 게 힘들었지만 정말 잘했어요.
앞으로 뭐...
모든 버전이 형식을 읽어서 대응하는 날...
앞으로의 Profiler 프레임 제한 문제도 해결됐으면 좋겠다는 예견이 있었는데... 직접 2진법을 읽는 것 외에 API를 추가로 이용하여 Profiler Window를 통해 데이터를 얻고 싶습니다.
그리고 편하면 데이터의 완전성 검사를 좀 더 구성하고 싶습니다.
(지금은 csv를 써보고 눈으로 확인하는 상황입니다...)
Reference
이 문제에 관하여(Unity Profiler에서 데이터 가져오기 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/wotakuro/items/1375b882d9f6a9989b17
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
모든 버전이 형식을 읽어서 대응하는 날...
앞으로의 Profiler 프레임 제한 문제도 해결됐으면 좋겠다는 예견이 있었는데... 직접 2진법을 읽는 것 외에 API를 추가로 이용하여 Profiler Window를 통해 데이터를 얻고 싶습니다.
그리고 편하면 데이터의 완전성 검사를 좀 더 구성하고 싶습니다.
(지금은 csv를 써보고 눈으로 확인하는 상황입니다...)
Reference
이 문제에 관하여(Unity Profiler에서 데이터 가져오기 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wotakuro/items/1375b882d9f6a9989b17텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)