В данной статье продемонстрированы некоторые возможности оптимизации, открывающиеся при хотя бы поверхностном учете особенностей "железа", на котором исполняется кернел. Полученные цифры весьма далеки от предельных, но даже они показывают, что при том наборе возможностей, который имеется здесь и сейчас (OpenCL API в реализации разработчиков терминала не позволяет контролировать некоторые важные для оптимизации параметры - - в частности, размер локальной группы), выигрыш в производительности в сравнении с исполнением хостовой программы очень существенен.
.
这是我承诺要发布的视频。图片质量很差,但这并不妨碍你看到反应的延迟。
事实上,终端的延迟更少。当录音机开着的时候,一切都会变得加倍缓慢。处理器的负载也更多。
所以,从这个视频中不可能得到一个完全客观的反应速度的概念,但它清楚地显示了窗口刷新率和窗口大小之间的模式。
(这就是为什么我做了几个不同尺寸的窗口)。
我想我已经找到了图像响应变慢的确切原因。它是对 ColorToARGB()函数的 持续调用。在每个事件和每个像素上,我都调用这个函数。我没有计算一次颜色并随时使用它们,而是一直在重新计算它们。
我认为这就是问题的关键。
P.S. 我忘了补充,所有窗口的对象总数是35个。
.
这是我承诺要发布的视频。图片质量很差,但这并不妨碍你看到反应的延迟。
事实上,终端的延迟更少。当录音机开着的时候,一切都会变得加倍缓慢。处理器的负载也更多。
因此,从这个视频中不可能得到一个完全客观的反应速度的概念,但我可以清楚地看到窗口刷新率和窗口大小之间的规律。
(这就是为什么我做了几个不同尺寸的窗口)。
我想我已经找到了图像响应变慢的确切原因。它是对 ColorToARGB()函数的 持续调用。在每个事件和每个像素上,我都调用这个函数。我没有计算一次颜色并随时使用它们,而是一直在重新计算它们。
我认为这才是重点。
P.S. 我忘了补充,所有窗口的对象总数是35个。
是否有可能看一下源代码?对我来说,对我的经验来说。
用OpenCL加快Canvas的渲染速度是否现实?
是的,OCL具有并行处理的能力+对向量进行操作的能力--这加快了渲染/覆盖的过程。
在Mathemat的文章https://www.mql5.com/ru/articles/407,阅读更多关于使用向量的信息。
是的,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版是移植的)。
是的,公式来自维基百科,对于每个颜色成分: 结果=背景+(前景-背景)*Alpha。
顺便说一下,OCL中的Erase有一个问题。没有memset的类似物(与CUDA不同)。这就是为什么我现在不得不在主机中做Erase,并通过CLBufferWrite复制清理过的数组,这当然不比简单的Erase快。
另一方面,我试着为工作单位做一个任务数组,把1个点写进数组,但记不清速度了--似乎比之前的方法要慢一些。
在OCL 1.2中,有clEnqueueFillBuffer()可以做到这一点=>根据MQL语法,应该是CLBufferFill()。
但这个包装器并没有实现(因为1.1版是移植的)。
在英国沧,配方更有趣,你可以混合两个半透明的层。可以做一个半透明的界面和其他漂亮的东西。
在我的情况下,我不需要这个,一切都能正确地混合。A层以下的任何东西都可以被认为是基材,即使B层在其上面,基材本身也会通过它来照亮。