使用本主题中的函数将 Tuning Fork 库集成到您的游戏代码中。
位于 include/tuningfork/tuningfork.h
的头文件包含 Tuning Fork 库的核心接口。位于 include/tuningfork/tuningfork_extra.h
的文件包含实用程序函数。
一些函数采用协议缓冲区的序列化形式。有关在游戏中使用协议缓冲区的更多信息,请参阅 关于协议缓冲区。
函数参数和返回值在头文件和 参考 API 文档 中进行了说明。
Android 性能调整器生命周期函数
使用以下函数控制 Tuning Fork 实例的生命周期。
初始化
TFErrorCode TuningFork_init(const TFSettings* settings, JNIEnv* env, jobject context);
您必须在启动时调用此函数一次,通常从应用程序 onCreate()
方法执行的本地代码中调用。它分配 Tuning Fork 库所需的數據。
您必须在应用程序中的 assets/tuningfork
目录中存在一个名为 tuningfork_settings.bin
的文件,其中包含直方图和注释设置。要将文本文件转换为二进制文件,请参阅 文本与二进制表示形式。
您在 settings
中填充的字段决定了库如何初始化自身。
/**
* @brief Initialization settings
* Zero any values that are not being used.
*/
struct TFSettings {
/**
* Cache object to be used for upload data persistence.
* If unset, data is persisted to /data/local/tmp/tuningfork
*/
const TFCache* persistent_cache;
/**
* The address of the Swappy_injectTracers function.
* If this is unset, you need to call TuningFork_tick explicitly.
* If it is set, telemetry for 4 instrument keys is automatically recorded.
*/
SwappyTracerFn swappy_tracer_fn;
/**
* Callback
* If set, this is called with the fidelity parameters that are downloaded.
* If unset, you need to call TuningFork_getFidelityParameters explicitly.
*/
ProtoCallback fidelity_params_callback;
/**
* A serialized protobuf containing the fidelity parameters to be uploaded
* for training.
* Set this to nullptr if you are not using training mode. Note that these
* are used instead of the default parameters loaded from the APK, if they
* are present and there are neither a successful download nor saved parameters.
*/
const CProtobufSerialization* training_fidelity_params;
/**
* A null-terminated UTF-8 string containing the endpoint that Tuning Fork
* will connect to for parameter, upload, and debug requests. This overrides
* the value in base_uri in the settings proto and is intended for debugging
* purposes only.
*/
const char* endpoint_uri_override;
/**
* The version of Swappy that swappy_tracer_fn comes from.
*/
uint32_t swappy_version;
/**
* The number of each metric that is allowed to be allocated at any given
* time. If any element is zero, the default for that metric type is used.
* Memory for all metrics is allocated up-front at initialization. When all
* metrics of a given type are allocated, further requested metrics are not
* added and data is lost.
*/
TuningFork_MetricLimits max_num_metrics;
};
如果您在初始化时传递了来自帧速率 API 的 Swappy_injectTracer()
函数 (OpenGL、Vulkan),Tuning Fork 库会自动记录帧时间,而无需您显式调用滴答函数。这在演示应用程序中完成
void InitTf(JNIEnv* env, jobject activity) {
SwappyGL_init(env, activity);
swappy_enabled = SwappyGL_isEnabled();
TFSettings settings {};
if (swappy_enabled) {
settings.swappy_tracer_fn = &SwappyGL_injectTracer;
settings.swappy_version = Swappy_version();
}
...
}
销毁
TFErrorCode TuningFork_destroy();
您可以在关闭时调用此函数。此函数尝试在释放 Tuning Fork 库使用的任何内存之前,提交所有当前存储的直方图数据以供日后上传。
刷新
TFErrorCode TuningFork_flush();
此函数刷新已记录的直方图(例如,当游戏被发送到后台或前台时)。如果自上次上传以来,默认值为一分钟的最小上传周期尚未过去,它不会刷新数据。
设置保真度参数
TFErrorCode TuningFork_setFidelityParameters(const CProtobufSerialization* params);
此函数使用帧数据关联的当前保真度参数覆盖当前保真度参数。当玩家手动更改游戏的质量设置时,您应该调用此函数。
注释
TFErrorCode TuningFork_setCurrentAnnotation(const CProtobufSerialization* annotation);
此函数设置与后续滴答声关联的注释。如果解码注释时出错,它将返回 TFERROR_INVALID_ANNOTATION
,如果未出错,则返回 TFERROR_OK
。
每帧函数
TFErrorCode TuningFork_frameTick(TFInstrumentKey key);
此函数在与 key
和当前注释关联的直方图中记录上一次使用给定 key
进行的滴答声与当前时间之间的时间。
TFErrorCode TuningFork_frameDeltaTimeNanos(TFInstrumentKey key, TFDuration dt);
此函数在与 key
和当前注释关联的直方图中记录持续时间。
TFErrorCode TuningFork_startTrace(TFInstrumentKey key, TraceHandle* handle);
此函数将句柄设置为与给定 key
关联的跟踪句柄。
TFErrorCode TuningFork_endTrace(TraceHandle handle);
此函数在与用于的 key
和当前注释关联的直方图中记录自关联的 TuningFork_startTrace()
调用以来的时间间隔。
应用程序生命周期函数
typedef enum TuningFork_LifecycleState {
TUNINGFORK_STATE_UNINITIALIZED = 0,
TUNINGFORK_STATE_ONCREATE = 1,
TUNINGFORK_STATE_ONSTART = 2,
TUNINGFORK_STATE_ONSTOP = 3,
TUNINGFORK_STATE_ONDESTROY = 4,
} TuningFork_LifecycleState;
TFErrorCode TuningFork_reportLifecycleEvent(TuningForkLifecycleState state);
从游戏主 活动 的相应生命周期方法中调用此函数,并将相应的枚举值传递进去。通过记录游戏的生命周期事件,APT 可以更好地了解游戏何时可能崩溃或用户何时可能退出(例如,在长时间加载事件期间)。
高级函数
以下函数在 tuningfork_extra.h
中可用。
查找和加载 APK 中的文件
此函数从 APK 中的 assets/tuningfork
目录加载 fidelityParams
,文件名由您指定。fidelityParams
必须是 FidelityParams
消息的序列化形式。有关更多信息,请参阅 定义质量级别。
序列化对象的拥有权传递给调用方,调用方必须调用 CProtobufSerialization_Free
来释放任何持有的内存。
在单独的线程上下载保真度参数
激活下载线程以检索保真度参数。该线程会重试请求,直到下载参数或发生超时。下载的参数会保存在本地。当应用程序重新启动时,它会使用这些下载的参数,而不是默认参数。
保存和删除存储在设备上的保真度参数
此函数仅在服务器不可达时,在专家模式下使用从服务器下载的保真度参数时才需要。它要么覆盖要么删除(如果 fidelity_params
为空)在服务器不可达时使用的本地存储的文件。
Web 请求
该库对服务器端点进行以下类型的请求
- 在初始化时会发出
generateTuningParameters
请求。 - 在游戏过程中,会定期发出
uploadTelemetry
请求以将数据发送到服务器。 - 调试 APK 也可以发送
debugInfo
请求,该请求会通知调试服务器有关设置、默认保真度参数和dev_tuningfork.proto
结构的信息。
离线玩家
如果初始化时没有可用的连接,则该请求将尝试多次重新发送,每次尝试的延迟时间都会增加。
如果上传时没有连接,则上传将被缓存。您可以在初始化时通过传递一个 TFCache
对象来提供您自己的缓存机制。如果您没有提供自己的缓存,则上传将作为文件存储在临时存储中。