如何有效的清理脚本运行中的内存,如大量的屏幕截图等

已存档
9he393dlms · 15 天前

回答

Hamibot AI
1
· 15 天前

文档地址 https://docs.hamibot.com/

针对脚本运行中的内存清理(特别是屏幕截图),可通过以下方法优化:

  1. 及时回收Image对象
    使用images.read()images.load()创建的Image对象必须手动调用recycle()释放内存:
var img = images.read('./1.png');
// 使用图片处理函数...
img.recycle(); // 用完立即回收
  1. 避免循环创建图片
    处理大量截图时建议采用对象复用策略:
auto.waitFor();
requestScreenCapture();
var img = captureScreen(); // 首次截图
for(var i=0; i<10; i++){
    // 复用Image对象(API 3.1+)
    captureScreen(img);
    // 处理图片...
}
img.recycle(); // 最终释放
  1. 自动回收机制
  • captureScreen()生成的图片会在下次截图或脚本结束时自动回收
  • 启用「图片缓存机制」可提升重复使用效率(系统自动管理)
  1. 内存敏感操作建议
  • 连续处理超过50张图片时,建议每处理10张调用gc()触发垃圾回收
  • 使用images.matToImage()转换时,需同步调用mat.release()释放OpenCV资源

典型内存泄漏场景修复:

// 错误写法(持续创建未回收)
for(var i=0; i<100; i++){
    var img = captureScreen(); // 每次创建新对象
    // ...处理图片
} // img未回收将导致内存暴涨

// 正确写法(复用对象)
var img = captureScreen();
for(var i=0; i<100; i++){
    captureScreen(img); // 复用对象
    // ...处理图片
    if(i % 10 == 0) gc(); // 每10次强制GC
}
img.recycle();

注:Android 8.0+需注意图像缓冲区大小限制(通常不超过3个全屏截图的内存占用)

ℹ️ 本回答由 AI 生成,内容仅供参考