Fare un progetto in crowdsourcing su Canvas - pagina 19

 

.

Ecco il video che ho promesso di pubblicare. La qualità dell'immagine è scarsa, ma non impedisce di vedere i ritardi di risposta.

In effetti, c'è meno ritardo nel terminale. Quando il registratore è acceso, tutto è due volte più lento. Anche il processore carica molto di più.

Quindi, non è possibile avere un'idea completamente oggettiva della velocità di reazione da questo video, ma mostra chiaramente un modello tra la frequenza di aggiornamento della finestra e la sua dimensione.

(Ecco perché ho fatto diverse finestre di diverse dimensioni).

Penso di aver trovato la ragione esatta del rallentamento della risposta dell'immagine. È la chiamata costante della funzione ColorToARGB(). Ad ogni evento e ad ogni pixel chiamo questa funzione. Invece di calcolare i colori una volta e usarli già pronti, li ricalcolo continuamente.

Credo che questo sia il punto.

P.S. Ho dimenticato di aggiungere che il numero totale di oggetti di tutte le finestre è 35.

 
Реter Konow:

.

Ecco il video che ho promesso di pubblicare. La qualità dell'immagine è scarsa, ma non impedisce di vedere i ritardi di risposta.

In effetti, c'è meno ritardo nel terminale. Quando il registratore è acceso, tutto è due volte più lento. Anche il processore carica molto di più.

Pertanto, non è possibile avere un'idea completamente oggettiva della velocità di reazione da questo video, ma posso vedere chiaramente un modello tra la frequenza di aggiornamento della finestra e la dimensione della finestra.

(Ecco perché ho fatto diverse finestre di diverse dimensioni).

Penso di aver trovato la ragione esatta del rallentamento della risposta dell'immagine. È la chiamata costante della funzione ColorToARGB(). Ad ogni evento e ad ogni pixel chiamo questa funzione. Invece di calcolare i colori una volta e usarli già pronti, li ricalcolo continuamente.

Credo che questo sia il punto.

P.S. Ho dimenticato di aggiungere che il numero totale di oggetti di tutte le finestre è 35.

È possibile guardare le fonti? Per me, per me stesso, per l'esperienza.
 
Vladimir Pastushak:
È possibile dare un'occhiata al codice sorgente? Per me, per la mia esperienza.
Sì, in questa pagina ho pubblicato un blocco di funzioni che disegnano tutte queste finestre insieme. https://www.mql5.com/ru/forum/92113/page16
Делаем краудсорсовый проект по Canvas
Делаем краудсорсовый проект по Canvas
  • www.mql5.com
Приветстсвую кодеров. Есть интересная задача сделать действительно что-то полезное, и думаю что краудсорс будет хорошим вариантом...
 
Il problema delle reazioni ritardate è stato risolto. La soluzione era la seguente:

Un'immagine viene creata una volta sola. Questa è la prima volta che ci vuole più tempo per disegnarla, perché l'immagine consiste di molte parti, e disegnare ogni parte è una chiamata alle funzioni di disegno, ognuna delle quali fa un loop sulla parte e inizializza i valori nell'array.

Vi spiegherò qual era il problema:

Prima, quando disegnavo i dettagli di un'immagine, facevo un ciclo su tutta l'area dell'immagine ed è questo che creava il ritardo. Per una finestra di 500×500 pixel, dovevo ridisegnare circa 300 parti per ogni riverniciatura, il che si traduceva in (500×500×300×numero di funzioni di disegno) interazioni in cicli in ogni riverniciatura. Questo richiede tempo anche per un computer.
La soluzione è stata questa: invece di ridisegnare l'immagine su ogni evento che richiede la ridipintura di un particolare dettaglio all'interno dell'immagine, disegno l'immagine una volta, e alle prossime ridipinture la restituisco in un array usando ResourceReadImage().

Poi ridisegno la parte senza fare il loop su tutta l'immagine, ma calcolo la posizione dei pixel della parte dell'immagine nella matrice dell'immagine con una formula speciale e ridisegno solo quella. In questo modo, non si fa un'integrazione inutile. Inoltre, ho unito le funzioni di disegno in una sola, il che ha anche reso il meccanismo più efficiente.





 
È realistico accelerare il rendering in Canvas usando OpenCL?
 
