在 TextToSpeech 的 ui 线程中表现不佳

Bad performance in the ui thread which TextToSpeech

我的应用录制视频并同时使用 TextToSpeech->android.speech.tts.TextToSpeech.speak()。

如果我 运行 在 1.5 GHz 的 4 处理器等高端设备中工作正常。但是如果我在 2 处理器 1.1 ghz 设备中使用 ui 线程运行非常慢,冻结 2-6 秒。

我知道问题出在 TextToSpeech 中,因为如果我不使用它并录制视频,ui 线程在低端设备中运行非常流畅。如果我使用 TextToSpeech + 录制视频 ui 线程不工作并且语音冻结 1-2 段。

有什么方法可以提高 TextToSpeech.speak() 的性能吗?

您同时使用文字转语音和视频录制吗?你对它的缓慢感到惊讶吗?这两者都需要大量的 CPU 资源。有些事情只需要处理能力。尽量不要同时使用它们,你会得到更好的结果。

如果您需要同时使用它们 - 请先尝试使用 synthesizeToFile 将声音片段写入文件,然后在录制时播放声音片段。这样您就不会在录音的同时尝试生成音素。

如果你在说 'processors' 时指的是 'Cores'?看起来你正在做的活动应该 运行 在 3 个不同的线程上。

主线程应该总是空闲的。尽量不要让它陷入困境……永远!

扩展 AsyncTask class。 AsyncTask 将允许你做一些需要很长时间的事情,而不会阻塞主线程。

因为这都是在虚拟机(准确地说是 Dalvik)上 运行,我们必须假设线程也是虚拟的。这意味着如果您 运行 两个内核上的 3 个线程,虚拟机将决定哪些线程获得处理器周期,有时这意味着共享内核。

我想说的是,如果您只打算一次做两件繁重的事情,对于低端设备,您可以使用视频主线程和 TextToSpeech 的第二个线程来实现。这并不理想,因为它可能会阻塞主线程。但由于视频是两者中更流畅的一个,它将成为主 UI 线程上 运行ning 的首选候选者。

理想情况下,您至少需要三个线程,而主 UI 线程基本畅通无阻。您可以轮询两个线程的结果以检测是否完成。

如果您碰巧有 4 个内核,那么创建三个线程应该可以在可用内核上获得更多的分布式性能。

一些帮助您前进的文档: Android Multithreading - a Qualcomm article, 和 Android: AsyncTask