背景资料: 我正在将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来提高性能并不是一个好的解决方案,那么有人知道如何提高性能吗?