android - Flutter C++ 内存分配导致光栅线程卡顿 - Android NDK Dart FFI
问题描述
我有一个颤振应用程序,用于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,性能叠加没有显示红条。
以下是个人资料模式的一些屏幕截图:
解决方案
经过讨论(在问题的评论中),实际原因不是因为内存分配太慢,而是在其他地方 - 如果分配很大,计算将会很重。
有关详细信息,请参阅问题的评论和讨论;)
推荐阅读
- r - 如何从一列创建多列,可能使用 dcast 或 tidyverse
- ios - 如何仅在 CGRect 中使用 Apple Vision 检测条形码?
- api - Github API:多个参数不起作用
- python - Keras_ocr - 无法识别_from_boxes
- ruby - API 返回错误:“重复实例,请使用不同的值重试。”
- angularjs - 使用 nodejs 8、angularjs、ionic3、cordova8 更新 cordova-android 6 到 9、cordova-ios 5 到 6
- git - 这种情况下最好的分支策略是什么?
- javascript - 有没有办法在 TypeScript 类中返回 express 实例?
- gremlin - 获取更多关于 Gremlin 遍历的数据而不仅仅是节点 ID?
- azure - 如何在没有/使用简单身份验证的情况下显示 Azure 监控仪表板?