0

我的应用需要加载建筑平面图,然后在平面图上绘制对象(家具)。平面图图像是 2500 x 1500 240Kb PNG,但由于需要 12+Mb 的堆来创建位图,因此需要 12+Mb 的堆来使大多数设备崩溃,给我一个 OutOfMemory 错误。让我在这里澄清一下:据我所知,这不是内存泄漏,而 bitmap.recycle() 什么也不做,因为它在第一次创建第一个图像时崩溃了。除非我使用使图像无法识别的样本大小,否则使用 inSampleSize 读取图像无济于事。这整个情况很疯狂。我在 Droid 3、HTC Inspire 和两个 2.3 模拟器上进行测试。HTC 将加载地图,模拟器(可笑)堆大小为 128Mb。这个应用程序的部署将在所有安卓用户中使用,所以我可以'

这是我当前的代码,它给了我一个无法使用的图像(来自另一个 SO 帖子,抱歉我丢失了链接):

BitmapFactory.Options o=new BitmapFactory.Options();
        o.inJustDecodeBounds=true;
        BitmapFactory.decodeResource(getResources(), resourceId, o);


        //Find the correct scale value. It should be the power of 2.
        int scale=16;
        while((o.outWidth/scale)>=REQUIRED_SIZE || (o.outHeight/scale)>=REQUIRED_SIZE)
            scale*=2;

        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inSampleSize = scale;

        Bitmap base_image;
        try {
            base_image = BitmapFactory.decodeResource(getResources(), resourceId);
        } catch (Error e1) {
            base_image = BitmapFactory.decodeResource(getResources(), resourceId, options);
        }

GLSurfaceView 会在这里解决我的问题吗?我需要它来 1) 加载平面图图像,2) 允许我以编程方式绘制对象和文本标签,以及 3) 支持缩放并根据平面图坐标对触摸做出反应。如果这是答案,任何人都可以为这样的基本 2D 工作推荐一个好的教程吗?

4

1 回答 1

0

有很多方法可以减少位图的内存使用,如果您选择使用 openGL,您可以使用可以直接发送到视频内存的预压缩纹理。如果我没记错的话,Android 本身就支持 ETC1 纹理,ETC 会减小 25% 的大小。但是,由于您没有任何 openGL 经验,并且还需要执行稍微复杂一些的操作,例如绘制文本,这可能不是您的最佳操作(尽管通过此方法您可能会在旧设备上获得最佳性能) . 您可以考虑使用那里的任何引擎(AndEngine 或 Box2d 很流行)。

对您来说更快且可能更好的选择可能是创建平面图的矢量表示(例如SVG文件)(如果您有由背景颜色和墙壁线条组成的简单计划,这应该是可能的)。然后,如果您想要更高级的图像,请使用Path类或外部库进行绘制。

于 2012-06-12T16:58:13.433 回答