Canvasでクラウドソーシングのプロジェクトを作る - ページ 32

 
Алексей Барбашин:

まさにその通りに作りました。標準ライブラリは、イベント転送の瞬間やその他が非常によくできているので、原則的にこれをベースにしました。アナトリーは、異なるクラスの要素ごとにグループ化を行い、標準的なものでは、すべてを1つの基本オブジェクトに還元しています。

...

彼の例では、キャンバス全体の再描画は非常に高速なので、細部まで描き込む必要はなく、キャンバス全体を一度に再描画すれば十分なので、ローカルエリアのデータをすべて保存する必要はないことを説明しています。
そんな簡単なものではありません。大きな(フルサイズの)表があり、その中の1つのセルの値が1秒間に20回変化すると想像してください。キャンバス全体を再描画した場合、プロセッサの負荷は最大で40%以上増加します。キャンバスの扱い方は絶対に間違っている。別々の要素を再描画する必要があります。そうしないと、テーブル、ガラス、およびさまざまなローカルアニメーションがプロセッサに負荷をかけ、他の機能の実行が遅くなります(それらが共通のスレッドにある場合)。
 
Реter Konow:
そんな簡単なものではありません。大きな(グラフ全体の)表を描いたとして、その中の1つのセルの値が1秒間に20回変化するとします。キャンバス全体を再描画した場合、プロセッサの負荷は最大で40%以上増加します。キャンバスの扱い方は絶対に間違っている。別々の要素を再描画する必要があります。そうしないと、テーブル、ガラス、および異なるローカルアニメーションがプロセッサに負荷をかけ、他の機能の実行が遅くなります(それらが共通のスレッドにある場合)。

ニコライのこれまでの実験は、その逆を証明している。キャンバスの中身を一気に再描画しているのですが、その様子がコードにはっきりと表れています。

でも、やはりローカルチェンジには賛成です。しかし、この方法には難点があり、私はまだ解決できていません。

 
Алексей Барбашин:

ニコライのこれまでの実験は、その逆を証明している。キャンバスの中身を一気に再描画しているのですが、その様子がコードにはっきりと表れています。

でも、やはりローカルチェンジには賛成です。しかし、この方法には、まだ解決していない困難があります。

私はニコライを友人だと思っています。彼はキャンバスを使った仕事で大きな高みに到達しましたが、まだ本格的な制御の実験はしていません。特にテーブルとガラスで。とりあえず、意識はしていない。

要は、こういうことです。キャンバスは、データの配列です。変更イベント時にデータを変更し、再保存する。配列がチャート空間のすべてのピクセルを含む場合、そのサイズ =チャートの高さ*幅と なります。配列内の画素値が局所的に変化した場合、配列全体をフルループしてすべての値をリセットする必要はありません。変更した領域でループを行い、値を設定し、ループを抜ける必要があります。そうでなければ、どう考えても、資源と時間の無駄です。

そして、この方法には多くの困難があります。主なものは、自分のキャンバスの上で、完全に機能するオブジェクトを自分で作り、それを見つけて加工することです。 インハウスのCCanvasはそれに適していません。それはあなたの要素を「見る」ことはできないだろうし、それを使って処理することもできない。そこには、そのような機能はありません。

 
Реter Konow:

私はニコライを友人だと思っています。彼はkanvasで高みを目指していますが、まだ本格的な制御の実験をしていません。特にテーブルとタンブラーで。とりあえず、意識はしていない。

要は、こういうことです。キャンバスは、データの配列です。変更イベント時にデータを変更し、再保存する。配列がチャート空間のすべてのピクセルを含む場合、そのサイズ =チャートの高さ*幅と なります。配列内の画素値が局所的に変化した場合、配列全体をフルループしてすべての値をリセットする必要はありません。変更した領域でループを行い、値を設定し、ループを抜ける必要があります。 そうでなければ、どう考えても、資源と時間の無駄です。

そして、この方法には多くの困難があります。主なものは、自分のキャンバスの上で、完全に機能するオブジェクトを自分で作り、それを見つけて加工することです。インハウスのCCanvasはそれに適していません。それはあなたのエレメントを「見る」ことはできないし、それを通してエレメントにアクセスすることもできないでしょう。そこには、そのような機能はありません。

