flutter - CustomPainter - shouldRepaint 值得付出努力吗?
问题描述
我实现了一个CustomPainter。在 shouldRepaint 方法中,我必须比较 6 组的深度相等性。我目前正在使用 setsEqual 执行此操作。如果它们完全相等,则无需重新绘制,但真的值得努力检查吗?即使我不必这样做,只返回 true 并绘画会更糟糕吗?
编辑:我忘了提到绘图本身实际上很简单。这些集合包含计算点的对象(每个大约 5 个),然后我将其绘制为圆圈。圆圈的颜色取决于它所属的集合。由于与用户的交互,对象可能会更改为它们所属的集合,如果发生这种情况,持有 CustomPaint 的 StatefulWidget 将使用 setState 重建。我认为复杂的部分是决定是否重绘:每个集合都必须与旧的代表集进行比较,如果一个集合的内容发生了变化,我的 CustomPainter 应该重绘。
解决方案
CustomPaint 可能会消耗大量电力。此处另一个问题的示例,其中用户由于不断绘制而导致 FPS 大幅下降。
所以这是可以被认为是值得的东西。
但要注意的最重要的事情是:shouldRepaint
不是自给自足的。根据文档:
即使 shouldRepaint 返回 false(例如,如果需要重新绘制祖先或后代),paint 方法也可能会被调用。也有可能调用paint方法而根本没有调用shouldRepaint(例如,如果盒子改变了大小)。
一个解决方案是RepaintBoundary
按照文档中的说明使用,或者在上面链接的 SO 问题中使用。
推荐阅读
- python - PyQt5 Designer 不工作:此应用程序无法启动,因为无法初始化 Qt 平台插件
- python - 如何将对象的唯一 ID 压缩到 RFID 的 96 位内存中
- python - 混合浮点数和字符串的问题(连接错误)
- php - MySQL 将查询拆分为多个 Html 表
- excel - 为什么在 Excel / VBA 错误处理中 Err.Description 保持为空?
- spring-boot - 自定义 graphQL 标量 LocalDateTime
- node.js - node-hid:通过序列号获取设备
- java - Selenium Chrome 驱动程序 - 等待驱动程序服务器启动超时
- firebase - firebase auth 是否为不同的提供者存储和管理访问令牌
- flutter - 如何在 Dart 或 Flutter JsonObjectLite 中使用“params.put”发送