真诚请教:**等待控件出现的效率问题**

最近在开发一些服务器物理距离比较远的app,控件出来的比较慢。同时app又有一些要在规定时间内点击的功能且每次需要点击的间隔时间不一样。卷代理是卷不动了,毕竟物理距离在那,所以就想着能不能从autox js的函数效率的角度来看。
当需要判断页面控件是否存在时:

  1. findOne方法(或者findOnce())
    if(UiSelector.findOne()==null){};

  2. find()方法
    if(UiCollection.empty()){};

  3. filter()方法
    if(UiSelector.filter(f)=false{};

  4. exists()方法
    if(!UiSelector.exists()){}

请问一下这几种判断,哪一种在效率、运行速度的角度看更好,或者是否有更好的方法呢?目前的情况是,有的时候设备找到控件已经来不及了。

此外,是否用images类的方法更好呢?Autox.js找图对设备要求高吗,设置引擎有推荐的设置吗?目前没有备用机,只开安卓模拟器。

最后由 0x_Sato 编辑

在使用Auto.js进行控件查找时,不同的方法在性能和效率上会有所差异。以下是对你提到的几种方法的简要比较:

  1. findOne() / findOnce():

    • 这两个方法会返回找到的第一个控件,效率较高,特别是在控件没有加载完时,因为它会立即返回 null
    • findOnce() 是在 findOne() 的基础上是否匹配不再查找,很适合不需要遍历所有控件的场景。
  2. find():

    • 这个方法返回一个集合,可能会引入一定的性能开销,因为它会遍历所有符合条件的控件。
    • 当你只需要判断控件是否存在时,这种方法通常不是最佳选择。
  3. filter():

    • filter() 是对控件集合进行过滤,效率依赖于过滤的条件复杂程度。
    • 如果过滤条件很复杂,可能会增加运算时间。
  4. exists():

    • 这个方法用来检查控件是否存在,内部实现较为高效,推荐用于快速检查控件的存在性。

效率和性能比较

如果只需要判断控件是否存在,推荐使用 exists() 方法或者 findOne(),这两者效率较高并且更简洁。在快速判断控件是否存在的同时,也能应对加载延时的问题。

图像识别

关于你的第二个问题,使用图像识别(images类的方法)在设备要求和运行效率上也有其自身的利弊:

  • 设备要求: 图像识别通常对设备要求较高,尤其是内存和处理能力。使用低性能的设备可能导致识别效率低下。
  • 图像质量: 确保图像清晰度和对比度足够好,以提高识别成功率。
  • 环境: 确保被识别的界面在不同时间或条件下不会发生过大变化。

推荐的设置

  1. 调整图片引擎设置: 使用时务必设置图像识别引擎的最优参数,例如使用合适的颜色模式和分辨率。
  2. 测试不同环境下的效果: 通过在不同环境(光照、对比度)下测试识别效果,以找到最优设置。
  3. 添加延迟: 可以适当添加短暂的延迟,给UI一些加载的时间。在判断控件存在之前,可以在循环中增加短暂等待时间,以确保控件能够正常加载。

总结

结合你的需求,建议在需要判断控件的存在时优先使用 exists() 或者 findOne(), 尽量避免用 find(),也可以组合使用图像识别,但需关注设备性能和识别效果。如果在测试中发现有规律的延迟,可以考虑在代码中动态调整判断间隔。

@0-0 大大,另外可以反馈一个bug吗:
新版7.0的悬浮窗大小显示有问题,虽然已经按照doc.autoxjs.com上的示范代码(分辨率长和宽除以4)设置了悬浮窗大小,悬浮窗依然布满整个屏幕。
机型是mumu模拟器1080*720分辨率

新版有bug,就用旧版吧

我把你的问题喂给chatgpt
回复如下

感谢你的反馈!关于悬浮窗的问题,确实在特定版本或特定设备上可能会出现显示不正常的情况。以下是一些你可以尝试的解决办法,以及一些反馈建议:

解决方法

  1. 确认代码设置
    确保你在代码中正常地设置了悬浮窗的宽高。比如:

    var window = floaty.rawWindow(
        <frame>
            <text text="Hello, World!" />
        </frame>
    );
    
    var width = device.width / 4; // 计算宽度
    var height = device.height / 4; // 计算高度
    
    window.setSize(width, height);
    
  2. 检查设备设置
    在某些模拟器上,设备的 DPI(每英寸点数)设置可能会影响悬浮窗的大小,确保在模拟器或真实设备的设置中,分辨率和 DPI 设置是正确的。

  3. 更新至最新版本
    尝试将 Auto.js 更新到最新版本,开发者可能已经在新版本中修复了相关问题。

  4. 使用不同模拟器
    如果问题依然存在,尝试在不同版本的模拟器上运行(如 BlueStacks、Nox等),或在真实设备上进行测试,看是否存在类似的问题。

  5. 记录并反馈问题
    如果上述方法都无法解决问题,可以记录你所使用的设备、操作系统、Auto.js 版本以及具体的代码示例,然后报告给开发者或在其 GitHub 或社区中进行反馈。

反馈建议

  • 在反馈时,尽量提供详细的信息,包括:
    • 操作系统版本(如 Android 10、Android 11)
    • Auto.js 版本
    • 模拟器的具体版本(如 MuMu 版本)
    • 具体的代码示例
    • 预期的行为与实际的表现之间的差异

通过详细的反馈,开发者能够更快定位和解决问题。希望你的悬浮窗问题能够尽快得到解决!如果有其他问题,欢迎继续提问。