10

私は手書き認識アプリを持っています - ユーザーが指で描くと、アプリは文字を認識します。認識エンジンは、最小限の優先度を持つワーカー スレッドで実行されますThread.MIN_PRIORITY。これは純粋に CPU/メモリ アルゴリズムであり、I/O は一切ありません。それでも、スレッドがアクティブに動作している場合、UI はかなり途切れ途切れになります。指のストロークが表示されるまでにかなりの遅延がかかります。また、タッチイベントが失われていることに気付きました。

それはまさにスレッド化が回避するのに役立つはずだったものではありませんか? UI スレッドが CPU 不足になるのはなぜですか? ワーカー スレッドを優先度の低いバックグラウンド スレッドとして扱うようにシステムを説得するにはどうすればよいでしょうか。

システムが (意図的に、または CPU 不足のために)invalidate()との間の遅延を導入しているようonDraw()です。どういうわけかその遅延を減らすことはできますか?

比較的古いハードウェアでのテスト - Android 2.1 を搭載した HTC Magic。

4

3 に答える 3

4

同じ問題があったので、スレッドを作成しました:

  1. 作業のチャンクを処理した後の Thread.yield()。

  2. 最小 500 ミリ秒の間隔で UI スレッドにポストされる限られた更新 (再描画が大幅に少なくなります)。

  3. ワーカーがデータの優先順位付けされたバケットで作業するようにしました。これは、ユーザーが現在操作しているビューの更新に焦点を当てています。

これで、UI 全体が非常に怠惰になりましたが、ラグはありません。

私のワーカーのスケジューリング メソッドは次のようになります (実際の作業は Process メソッドによって行われます)。

//--low priority
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

//--as long as there's more work to do, and not cancelled--
while (mPriorityBuffer.hasNext() && !isCancelled()) {

    //--get the work with highest priority--
    Work next = mPriorityBuffer.getNext();

    //--do work--
    Update u = mProcessor.process(next);

    // collect updates for main thread
    mUpdates.push(u);

    long timeNow = Calendar.getInstance().getTimeInMillis();
    if(timeNow - timeLast > 500){
        //--its been quite a while now, update ui--
        postUpdatesToMainThread();
        timeLast = timeNow;
    }

    //--let UI thread work on updates--
    Thread.yield();
}
于 2012-11-06T16:26:39.193 に答える
2

Thread.sleep(1) 文字認識方式のメインサイクルに追加してみる

@Override
public void run() {
  while (!recognited) {

    //do some script

    try {
      Thread.sleep(1);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

このスリープにより、仮想マシンは他のスレッドを少し早く頻繁に再開できます

于 2012-11-06T16:07:48.283 に答える
1

GUI スレッドがタッチ イベントであふれている可能性があります。その場合の解決策は、UI スレッドで数ミリ秒の待機を導入し、ワーカー スレッドをブーストすることです。詳細はこちら:

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

また、実際に動きがなかったり、動きが十分に重要でない場合など、処理しているデータが多すぎる可能性があります。

于 2012-11-06T16:19:17.160 に答える