Flutter C++ 内存分配导致光栅线程卡顿 - Android NDK Dart FFI

问题描述

我有一个 Flutter 应用程序,它使用 Dart ffi 连接到我的自定义 C++ 音频后端。在那里我为我的音频缓冲区分配了大约 10MB 的总内存。每个缓冲区有 10MB / 84 的内存。我使用 84 音频播放器。这是 ffi 流程:

C++ 桥:

extern "C" __attribute__((visibility("default"))) __attribute__((used))
void *
loadMedia(char *filePath,int8_t *mediaLoadPointer,int64_t *currentPositionPtr,int8_t *mediaID) {
    LOGD("loadMedia %s",filePath);

    if (soundEngine == nullptr) {
        soundEngine = new SoundEngine();
    }

    return soundEngine->loadMedia(filePath,mediaLoadPointer,currentPositionPtr,mediaID);
}

在我的声音引擎中,我启动了一个 C++ 线程:

void loadMedia(){

    std::thread{startDecoderWorker,buffer,}.detach();
 }

void startDecoderWorker(float*buffer){
     buffer = new float[30000]; // 30000 might be wrong here,I entered a huge value to just showcase the problem,the calculation of 10MB / 84 code is redundant to the code
}

所以这是问题所在,我不知道为什么,但是当我使用 new 关键字分配内存时,即使在 C++ 线程中,也会出现光栅线程卡顿,我可以看到我的颤动 UI 卡顿了很多帧。这也出现在性能叠加中,因为它在 3 到 5 帧内全红,每帧大约需要 30 40 毫秒。在配置文件模式下测试。

我是这样得出这个结论的: 如果我立即从我的 startDecoderWorker 返回而不运行 new 内存分配代码,当我这样做时会有 0 jank。一切都很流畅 60fps,性能叠加没有显示红条。

以下是个人资料模式的一些截图:

enter image description here

enter image description here

enter image description here

解决

这不是因为内存分配,而是因为一旦我分配了内存,我的 84 个音频音频解码器就开始填充它们自己的缓冲区,正在解码的 84 个媒体似乎减慢了整个应用程序的速度,即使它们都有单独的线程(手机当然没有 84 核),因此会出现抖动。

解决方法

经过讨论(在问题的评论中),实际原因不是因为内存分配太慢,而是在于其他地方 - 如果分配很大,计算会很重。

详情请参考问题的评论和讨论;)