로드 시간 기록 함수 추가

게임의 로드 이벤트 실행 시점을 기록하는 것은 다음 두 가지 이유에서 중요합니다.

  1. 로드 중 프레임 시간 데이터 오염 방지
  2. 로드 시간을 분석하여 로드 시간이 허용치보다 길었던 시점과 위치 파악

로드 이벤트에 메타데이터를 연결할 수 있습니다.

typedef struct TuningFork_LoadingTimeMetadata {
    enum LoadingState {
        UNKNOWN_STATE = 0,
        // The first time the game is run
        FIRST_RUN = 1,
        // App is not backgrounded
        COLD_START = 2,
        // App is backgrounded
        WARM_START = 3,
        // App is backgrounded, least work needed
        HOT_START = 4,
        // Asset loading between levels
        INTER_LEVEL = 5
    } state;
    enum LoadingSource {
        UNKNOWN_SOURCE = 0,
        // Uncompressing data.
        MEMORY = 1,
        // Reading assets from APK bundle.
        APK = 2,
        // Reading assets from device storage.
        DEVICE_STORAGE = 3,
        // Reading assets from external storage, e.g. SD card.
        EXTERNAL_STORAGE = 4,
        // Loading assets from the network.
        NETWORK = 5,
        // Shader compilation.
        SHADER_COMPILATION = 6,
        // Time spent between process starting and onCreate.
        PRE_ACTIVITY = 7,
        // Total time spent between process starting and first render frame.
        FIRST_TOUCH_TO_FIRST_FRAME = 8
    } source;
    int32_t compression_level;  // 0 = no compression, 100 = max compression
    enum NetworkConnectivity {
        UNKNOWN = 0,
        WIFI = 1,
        CELLULAR_NETWORK = 2
    } network_connectivity;
    uint64_t network_transfer_speed_bps;  // bandwidth in bits per second
    uint64_t network_latency_ns;          // latency in nanoseconds
} TuningFork_LoadingTimeMetadata;

요구사항과 관련 없는 필드는 0일 수 있습니다.

로드 이벤트에는 주석도 연결될 수 있습니다. 관련 주석은 dev_tuningfork.proto 파일의 Annotation 메시지에서 한 개 이상 필드를 사용하여 프레임 시간 주석과 동일한 방법으로 정의됩니다.

TuningFork_ErrorCode TuningFork_startRecordingLoadingTime( const TuningFork_LoadingTimeMetadata* eventMetadata, uint32_t eventMetadataSize, const TuningFork_CProtobufSerialization* annotation, TuningFork_LoadingEventHandle* handle);

이 함수는 지정된 메타데이터 및 주석과 연결된 로드 시간 이벤트를 기록하고 TuningFork_stopRecordingLoadingTime() 함수에 사용되는 handle을 입력합니다.

TuningFork_ErrorCode TuningFork_stopRecordingLoadingTime( TuningFork_LoadingEventHandle handle);

이 함수는 이전에 TuningFork_startRecordingLoadingTime()에 의해 시작된 이벤트 기록을 중지합니다. 이벤트는 다음 세션 플러시에서 업로드됩니다.

TuningFork_ErrorCode TuningFork_recordLoadingTime( uint64_t time_ns, const TuningFork_LoadingTimeMetadata* eventMetadata, uint32_t eventMetadataSize, const TuningFork_CProtobufSerialization* annotation);

앞서 설명한 시작 함수와 중지 함수를 직접 사용하는 것이 좋습니다. 하지만 그럴 수 없다면 이 함수를 호출하여 기간 및 연결된 메타데이터와 주석을 기록할 수 있습니다.

로드 그룹 함수

게임에서 단일 로드 기간에 사용자에게 표시된 몇몇 로드 이벤트를 기록할 수 있습니다. 파일 로드, 압축 해제, 셰이더 컴파일이 이에 해당됩니다(하지만 이에 국한되지 않음).

Tuning Fork가 더 정확한 통계를 제공할 수 있도록 로드 이벤트가 이러한 그룹에 속한다는 사실을 Tuning Fork에 알려야 합니다. 그렇게 하려면 로드 이벤트를 다음과 같은 시작 함수와 중지 함수와 함께 괄호로 묶습니다.

TuningFork_ErrorCode TuningFork_startLoadingGroup( const TuningFork_LoadingTimeMetadata* eventMetadata, uint32_t eventMetadataSize, const TuningFork_CProtobufSerialization* annotation, TuningFork_LoadingEventHandle* handle);

이 함수는 지정된 메타데이터 및 주석과 연결된 로드 그룹을 시작하고 TuningFork_stopLoadingGroup() 함수에 사용되는 handle을 입력합니다. 메타데이터와 주석은 현재 Play 백엔드에서 사용되지 않으며 nullptr로 설정할 수 있습니다. 이후의 모든 로드 이벤트는 고유 그룹 ID별로 태그가 지정됩니다.

TuningFork_ErrorCode TuningFork_stopLoadingGroup( TuningFork_LoadingEventHandle handle);

이 함수는 이전에 TuningFork_startLoadingGroup()에 의해 시작된 로드 그룹을 중지합니다. TuningFork_startLoadingGroup()이 다시 호출될 때까지 후속 로드 이벤트에는 그룹 ID가 없습니다.

그림 1. 로드 그룹의 예