問題タブ [heavy-computation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 負荷の高い JavaScript 計算ブロック
私は (JavaScript/jQuery で) 重い計算をします。問題は、これらの計算が UI スレッドをブロックしており、これを回避する方法を (試してみて) 見つけられないことです。
いくつかの要件:
- webWorkers を使用できません
- 計算はクライアント側で行う必要があります (サーバー側で行うために AJAX 呼び出しを行うことはできません)
私は Android プログラマーなので、Java でそれを行う方法 (スレッドの起動、計算の実行、UI スレッドへのデータの送信) を知っているので、ここで同じことをしようとしています。
したがって、これらの重い計算では、アクティブなインスタンスを 1 つしか持つことができません (終了する前にこれを再度起動できないことをユーザーに通知するために GIF を作成します)。したがって、複数の呼び出しを管理する必要はありません (最後に終了し、新しく開始します)。
コードは次のとおりです。
私はデータをソートしています(そして、モバイル用のサーバーからのデータのリロードを避けるために、サーバー側でこれを行うことができないのです)。
関数内の配列をコピー(完全コピー、参照なし)しようとしました。データを含む初期変数は、関数内にないため、UI スレッド上にあり、それにアクセスすると思ったからです。関数は UI スレッドを呼び出します。=>動作しません。(だから私は間違っている)。
setTimout( {computations}, 0)ご覧のとおり、計算を開始しようとしましたが、これは、他のスタックオーバーフローの同様の質問で多くの時間を目にする解決策でした =>も機能しません。
私は基本的な JavaScript 環境で実行しています。私が使用する唯一のライブラリは jQuery です。
それで、この計算を他のスレッド(またはそのようなもの)で強制的に機能させる方法、またはよりグローバルにUIスレッドをブロックしない方法はありますか?
android - 重い計算をして、いくつかのメソッドを処理する方法は?
私のアプリでは、gpx ファイルと kml ファイルをインポートして、地図上にトラックとウェイポイントを表示します。この操作には、約 5 つのメソッドを使用します。exfilechoser でいくつかの長い gpx/kml トラックをインポートしようとしない限り、すべて正常に動作します。画面が数秒間真っ暗になり、logcat には次のように表示されます: スキップされたフレーム (> 600)。これらの UI の計算を取得するにはどうすればよいですか? または、約 5 つのメソッドで AsyncTask を使用するにはどうすればよいですか? これは可能ですか?
python - トレーニング済みニューラル ネットワークの保存と使用
時系列を予測するニューラル ネットワークを開発しようとしています。
私が理解している限り、トレーニング セットでニューラル ネットワークをトレーニングし、テスト セットで検証しています。
結果に満足したら、ニューラル ネットワークを使用して新しい値を予測できます。ニューラル ネットワーク自体は基本的に、トレーニング セットを使用して調整したすべての重みになります。
これは正しいです?
その場合、ネットワークを 1 回だけトレーニングしてから、ネットワーク (重み) を使用して将来の値を予測する必要があります。通常、ネットワーク全体の再計算をどのように回避しますか? すべての重みをデータベースなどに保存して、再度トレーニングすることなくいつでもアクセスできるようにする必要がありますか?
私の理解が正しければ、専用のコンピューター (スーパーコンピューターなど) で大量の計算を行い、Web サーバー、iPhone アプリなどでネットワークを使用することでメリットが得られますが、保存方法がわかりません。それ。
android - Android ヘビー レンダリングのベスト プラクティスとは
質問
- Android ビューでの負荷の高いレンダリングのベスト プラクティスは何ですか?
- 提案されたアプローチは正しい方向を指していますか?
- 代替手段は何ですか?
説明
私の Android アプリはスクロールしheavy rendered contentます。1 つの画面のレンダリングには最大 500 ミリ秒かかる場合があります。最終的な画像は、ユーザーに表示する必要があります。
Heavy rendering指でドラッグするだけで、1 秒間に複数回 (最大 20 回) トリガーできます。
一般に、最後の呼び出しのみが重要です。中間の未処理のコールはドロップできます。ただし、中間呼び出しが処理された場合は、次/最後の呼び出しがレンダリングされている間に結果をユーザーに表示することは理にかなっています。
明らかheavy renderingに、メイン スレッドに配置すると、UI がフリーズし、ユーザー エクスペリエンスが低下します。
現在の実装
考え
重いレンダリングと「最後の呼び出しが重要」の要件により、別のスレッドとRxJava Flowable.
アイデアは、2 つのビットマップを持つことです。
intermediate bitmap-スレッドで使用しheavy rendering、絵を描くのに必要なだけ時間をかけてくださいfinal bitmap- アプリが onDraw 関数を呼び出している場合、最終的な画像を保存してユーザーに表示するために使用します
手順:
- 処理がトリガーされた後、呼び出しはバッファリングされ、最後に利用可能な呼び出しのみが処理されます
- レンダリングが実行されます
intermediate bitmap(これは長いプロセスです)。 - レンダリングが終了すると、
intermediate bitmapに転送されますfinal bitmap(これは迅速なはずです)。 final bitmapアプリが画面を更新したいときはいつでも画面に描画されます(これも迅速なはずです)。synchronizedちらつきを防ぐには、手順 3 と 4 を実行する必要があります。
スキーマ
回路図は次のようになります。
コード
技術的には、次のように実行できます (これも概略図であり、一部の詳細は省略されています)。
問題
一般的には機能しますが、完全ではありません。
- レンダリングと出力中間->最終の両方がメインスレッドに配置されている場合、レンダリング時に画面がフリーズします。
- 出力中間->最終のみがメイン スレッドに配置されると、画面がちらつきます。
- レンダリングと出力中間->最終の両方が計算スレッドに配置される場合、レンダリング プロセス中に画面の一部のみが表示されます。
アップデート:
このコメントは私を大いに助けてくれました: https://stackoverflow.com/a/57610119/10475643
この行が小競り合い全体を引き起こしたようです。
ハードウェア アクセラレーションPorterDuff.Mode.CLEARではうまく動作しないためです。これにより、ちらつきや部分的な画面出力が発生しました。最後に両方をスレッドに配置しました。ハードウェア アクセラレーションを削除またはオフにすると、ちらつきがなくなりました。drawBitmapdrawColor