如何计算android.graphics.Path的内存使用情况

时间:2014-05-15 16:23:32

标签: android memory-management

我正在使用LRUCache来缓存android.graphic.path对象。为此,我需要知道pathes用于覆盖LRUCache的sizeOf()方法的内存量。

所以我的问题是:如何计算路径的内存使用量?

我已经遇到的困难是:

  • android.graphic.path不可序列化
  • 路径可能存储为位图,我已经读过了吗?

我按照以下方式(代码)原始测量内存使用情况,这让我感到困惑。示例:

  • 一条10'000行的路径使用312个字节。
  • 10个路径,每行10个,使用992个字节。

任何提示?


ArrayList<Path> alPathes=new ArrayList<Path>();
long iAnzahlBigPathes=1;
long iAnzahlOperation4BigPath=20000;

System.gc();System.gc();System.gc();System.gc();System.gc();System.gc();System.gc();System.gc();
long lused1=getUsedMemory();
Log.v("Memory4operation","ltotal1 " + lused1);// getMemoryStatus

for(int o=0;o<iAnzahlBigPathes;o++){
    Path path=getBigPath(iAnzahlOperation4BigPath);


    int iSize=path.toString().length();

    alPathes.add(path);
}
System.gc();System.gc();System.gc();System.gc();System.gc();System.gc();System.gc();System.gc();
long lused2=getUsedMemory();
Log.v("Memory4operation","ltotal2 " + lused2);// getMemoryStatus

long iDifferenz=lused2-lused1;
Log.v("Memory4operation", "Memory used for path " + iDifferenz + " in bytes");

//float fMemoryforoneline=(float)iDifferenz/(float)iAnzahlSquares;
float fMemoryforoneoperation=(float)iDifferenz/(float)iAnzahlOperation4BigPath/(float)iAnzahlBigPathes;
Log.v("Memory4operation", "" + fMemoryforoneoperation);


public long getUsedMemory(){
    final int ltotal = (int) (Runtime.getRuntime().totalMemory());
    final int lfree = (int) (Runtime.getRuntime().freeMemory());
    return (ltotal - lfree);
}

public Path getBigPath(long iAnzahlOperation4BigPath){

    int imin=10;
    int imax=1000000;
    Path path=new Path();
    path.moveTo(randInt(imin,imax),  randInt(imin,imax));
    for(int i=0;i<iAnzahlOperation4BigPath;i++){
        path.lineTo(randInt(imin,imax), randInt(imin,imax));
    }
    path.close();
    return path;
}

1 个答案:

答案 0 :(得分:0)

路径通常会在可用时使用硬件渲染。因此,在内部它不会存储为位图,而是存储一组&#34;绘图指令&#34;。 您必须查看Path的底层本机实现(SkPath.cpp),以了解内部存储路径的确切方式。

似乎没有可用于获取Path大小的API。 你离开了:

  1. 查看实施情况并自行估算。请记住,如果将路径对象保存到缓存中,则需要缓存指令而不是渲染结果。
  2. 在将路径放入LRUCache之前,将路径渲染到位图。这将节省您的渲染时间。特别是如果你的路径很贵。这很可能是你想要的