Flutter C++ 内存分配导致光栅线程卡顿 - Android NDK Dart FFI
Flutter C++ Memory allocation causes jank on raster thread - 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++ 线程中,flutters raster thread janks 我可以看到我的 flutter UI janks很多帧。这也出现在性能叠加层中,因为它在 3 到 5 帧内全变红,每帧大约需要 30 40 毫秒。在配置文件模式下测试。
我是这样得出结论的:
如果我在没有 运行 new
内存分配代码的情况下立即从 startDecoderWorker
return 执行此操作,则出现 0 卡顿。一切都很流畅 60fps,性能叠加不显示红色条。
以下是个人资料模式的一些屏幕截图:
经过讨论(在问题的评论中),真正的原因不是因为内存分配太慢,而是在其他地方 - 如果分配很大,计算量会很重
详情请参考问题的评论和讨论;)
我有一个 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++ 线程中,flutters raster thread janks 我可以看到我的 flutter UI janks很多帧。这也出现在性能叠加层中,因为它在 3 到 5 帧内全变红,每帧大约需要 30 40 毫秒。在配置文件模式下测试。
我是这样得出结论的:
如果我在没有 运行 new
内存分配代码的情况下立即从 startDecoderWorker
return 执行此操作,则出现 0 卡顿。一切都很流畅 60fps,性能叠加不显示红色条。
以下是个人资料模式的一些屏幕截图:
经过讨论(在问题的评论中),真正的原因不是因为内存分配太慢,而是在其他地方 - 如果分配很大,计算量会很重
详情请参考问题的评论和讨论;)