帆布与标签 - 页 6

 

而我为什么要在策略测试器中测试图形绘制(尤其是在专门的视觉待定版本中),而直接在工作图表中测试更好?

并祝贺那些没有想到在非视觉测试器中禁用机器人中的图形绘制的人。

 

Nikolay是对的--编辑标签属性与标签渲染没有关系。

标签,像图表上的任何其他对象一样,是在一个完全不同的线程中绘制的,并且独立于MQL5程序的工作。机器人只能要求再次强行渲染图表,但不能测量渲染时间。用对象绘制图表是完全异步的。

但渲染画布很容易测量,因为它是直接在机器人的流程中完成的,然后在独立渲染图表期间,它仍然是在窗口的上下文中对准备好的位图进行本地BitBlit。这种操作是初级的,而且被显卡很好地加速了。

在文本标签中,TTF字体的SetFont/TextOut是相当昂贵的。
 
Mihail Matkovskij:

结果是321次,如果这个测量结果是可信的。

这个数字表明,这种测量是不可信的。
这对一个有经验的程序员来说是很明显的。
你真的认为在图形屏幕上显示字符,除了逐个像素的形成,还有其他方法吗?ECock的日子早就过去了。
 
Renat Fatkhullin:

我为什么要在策略测试器中测试图形绘制(特别是在专门的视觉待定版本中),而直接在工作图表中测试会更好?

同时,祝贺那些没有想到在非视觉测试器中禁用交易机器人中的图形绘制的人。

我也可以在图表上查到它。然而,我认为在策略测试器中做这件事会更容易。此外,我有一个情况,我在上面描述过,当显示是基于CCanvas的时候,它严重拖慢了测试器中的专家顾问。特别是它在蜱虫上显示出来。为了在图表中演示,必须在循环中进行文本输出。也就是说,要使刷新率更高,就像我现在正在做的离线优化的专家顾问那样。我决定为它做一个基于标签的显示,因为Canvas会拖慢它。因为,正如你所指出的,标签是在不同的线程中渲染的,所以,它不会减慢EA的自主优化,我是在一个循环中运行。

事实证明,正如你所说,绘制标签中的文字比绘制OBJ_BITMAP_LABEL要花费更多的时间。所以,为了让它更快,它也需要在一个单独的线程中进行渲染。但怎么做呢?如果不能 做到这一点,那么从使用OBJ_LABEL应用程序 的角度来看,OBJ_BITMAP_LABEL 更快。

 
Nikolai Semko:
这对一个有经验的程序员来说是很明显的。

对于一个有经验的程序员来说,这是显而易见的,他已经详细地研究过或彻底地了解了 终端!而且,由于我不是终端的开发者,而只是为它写应用程序,我可能不知道,像大多数程序员一样,什么是MQL文档中没有的。

 
Mihail Matkovskij:

这对一个有经验的程序员来说是显而易见的,因为他已经详细研究过或彻底了解了 终端的操作!而且,由于我不是终端的开发者,而只是为它写应用程序,我可能不知道,像大多数程序员一样,什么是MQL文档中没有的。

然而,你不仅试图与一个开发者争论,还试图与MQ的主管争论。

 
Alexey Viktorov:

然而,你不仅试图与一个开发者争论,还试图与MQ的主管争论。

我不是想争论,而是想知道从使用应用程序的角度来看,是否可以使OBJ_BITMAP_LAB EL的成本低于OBJ_LABEL!

 
Mihail Matkovskij:

我决定为它做一个基于标签的显示,因为Kanvas会使事情变慢。

我很确定你的画布为什么会变慢。
,因为你试图把多个画面塞进一个30毫秒的画面。
问题是,无论如何,帧的重绘(ChartRedraw)频率不会超过每秒30帧左右。

正如我在这里所说的,kanvas文本和Label的区别在于,在Label的情况下,像素阵列的填充是异步的,不受你控制,所以在Label的情况下,像素阵列的填充不会超过每30毫秒发生一次。
但这可能发生在canvas上,因为它不是异步的(位图填充)。你可以在30毫秒内填入10次位图,但它只显示一次,9次都是空闲的。
因此,正如《画布》中所讨论的那样,画布是很酷的!,程序员需要控制BitMap的启动时间。
一个行为模型可以是:

  • 有一个函数可以形成位图
  • 该函数的输入端在一个静态变量中存储了开始时间,单位是毫秒。
  • 下一次你进入这个函数时,你应该检查自上一次生成位图以来是否少于30毫秒。如果是,则退出并返回false,如果不是,则开始填充并输出一个新的位图。
当然,更方便的做法是在类中引入bool变量,允许或不允许形成画布。
 
Nikolai Semko:

我很确定你的画布为什么会变慢。
,因为你试图把多个画面塞进一个30毫秒的画面中。
问题是,无论如何,帧的重绘(ChartRedraw)频率不会超过每秒30帧左右。

正如我在这里所说的,kanvas文本和Label的区别在于,在Label的情况下,像素阵列的填充是异步的,不受你控制,所以在Label的情况下,像素阵列的填充不会超过每30毫秒发生一次。
但这可能发生在canvas上,因为它不是异步的(位图填充)。你可以在30毫秒内填入10次位图,但它只显示一次,9次都是空闲的。
因此,正如《画布》中所讨论的那样,画布是很酷的!,程序员需要控制BitMap的填充时间。
一个行为模型可以是这样的:

  • 有一个函数可以形成位图
  • 该函数的输入将图像生成的开始时间存储在一个静态变量中,单位为毫秒。
  • 下一次你进入这个函数时,你应该检查自上一次生成位图以来是否少于30毫秒。如果是,则退出并返回false,如果不是,则继续填充并输出一个新的位图。
也许,在一个允许创建画布的类中引入一个变量会更好。

是否有任何资料可以在哪里读到更多的信息?虽然一切对我来说都很清楚,但是,这个话题还是挺有意思的!我想,这也是我的工作。现在只剩下做位图更新控制变体和测试了。如果位图变成比标签更快,我会感到惊讶。

 

下面是一个例子,它显示了我所说的内容。 脚本的基础来自这里的 文档。
它从一个随机数组开始,输出100乘以100行,生成100个标签。
它首先输出100个带有Label的框架。
之后,它将输出100个画布字符串的框架。
画布是一样的。
在一个循环中睡眠 是有记录的。如果循环中包含Sleep(0),情况就会完全不同。你可以尝试一下。
所有帧和行都有编号,以便控制。
我录制了一段视频,并将其放慢了30倍。你可以看到,在100个框架中,只有两个框架的标签被实际渲染了,此外,在第二个框架中,你可以看到标签来自不同的框架,也就是说,你可以看到异步工作。

所以这些标签的数值是假的:

Kanvas在100帧中输出约60-70帧。发生这种情况是因为帧的形成比30毫秒快一点,因此虽然所有的帧都形成了,但并不是所有的帧都有时间被输出。
实验一下前两个参数

和周期延迟。


如果你增加要输出的行数,你可能会赶上错误4001。当有太多的输出时,这是MQ的一个错误。

附加的文件: