在Canvas上做一个众包项目 - 页 19

 

.

这是我承诺要发布的视频。图片质量很差,但这并不妨碍你看到反应的延迟。

事实上,终端的延迟更少。当录音机开着的时候,一切都会变得加倍缓慢。处理器的负载也更多。

所以,从这个视频中不可能得到一个完全客观的反应速度的概念,但它清楚地显示了窗口刷新率和窗口大小之间的模式。

(这就是为什么我做了几个不同尺寸的窗口)。

我想我已经找到了图像响应变慢的确切原因。它是 ColorToARGB()函数的 持续调用。在每个事件和每个像素上,我都调用这个函数。我没有计算一次颜色并随时使用它们,而是一直在重新计算它们。

我认为这就是问题的关键。

P.S. 我忘了补充,所有窗口的对象总数是35个。

 
Реter Konow:

.

这是我承诺要发布的视频。图片质量很差,但这并不妨碍你看到反应的延迟。

事实上,终端的延迟更少。当录音机开着的时候,一切都会变得加倍缓慢。处理器的负载也更多。

因此,从这个视频中不可能得到一个完全客观的反应速度的概念,但我可以清楚地看到窗口刷新率和窗口大小之间的规律。

(这就是为什么我做了几个不同尺寸的窗口)。

我想我已经找到了图像响应变慢的确切原因。它是 ColorToARGB()函数的 持续调用。在每个事件和每个像素上,我都调用这个函数。我没有计算一次颜色并随时使用它们,而是一直在重新计算它们。

我认为这才是重点。

P.S. 我忘了补充,所有窗口的对象总数是35个。

是否可以看一下来源?我为自己,为经验。
 
Vladimir Pastushak:
是否有可能看一下源代码?对我来说,对我的经验来说。
是的,在这个页面上,我已经发布了一个函数块,将所有这些窗口画在一起。https://www.mql5.com/ru/forum/92113/page16
Делаем краудсорсовый проект по Canvas
Делаем краудсорсовый проект по Canvas
  • www.mql5.com
Приветстсвую кодеров. Есть интересная задача сделать действительно что-то полезное, и думаю что краудсорс будет хорошим вариантом...
 
延迟反应的问题已经得到解决。溶液如下。

一个图像只创建一次。这是第一次需要花费最长的时间来绘制,因为图像由许多部分组成,而绘制每个部分都是对绘图函数的调用,每个函数都会循环浏览各个部分并初始化数组中的值。

我将解释问题出在哪里。

以前,在绘制图像的细节时,我在整个图像区域上做了一个循环,这就是造成延迟的原因。对于一个500×500像素的窗口,我不得不在每次重绘时重新绘制大约300个部分,这导致在每次重绘时,(500×500×300×绘制函数的数量)在循环中发生交互。事实证明,即使对计算机来说,这也需要时间。
解决办法是这样的:我不是在每个需要重绘图像中某个特定细节的事件中重新绘制图像,而是绘制一次图像,在下次重绘时,我使用ResourceReadImage() 将其返回到一个数组中。

然后我重绘该部分,不在整个图像上循环,但我通过一个特殊的公式计算出图像部分在图像阵列中的像素位置,并只重绘它。这样一来,就不会进行不必要的整合。此外,我还将绘图功能合并为一个,这也使该机制更加有效。





 
使用OpenCL来加快Canvas的渲染速度是否现实?
 
Timur Gatin:
用OpenCL加快Canvas的渲染速度是否现实?


是的,OCL具有并行处理的能力+对向量进行操作的能力--这加快了渲染/覆盖的过程。

在Mathemat的文章https://www.mql5.com/ru/articles/407,阅读更多关于使用向量的信息。

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


是的,OCL有并行处理的可能,也有对向量进行操作的可能--这加快了绘图/分层的过程。

在Mathemat的文章https://www.mql5.com/ru/articles/407,阅读更多关于使用向量的信息。

你有没有比较过CCanvas的Erase()和 OpenCl中的PixelSet() 循环的速度 ?理论上,只要有好的速度,你就可以在不缓存中间结果和其他复杂问题的情况下,做出笨拙的绘图代码。

顺便问一下,你是用这个公式混合层吗?


 

是的,公式来自维基百科,对于每个颜色成分: 结果=背景+(前景-背景)*Alpha。

顺便说一下,OCL中的Erase有一个问题。没有memset的类似物(与CUDA不同)。这就是为什么我现在不得不在主机中做Erase,并通过CLBufferWrite复制清理过的数组,这当然不比简单的Erase快。
另一方面,我试着为工作单位做一个任务数组,把1个点写进数组,但记不清速度了--似乎比之前的方法要慢一些。

在OCL 1.2中,有clEnqueueFillBuffer()可以做到这一点=>根据MQL语法,应该是CLBufferFill()

但这个包装器并没有实现(因为1.1版是移植的)。

 
Igor Volodin:

是的,公式来自维基百科,对于每个颜色成分: 结果=背景+(前景-背景)*Alpha。

顺便说一下,OCL中的Erase有一个问题。没有memset的类似物(与CUDA不同)。这就是为什么我现在不得不在主机中做Erase,并通过CLBufferWrite复制清理过的数组,这当然不比简单的Erase快。
另一方面,我试着为工作单位做一个任务数组,把1个点写进数组,但记不清速度了--似乎比之前的方法要慢一些。

在OCL 1.2中,有clEnqueueFillBuffer()可以做到这一点=>根据MQL语法,应该是CLBufferFill()

但这个包装器并没有实现(因为1.1版是移植的)。

在英文维基中,公式更加有趣,你可以混合两个半透明的层。这可以做出一个半透明的界面和其他的好处。
 
Timur Gatin:
在英国沧,配方更有趣,你可以混合两个半透明的层。可以做一个半透明的界面和其他漂亮的东西。

在我的情况下,我不需要这个,一切都能正确地混合。A层以下的任何东西都可以被认为是基材,即使B层在其上面,基材本身也会通过它来照亮。