私はこのことをよく理解していますし、よく承知しています。独自にオブジェクトクラスを作成し、すべて正常に動作しています。

 
Алексей Барбашин:

すべてよく理解し、自覚しています。オブジェクトクラスが作成され、すべて正常に動作しています。

この場合、表を作成 し、ローカルに(各セルごとに)更新する方法と、表全体を一括して更新する方法の2通りで確認することができます。

 

ニコライのアニメーションはリフレッシュレートが低いものが多いので、キャンバス全体を同時に再描画してもオーバーラップとして出てこないんです。しかし、リフレッシュレートを1秒間に5回まで上げると、CPUリソースの消費量が増加することがわかります。アニメーション全体を描き直す必要がある場合は仕方ありませんが、内部の小さなエリア1つだけなら、その1つだけで良いのです。

1秒間に5回という頻度自体は、値が非同期に変化するテーブルで発生する可能性があります。MT4で、テーブルをリソース経由でテスターに接続すると、このような状況が発生しました。そこでは、速度31ですべてのパラメータが高速に変化するため、テーブルの再描画を誤ると50%以上のCPU負荷が発生しました。要素のローカル再描画でも、完全に保存することはできませんでした。そこで思いついたのが、数値の表示速度を遅くすることでした。値そのものは自然な速度で変化しているのに、セルへの出力は数倍も頻度が低い。これで問題は解決した。

以下はその一例です。1000個のセルが25msの割合で値を変化させること。実際には、500msに1回程度セルの値が変わり、CPUの負荷は50%程度です。(MT4で、表が描かれています)。

https://www.mql5.com/ru/forum/293630/page160


テスターを使った例です。表は描画されるが、プロセッサの過負荷を軽減することはできない。:)(テスター速度31、セル更新フル(ピンスキップなし))。

https://www.mql5.com/ru/forum/293630/page148

 
Реter Konow:
そんな単純な話じゃないんです。大きな(チャート全体の)表があり、その中の1つのセルの値が1秒間に20回変化すると想像してください。キャンバス全体を再描画した場合、プロセッサの負荷は最大で40%以上増加します。キャンバスの扱い方は絶対に間違っている。別々の要素を再描画する必要があります。そうしないと、テーブル、ガラス、および異なるローカルアニメーションがプロセッサに負荷をかけ、他の機能の実行が遅くなります(それらが共通のスレッドにある場合)。

どこから数字を出しているのか、よくわからない。ニコライの完璧にシンプルな例を見てくださいhttps://www.mql5.com/ru/forum/227736/page44#comment_13445909。グラフサイズのキャンバス上に、複数のオブジェクトが生成され、グラフ上(キャンバス上)にドラッグ&ドロップすることができます。キャンバス全体を再描画します。速度低下は全くありません。

Canvas - это круто!
Canvas - это круто!
  • 2019.09.20
  • www.mql5.com
Поставил себе задачу: коротким кодом эффектно продемонстрировать возможности пользовательской графики через класс CCanvas...
 
Алексей Барбашин:

どこから数字を出しているのか、よくわからない。ニコライの完璧にシンプルな例を見てくださいhttps://www.mql5.com/ru/forum/227736/page44#comment_13445909。グラフサイズのキャンバス上に、複数のオブジェクトが生成され、グラフ上(キャンバス上)にドラッグ&ドロップすることができます。キャンバス全体を再描画します。 動作が遅くなることはありません。

上の例を見てください。

ハイファへのリンクを挿入しました。
 

ここでは、セルへの値の出力を遅くし、プロセッサの負荷を軽減する例を紹介します。


https://www.mql5.com/ru/forum/293630/page148

 
Алексей Барбашин:

どこから数字を出しているのか、よくわからない。ニコライの完璧にシンプルな例を見てくださいhttps://www.mql5.com/ru/forum/227736/page44#comment_13445909。グラフサイズのキャンバス上に、複数のオブジェクトが生成され、グラフ上(キャンバス上)にドラッグ&ドロップすることができます。キャンバス全体を再描画します。 速度低下は全くありません。

その例のリフレッシュレートは正常です。したがって、減速することはありません。