Fare un progetto in crowdsourcing su Canvas - pagina 32

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

È esattamente così che l'ho costruito. Fondamentalmente, ho preso la libreria standard come base, perché ha momenti di trasferimento di eventi molto ben elaborati e alcune altre cose. Anatoly crea raggruppamenti per ogni diversa classe di elementi, in quello standard tutto è ridotto a un oggetto base.

...

Nei suoi esempi Nikolay mostra che non è necessario preoccuparsi di memorizzare tutti i dati delle aree locali perché la ridipintura dell'intera tela è così veloce, che non è necessario scendere nei dettagli ed è sufficiente ridisegnare l'intera tela in una volta sola.
Non è così semplice. Immaginate di avere una grande tabella (a grandezza naturale) dove una delle celle cambia valore 20 volte al secondo. Se si ridisegna l'intera tela, il carico sul processore aumenterà fino al 40% o più. Un modo assolutamente sbagliato di lavorare con la tela. È necessario ridisegnare elementi separati, altrimenti le tabelle, il vetro e le diverse animazioni locali sovraccaricheranno il processore e rallenteranno l'esecuzione di altre funzioni (se sono in un thread comune).
 
Реter Konow:
Non è così semplice. Immaginate di aver disegnato una grande tabella (un intero grafico), dove una delle celle cambia valore 20 volte al secondo. Se si ridisegna l'intera tela, il carico sul processore aumenterà fino al 40% o più. Un modo assolutamente sbagliato di lavorare con una tela. È necessario ridisegnare elementi separati, altrimenti le tabelle, il vetro e le diverse animazioni locali sovraccaricheranno il processore e rallenteranno l'esecuzione di altre funzioni (se sono in un thread comune).

Gli esperimenti di Nikolay finora dimostrano il contrario. Ridisegna tutto il contenuto della tela in una volta sola, ed è chiaramente visibile nel codice.

Ma sono ancora a favore dei cambiamenti locali. Ma questo approccio ha le sue difficoltà, che non ho ancora risolto.

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

Gli esperimenti di Nikolay finora dimostrano il contrario. Ridisegna tutto il contenuto della tela in una volta sola, ed è chiaramente visibile nel codice.

Ma sono ancora a favore dei cambiamenti locali. Ma questo approccio ha le sue difficoltà che non ho ancora risolto.

Considero Nikolay un mio amico e ha raggiunto alcune grandi altezze nel lavoro con la tela, ma ancora non ha fatto esperimenti completi con i controlli. In particolare con tavoli e vetri. In ogni caso, non ne sono a conoscenza.

La linea di fondo è questa: Un canvas è un array di dati. I dati vengono cambiati e salvati di nuovo agli eventi di cambiamento. Se l'array include tutti i pixel dello spazio del grafico - allora la sua dimensione = altezza*larghezza del grafico. Se c'è un cambiamento locale dei valori dei pixel all'interno dell'array, non c'è bisogno di fare un ciclo completo su tutto l'array e resettare tutti i valori. Dovete fare un ciclo sull'area modificata, impostare i valori e uscire dal ciclo. Altrimenti, in qualunque modo lo si tagli, è uno spreco di risorse e di tempo.

E ci sono molte difficoltà con questo approccio. Il principale è quello di creare i propri oggetti completamente funzionali, trovarli ed elaborarli sulla propria tela. CCanvas non è adatto per questo. Non "vedrebbe" i vostri elementi e non potete accedervi tramite esso. Non ha questa funzionalità.

 
Реter Konow:

Considero Nikolai un mio amico, e ha raggiunto grandi altezze con la tela, ma ancora non ha fatto esperimenti completi con i controlli. In particolare con tavoli e un bicchiere. In ogni caso, non ne sono a conoscenza.

La linea di fondo è questa: Un canvas è un array di dati. I dati vengono cambiati e salvati di nuovo agli eventi di cambiamento. Se l'array include tutti i pixel dello spazio del grafico - allora la sua dimensione = altezza*larghezza del grafico. Se c'è un cambiamento locale dei valori dei pixel all'interno dell'array, non c'è bisogno di fare un ciclo completo su tutto l'array e resettare tutti i valori. Dovete fare un ciclo sull'area modificata, impostare i valori e uscire dal ciclo. Altrimenti, in qualunque modo lo si tagli, è uno spreco di risorse e di tempo.

