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

 
Алексей Барбашин:

这正是我建造它的方式。基本上,我以标准库为 基础,因为它有非常好的事件转移时刻和其他一些东西。阿纳托利为每个不同类别的元素创建了分组,在标准的分组中,所有的东西都被简化为一个基础对象。

...

在他的例子中,Nikolay展示了没有必要费力地存储局部区域的所有数据,因为整个画布的重绘速度非常快,不需要深入到细节,一次重绘整个画布就够了。
并非如此简单。想象一下,你有一个大的(全尺寸)表格,其中一个单元格每秒钟改变数值20次。如果你重新绘制整个画布,处理器的负载将增加到40%或更多。绝对错误的画布工作方式。你需要重新绘制单独的元素,否则表格、玻璃和各种局部动画将使处理器超载,并减慢其他函数的执行速度(如果它们在一个共同的线程中)。
 
Реter Konow:
并非如此简单。想象一下,你画了一个大的(整个图表)表格,其中的一个单元格每秒改变数值20次。如果你重绘整个画布,处理器的负载将增加到40%或更多。在画布上工作的方式绝对错误。你需要重新绘制单独的元素,否则表格、玻璃和不同的局部动画会使处理器超载,拖慢其他函数的执行速度(如果它们在一个共同的线程中)。

到目前为止,尼古拉的实验证明情况正好相反。他一次性重绘了画布上的所有内容,在代码中可以清楚地看到这一点。

但我仍然赞成当地的变化。但这种方法有其自身的困难,我还没有解决。

 
Алексей Барбашин:

到目前为止,尼古拉的实验证明情况正好相反。他一次性重绘了画布上的所有内容,在代码中可以清楚地看到这一点。

但我仍然赞成当地的变化。但这种方法也有自己的困难,我还没有解决。

我认为尼古拉是我的朋友,他在使用画布工作方面达到了一些伟大的高度,但他仍然没有进行全面的控制实验。尤其是桌子和玻璃。无论如何,我不知道有这种情况。

底线是这样的。一个画布是一个数据数组。数据在变化事件中被改变和重新保存。如果数组包括图表空间的所有像素--那么它的大小=图表的高度*宽度。如果数组内的像素值有局部变化,就没有必要在整个数组上做一个完整的循环,重置所有的值。你需要在变化的区域做一个循环,设置数值并退出循环。否则,无论你怎么切,这都是对资源和时间的浪费。

而这种方法有很多困难。主要是创建自己的全功能对象,在自己的画布上找到并处理它们。 内部的CCanvas并不适合于此。它不会 "看到 "你的元素,你也不能通过它访问它们。那里没有这样的功能。

 
Реter Konow:

我认为尼古拉是我的朋友,他在画布上取得了巨大的成就,但他仍然没有在控制方面做全面的实验。特别是有了桌子和翻斗车。无论如何,我不知道有这种情况。

底线是这样的。一个画布是一个数据数组。数据在变化事件中被改变和重新保存。如果数组包括图表空间的所有像素--那么它的大小=图表的高度*宽度。如果数组内的像素值有局部变化,就没有必要在整个数组上做一个完整的循环,重置所有的值。你需要在变化的区域做一个循环,设置数值并退出循环。 否则,无论你怎么切,这都是对资源和时间的浪费。

而这种方法有很多困难。主要是创建自己的全功能对象,在自己的画布上找到并处理它们。内部的CCanvas并不适合于此。它不会 "看到 "你的元素,你也不能通过它访问它们。那里没有这样的功能。

我非常理解这一切,也很清楚地知道这一点。我已经创建了自己的对象类,而且都能正常工作。

 
Алексей Барбашин:

我非常理解这一切,也非常清楚地认识到这一点。我已经创建了我的对象类,而且一切运行正常。

在这种情况下,你可以通过创建一个表并 以两种方式更新它--本地(每个单元格单独)和一次性更新整个表来检查。

 

尼古拉的动画大多具有较低的刷新率,因此,同时重绘整个画布并不会出现重叠。但如果你将刷新率提高到每秒5次,你可以看到CPU资源消耗的增加。如果你需要重绘整个动画--没有办法,但如果是里面的单个小区域--最好只是那一个。

这个频率本身--每秒5次--可以发生在一个数值非同步变化的表中。我在MT4上发生了这种情况,当时我通过资源连接表和测试器。在那里,在速度31时,所有的参数都在快速变化,以至于错误的重绘表格导致CPU负载达到50%或更高。即使是元素的局部重绘也没有完全拯救它。我想出了放慢数值显示速度的主意。数值本身是以自然速率变化的,但它们输出到单元格的频率却低了好几倍。这就解决了问题。

这里有一个例子。1000个单元的数值应该以25ms的速度变化。事实上,单元格大约每500ms变一次值,CPU的负载约为50%。(这是MT4,表格是画出来的)。

https://www.mql5.com/ru/forum/293630/page160


下面是一个有测试器的例子。这张表是画出来的,但它并没有使处理器免于过载。:)(测试仪速度31,电池更新满(没有跳针))。

https://www.mql5.com/ru/forum/293630/page148

 
Реter Konow:
这不是那么简单。想象一下,你有一个大的(对整个图表而言)表格,其中一个单元格每秒改变数值20次。如果你重新绘制整个画布,处理器的负载将增加到40%或更多。绝对错误的画布工作方式。你需要重新绘制单独的元素,否则表格、玻璃和不同的局部动画会使处理器超载,拖慢其他函数的执行速度(如果它们在一个共同的线程中)。

我不太清楚你的数字是怎么来的。看看尼古拉的完全简单的例子https://www.mql5.com/ru/forum/227736/page44#comment_13445909。在一个图形大小的画布上,会生成几个对象,可以在图形上(画布上)拖放。整个画布被重新绘制。根本就没有减速。

Canvas - это круто!
Canvas - это круто!
  • 2019.09.20
  • www.mql5.com
Поставил себе задачу: коротким кодом эффектно продемонстрировать возможности пользовательской графики через класс CCanvas...
 
Алексей Барбашин:

我不太清楚你的数字是怎么来的。看看尼古拉的完全简单的例子https://www.mql5.com/ru/forum/227736/page44#comment_13445909。在一个图形大小的画布上,会生成几个对象,可以在图形上(画布上)拖放。整个画布被重新绘制。 没有任何减速现象。

看看上面的例子。

插入了与菌丝的链接。
 

下面是一个放慢向单元格输出数值并减少处理器负荷的例子。


https://www.mql5.com/ru/forum/293630/page148

 
Алексей Барбашин:

我不太清楚你的数字是怎么来的。看看尼古拉的完全简单的例子https://www.mql5.com/ru/forum/227736/page44#comment_13445909。在一个图形大小的画布上,会生成几个对象,可以在图形上(画布上)拖放。整个画布被重新绘制。 根本就没有减速。

该例子中的刷新率是正常的。因此,没有放慢速度。