Timur Gatin:
È realistico accelerare il rendering in Canvas con OpenCL?


Sì. OCL ha la capacità di parallelizzare l'elaborazione + la capacità di operare sui vettori - questo accelera il processo di rendering/sovrapposizione.

Scopri di più sull'uso dei vettori nell'articolo di Mathemat https://www.mql5.com/ru/articles/407

OpenCL: от наивного кодирования - к более осмысленному
OpenCL: от наивного кодирования - к более осмысленному
  • 2012.06.05
  • Sceptic Philozoff
  • www.mql5.com
В данной статье продемонстрированы некоторые возможности оптимизации, открывающиеся при хотя бы поверхностном учете особенностей "железа", на котором исполняется кернел. Полученные цифры весьма далеки от предельных, но даже они показывают, что при том наборе возможностей, который имеется здесь и сейчас (OpenCL API в реализации разработчиков терминала не позволяет контролировать некоторые важные для оптимизации параметры - - в частности, размер локальной группы), выигрыш в производительности в сравнении с исполнением хостовой программы очень существенен.
 
Igor Volodin:


Sì. OCL ha la possibilità di parallelizzare l'elaborazione + la possibilità di operare con i vettori - questo velocizza il processo di disegno/layering.

Leggi di più sull'uso dei vettori nell'articolo di Mathemat https://www.mql5.com/ru/articles/407

Avete confrontato la velocità di Erase() da CCanvas e il ciclo PixelSet() fatto in OpenCl? In teoria, con una buona accelerazione, si può fare del codice di disegno stupido senza cache dei risultati intermedi e altre complicazioni.

A proposito, mischiate gli strati usando questa formula?


 

Sì, la formula è da wikipedia, per ogni componente di colore: Risultato = Sfondo + (Primo piano - Sfondo) * Alfa;

A proposito, c'è un problema con Erase in OCL. Non c'è un analogo di memset (a differenza di CUDA). Questo è il motivo per cui ora devo fare Erase nell'host e copiare l'array pulito tramite CLBufferWrite, che certamente non è più veloce della semplice Erase.
D'altra parte, ho provato a fare un array di compiti per le unità di lavoro scrivendo 1 punto nell'array ma non riesco a ricordare la velocità - sembrava essere più lento del metodo precedente.

E in OCL 1.2 c'èclEnqueueFillBuffer() che lo fa => secondo la sintassi MQL ci dovrebbe essere CLBufferFill()

Ma questo wrapper non è implementato (poiché la versione 1.1 è portata).

 
Igor Volodin:

Sì, la formula è da wikipedia, per ogni componente di colore: Risultato = Sfondo + (Primo piano - Sfondo) * Alfa;

A proposito, c'è un problema con Erase in OCL. Non c'è un analogo di memset (a differenza di CUDA). Questo è il motivo per cui ora devo fare Erase nell'host e copiare l'array pulito tramite CLBufferWrite, che certamente non è più veloce della semplice Erase.
D'altra parte, ho provato a fare un array di compiti per le unità di lavoro scrivendo 1 punto nell'array ma non riesco a ricordare la velocità - sembrava essere più lento del metodo precedente.

E in OCL 1.2 c'èclEnqueueFillBuffer() che lo fa => secondo la sintassi MQL ci dovrebbe essere CLBufferFill()

Ma questo wrapper non è implementato (poiché la versione 1.1 è portata).

Nella wiki inglese, la formula è più interessante, si possono mescolare due strati semitrasparenti. Questo può fare un'interfaccia semi-trasparente e altre carinerie.
 
Timur Gatin:
Nella vittima inglese, la formula è più interessante, si possono mescolare due strati traslucidi. È possibile fare un'interfaccia traslucida e altre cose carine.

Non ne ho avuto bisogno nel mio caso, tutto si fonde correttamente. Tutto ciò che sta sotto lo strato A può essere considerato il substrato, anche se lo strato B è sopra di esso, attraverso il quale il substrato stesso traspare.