17

アニメーション化されたインジケーター/スピナー GIF の表示と非表示は、アクションが機能し、アクションが完了するのを待っている間に何かが発生していることをユーザーに示す良い方法です。たとえば、アクションがサーバーからデータをロードする必要がある場合などです。 ) AJAX 経由。

私の問題は、速度低下の原因がプロセッサを集中的に使用する機能である場合、gif がフリーズすることです。

ほとんどのブラウザでは、プロセッサを大量に消費する関数が実行されている間、GIF のアニメーションが停止します。ユーザーには、実際には機能しているのに、何かがクラッシュまたは誤動作したように見えます。

JSBIN の例

注: [これは遅い] ボタンを押すと、プロセッサがしばらく拘束されます。私の場合は約 10 秒ですが、PC の仕様によって異なります。HTMLの「data-reps」属性を使用して、これをどの程度行うかを変更できます。

ここに画像の説明を入力

  • 予想:クリックすると、アニメーションが実行されます。プロセスが終了すると、テキストが変更されます (通常はインジケーターも非表示にしますが、回転させたままにしておくと、例がより明確になります)。
  • 実際の結果:アニメーションの実行が開始され、プロセスが終了するまでフリーズします。これは、何かが壊れているような印象を与えます (突然予期せず完了するまで)。

JS がプロセッサをビジー状態にしている場合にフリーズしないプロセスが実行中であることを示す方法はありますか? 何かをアニメーション化する方法がない場合は、静的なテキスト メッセージを表示してから非表示にする方法に頼りますLoading...


最適化によって問題を回避するのではなく、プロセッサを集中的に使用するコードを使用している理由を誰かが疑問に思っている場合: それは必然的に複雑なレンダリングがたくさんあるためです。コードは非常に効率的ですが、実行内容が複雑であるため、常にプロセッサに負荷がかかります。ほんの数秒しかかかりませんが、それはユーザーを苛立たせるのに十分な長さであり、インジケーターが UX に良いことを示すために長い時間をさかのぼる多くの研究があります。


プロセッサを大量に使用する関数の gif スピナーに関連する 2 つ目の問題は、1 つの同期セット内のすべてのコードが実行されるまで、スピナーが実際には表示されないことです。つまり、通常、スピナーを非表示にするまでスピナーは表示されません。

  • JSBIN の例
  • ここで見つけた簡単な修正の 1 つ (上記の他の例で使用) は、インジケーターを表示した後にすべてをsetTimeout( function(){ ... },50);非常に短い間隔でラップして、非同期にすることです。これは機能しますが (上記の最初の例を参照)、あまりきれいではありません。もっと良い方法があるはずです。

私が気付いていないプロセッサ集約型の読み込みのインジケータには、標準的なアプローチが必要だと確信しています-または、単にLoading...テキストを使用するのが普通setTimeoutですか? 私の検索では何も見つかりませんでした。似たような問題について 6 つまたは 7 つの質問を読みましたが、それらはすべて無関係であることが判明しました。


編集コメントにいくつかの素晴らしい提案があります。ここに、私の正確な問題の詳細をいくつか示します。

  • 複雑なプロセスには、大きな JSON データ ファイルの処理 (ファイルのロードのメモリ内での JS データ操作操作など) と、複雑で詳細なズーム可能な世界地図を含む SVG の視覚化のレンダリング (Raphael.js による) が含まれます。 JSON からのデータ処理。そのため、DOM 操作が必要なものもあれば、そうでないものもあります。
  • 残念ながら IE8 をサポートする必要がありますが必要に応じて、IE8 / IE9 ユーザーにLoading...テキストのような最小限のフォールバックを提供し、他のすべての人に最新のものを提供できます。
4

2 に答える 2

7

プロパティを変更するのではなく、変換を使用してアニメーションが実装されている場合、最新のブラウザーは UI スレッドとは無関係に CSS アニメーションを実行するようになりました。これに関する記事はhttp://www.phpied.com/css-animations-off-the-ui-thread/にあります。

たとえば、http://projects.lukehaas.me/css-loaders/ にある一部の CSS スピナーは変換を使用して実装されており、UI スレッドがビジー状態の場合 (たとえば、そのページの最後のスピナー) にはフリーズしません。

于 2015-11-21T01:24:44.527 に答える
2

私は過去に同様の問題を抱えていました。最終的には、最適化するか、ユーザーのアクションに対応する小さなチャックで作業を行うことで修正されました。あなたの場合、ズームレベルが異なると、異なるレンダリングアルゴリズムがトリガーされます。ユーザーが見ることができるものだけを処理します (さらに、おそらくバッファー マージンも)。

クロスブラウザになる唯一の簡単な回避策は、setTimeout を使用して ui スレッドに実行の機会を与えることだと思います。作業を一連の操作にまとめ、いくつかの setTimeout 呼び出しを使用してそれらを連鎖させます。これにより、合計処理時間が遅くなりますが、少なくともユーザーにはフィードバックが提供されます。明らかに、この提案では、処理を簡単に切り離すことができる必要があります。その場合は、UX を改善するためにプログレス バーを追加することも検討できます。

于 2013-12-19T20:26:04.943 に答える