E ci sono molte difficoltà con questo approccio. Il principale è quello di creare i propri oggetti completamente funzionali, trovarli ed elaborarli sulla propria tela. CCanvas non è adatto per questo. Non "vedrebbe" i vostri elementi e non potete accedervi tramite esso. Non c'è una tale funzionalità.

Capisco molto bene tutto questo e ne sono ben consapevole. Ho creato le mie classi di oggetti e tutto funziona bene.

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

Capisco molto bene tutto questo e ne sono molto consapevole. Ho creato le mie classi di oggetti e tutto funziona bene.

In questo caso, potete controllare creando una tabella e aggiornandola in due modi - localmente (ogni cella separatamente) e tutta in una volta l'intera tabella.

 

Le animazioni di Nikolai hanno per lo più una bassa frequenza di aggiornamento, e quindi, ridisegnare simultaneamente l'intera tela non risulta come una sovrapposizione. Ma se si aumenta la frequenza di aggiornamento a 5 volte al secondo, si può notare un aumento del consumo di risorse della CPU. Se avete bisogno di ridisegnare l'intera animazione - nessuna via d'uscita, ma se una singola, piccola area interna - meglio solo quella.

La frequenza stessa - 5 volte al secondo - può verificarsi in una tabella dove i valori cambiano in modo asincrono. Questa situazione si è verificata su MT4, quando ho collegato la tabella al tester tramite risorse. Lì, alla velocità 31 tutti i parametri cambiano così velocemente che un ridisegno errato della tabella ha causato un carico della CPU del 50% o più. Anche il ridisegno locale degli elementi non l'ha salvato completamente. Mi è venuta l'idea di rallentare la velocità di visualizzazione dei valori. I valori stessi cambiavano ad un ritmo naturale, ma venivano trasmessi alle celle diverse volte meno frequentemente. Questo ha risolto il problema.

Ecco un esempio. 1000 celle dovrebbero cambiare i valori ad un ritmo di 25ms. In realtà, le celle cambiano i valori circa una volta ogni 500ms e il carico della CPU è circa il 50%. (Questo è MT4 e la tabella è disegnata).

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


Ecco un esempio con il tester. La tabella è disegnata, ma non salva il processore dal sovraccarico. :) (velocità del tester 31, aggiornamento delle celle completo (nessun pin che salta)).

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

 
Реter Konow:
Non è così semplice. Immaginate di avere una grande (per tutto il grafico) tabella in cui una delle celle cambia valore 20 volte al secondo. Se si ridisegna l'intera tela, il carico sul processore aumenterà fino al 40% o più. Un modo assolutamente sbagliato di lavorare con una tela. È necessario ridisegnare elementi separati, altrimenti le tabelle, il vetro e le diverse animazioni locali sovraccaricheranno il processore e rallenteranno l'esecuzione di altre funzioni (se sono in un thread comune).

Non so bene da dove prendete le vostre cifre. Guarda l'esempio perfettamente semplice di Nikolai https://www.mql5.com/ru/forum/227736/page44#comment_13445909. Su un kanvas delle dimensioni di un grafico, vengono generati diversi oggetti che possono essere trascinati sul grafico (sul kanvas). L'intero kanvas viene ridisegnato. Non c'è nessun rallentamento.

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

Non so bene da dove prendete le vostre cifre. Guarda l'esempio perfettamente semplice di Nikolai https://www.mql5.com/ru/forum/227736/page44#comment_13445909. Su un kanvas delle dimensioni di un grafico, vengono generati diversi oggetti che possono essere trascinati sul grafico (sul kanvas). L'intero kanvas viene ridisegnato. Non c'è nessun rallentamento.

Guardate gli esempi qui sopra.

Inseriti collegamenti alle ife.
 

Ecco un esempio di rallentamento dell'uscita dei valori nelle celle e di riduzione del carico sul processore:


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

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

Non so bene da dove prendete le vostre cifre. Guarda l'esempio perfettamente semplice di Nikolai https://www.mql5.com/ru/forum/227736/page44#comment_13445909. Su un kanvas delle dimensioni di un grafico, vengono generati diversi oggetti che possono essere trascinati sul grafico (sul kanvas). L'intero kanvas viene ridisegnato. Non c'è nessun rallentamento.

La frequenza di aggiornamento in quell'esempio è normale. Pertanto, non c'è nessun rallentamento.