Android:提高绘图应用的速度

时间:2015-03-05 14:29:57

标签: java android performance android-bitmap prefuse

背景资料: 我正在将prefuse framework分配到android(从我的AndroidPrefuse命名)。我完成了大部分工作,至少可以用于一个可视化(散点图)。我注意到"高"的android版本数据量(超过10000项)非常慢。

我注意到prefuse(在桌面版中)确实使用BufferedImage进行绘制。我认为这是为了获得性能。这是代码:

protected BufferedImage m_offscreen;
...
public void paintComponent(Graphics g) {
    if (m_offscreen == null) {
        m_offscreen = getNewOffscreenBuffer(getWidth(), getHeight());
    }
    Graphics2D g2D = (Graphics2D)g;
    Graphics2D buf_g2D = (Graphics2D) m_offscreen.getGraphics();

    paintDisplay(buf_g2D, getSize());
    paintBufferToScreen(g2D);
...
protected BufferedImage getNewOffscreenBuffer(int width, int height) {
    BufferedImage img = null;
    if ( !GraphicsEnvironment.isHeadless() ) {
        try {
            img = (BufferedImage)createImage(width, height);
        } catch ( Exception e ) {
            img = null;
        }
    }
    if ( img == null ) {
        return new BufferedImage(width, height,
                                 BufferedImage.TYPE_INT_RGB);
    }
    return img;
}

起初我确实跳过了这种"缓冲"在AndroidPrefuse。在我注意到性能问题后,我尝试了这个:

protected void onDraw(Canvas canvas)
{
...
    int width = getWidth();
    int height = getHeight();       
    if (m_offscreen == null)
    {
         bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
         m_offscreen = new Canvas(bitmap);
    }
    paintDisplay(m_offscreen);
    canvas.drawBitmap(bitmap, 0, 0, null);
...

但结果是一样的。 我是android的新手,因此问题可能是微不足道的:

第一个问题:我做得对吗,就像prefuse原来一样?

我觉得上面的代码与"非缓冲":

相同
protected void onDraw(Canvas canvas)
{
...
  paintDisplay(canvas);
...

我是对的吗?如果是的话,是否有办法以与原始prefuse相同的方式(使用BufferedImage)提高AndroidPrefuse的速度?

方法" paintDisplay"呈现所有项目。对于10000件物品,它需要1100毫秒(在三星Galaxy S5上)。它看起来并不多,但是当我平移和缩放时,应用程序不再平滑,因为它有100个项目。

为了记录:我还将View作为SurfaceView实现并完成了方法的处理" paintDisplay"在一个单独的线程中。但它没有提高速度。

如果使用Bitmap来提高性能并不是一个好的解决方案,那么有人知道如何提高性能吗?

0 个答案:

没有答案