帆布很酷! - 页 64

 
Vladimir Pastushak:

大家好,我想加深我对Canvas的了解

我甚至不知道该从何说起。现在我在想象,Canvas是复杂的对数公式之类的东西。

你能给我一个例子,如何在画布上做一个像下面这样的按钮。我需要一些代码来理解它。


关于交易、自动交易系统和策略测试的论坛

在Canvas上制作一个众包项目

Nikolai Semko, 2017.05.24 02:20


以下是所得到的结果。


该按钮可以显示在背景后面和前台,设置为点击锁定或不锁定。

在示例文件CanvasButton.mq5中,可以用鼠标拖动按钮。要做到这一点,只需按住Ctrl键来移动蓝色按钮,按住Shift键来移动红色按钮。

因为GButton类是CCanvas类的后裔,这个例子演示了在CircleWu例子上使用CCanvas类的功能的能力(这在OnInit中实现)。因此,可以使用CCanvas类的函数在按钮上写文字。

当然,这门课并不假装是干净的。画面并不完美,3D也很传统;阴影没有实现,执行速度也没有优化。而且很可能有很多粗糙的边缘,缺乏各种检查。因此,不要严厉地评判。

如果你多花一点时间,当然可以做到。


我只是想...你可以说--确定方向。


Canvas.mqh文件与原来的不同之处在于,m_pixels数组被定义为公共的。


 

当然,尼古拉是对他热衷于实验帆布的尊重。而我在研究代码实例时,也有不小的收获。

当然,在目前的实现中,Canvas纯粹是用图形基元填充位图阵列的CPU约束算法。即通过带有数组元素枚举的循环来进行 就这些了...同时,这也是21年前...

实验当然是好的,但用于实际目的的实施不仅要漂亮,而且要有效。因为我当然可以忽略它坐在一些顶级的8核PC上,但作为一项规则,主要的大众用户拥有相当中等的PC。任何带有市场数据可视化的全屏GUI,即使它非常方便和漂亮,也不会受到欢迎,如果它的CPU负载高达75%。这是一个事实。这就是为什么,而不是因为他们根本无事可做--硬件加速被带入所有主要浏览器的Canvas实现。

说到核心--在MQL5中应该有一些Direct2D(和DirectWrite)的包装器--这将是一个真正的炸弹,为GUI和数据可视化领域许多实际任务的有效硬件加速实现开辟道路。当然,你可以说,已经有了DirectX。但只有它的Direct3D部分有代表,那就是3D投影、着色器和其他3D的属性,而且它的实际用途还是相当狭窄的利基。是的,当然你可以通过一些调整投影和其他操作以及镶嵌实现渲染2D图形和通过Direct3D--但这并不意味着在Direct3D上创建你自己的Direct2D实现。这就没有任何意义了,因为Direct2D在很久以前就已经实施了。

所以我有个想法...
 
也就是说,一切都可以在CPU上快速绘制。

上面的例子证明了这一点。另外,这是一个对图像的最终美观和精致程度没有严格要求的应用领域。
 
Codexample:

当然,尼古拉是对他热衷于实验帆布的尊重。而我在研究代码实例时,也有不小的收获。

不幸的是,Canvas在目前的实现中只不过是用图形基元填充位图数组的受CPU约束的算法。即通过循环与数组元素搜索 就这些了...同时,这也是21年前...

实验当然是好的,但用于实际目的的实施不仅要漂亮,而且要有效。因为我当然可以忽略它坐在一些顶级的8核PC上,但作为一项规则,主要的大众用户拥有相当中等的PC。而任何带有市场数据可视化的全屏GUI,即使它非常方便和漂亮,也不会受到欢迎,如果它的CPU负载高达75%。这是一个事实。这就是为什么--而不是因为他们根本无事可做--硬件加速已经被带入所有主要浏览器的Canvas实现。

事实上,在MQL5中会有一些Direct2D(和DirectWrite)的包装,这将是一个真正的炸弹,为GUI和数据可视化领域中许多实际任务的有效硬件加速实现开辟了道路。当然,你可以说,已经有了DirectX。但只有它的Direct3D部分有代表,那就是3D投影、着色器和其他3D的属性,而且它的实际用途还是相当狭窄的利基。是的,当然你可以通过调整投影和其他操作以及镶嵌来实现2D图形的渲染,并通过Direct3D--但这并不意味着在Direct3D上创建你自己的Direct2D实现。这就没有任何意义了,因为Direct2D在很久以前就已经实施了。

这里有一个想法...

谢谢你的好意。
事实上,MQ在这方面做得很好,并且已经使用GPU而不仅仅是CPU来处理图形和计算工具。
我是指OpenCL和DirectX。
下面是在CPU、OpenCL(GPU)和DirectX(GPU)三种变体中比较同一图形任务(8个重力中心)实现的例子。

1.CPU -14 fps。(脚本 Swirl2.mq5)

2.OpenCL--每秒162帧(需要在电脑上安装OpenCL驱动程序)(Swirl2_OCL.mq5脚本)

3.DirectX--每秒37帧(脚本Swirl2_GPU.mq5)。


所以它不那么忧郁。
如果你需要最大的性能,你也可以使用显卡。
我应该注意到,这些测试是在一台相当弱的笔记本电脑上进行的,它的英特尔® HD Graphics 620 显卡很弱
虽然使用显卡的力量可以带来非常体面的性能提升,但我同意Renat的观点,即使使用CPU进行图形输出,也能覆盖MQL5任务区中99%以上的图形任务

只要我的帧在10毫秒内生成,我就不会对GPU感到特别不安(尽管有时诱惑力很大,好在还有回旋余地)。
而在10毫秒内,我可以输出,例如,这样一个带有阴影、抗锯齿和透明的东西。


用于GPU的 SZY代码是从这个主题 下载非常感谢@Rorschach@Serhii Shevchuk的帮助

附加的文件:
Swirl2.mq5  5 kb
Swirl2_OCL.mq5  14 kb
 
朋友们,有人用Canvas插值法对图形资源进行过大小调整吗?
 
Nikolay Kositsin:
各位,有没有人在Canvas上用插值法调整过图形资源的大小?

在这里 举了一个代码的例子。但该代码远非完美。现在的情况会有很大不同。

关于交易、自动交易系统和策略测试的论坛

帆布很酷!

Nikolai Semko, 2018.03.24 04:13

光栅缩放脚本演示

有一个相当大的BMP文件作为资源放在Ex5文件中。



 
Nikolai Semko:

在这里 举了一个代码的例子。但该代码远非完美。如果是我,现在的做法就完全不同了。


我很好奇你现在会怎么做。这符合我的最大利益 :)

 
Nikolai Semko:

在这里 举了一个代码的例子。但该代码远非完美。我现在会以不同的方式做每件事。


它是无法形容的美 :)

 

OpenCL:https://www.mql5.com/ru/forum/162864

DirectX:标准的Remnant 3D

Вот что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL
Вот что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL
  • 2016.12.10
  • www.mql5.com
Это демонстрация не только расчетов на GPU в MQL5 коде, но и графических возможностей терминала: Полный исходный код в виде скрипта приложен...
 
Artyom Trishkin:

只是想知道你现在会怎么做。纯粹是为了我的最佳利益 :)

很简单,Artem,早些时候我把一个像素看作是一个正方形,通过面积计算它在新比例的像素中的加权参与,但现在我会把它看作是一个圆,通过到新比例的像素中心的距离计算它的加权参与。