基于自定义图块的地图很慢

时间:2010-12-02 13:45:43

标签: android opengl-es

我正在为我的公共交通应用程序制作地图。我正在使用SurfaceView,它是一个基于图块的地图,除主线程外还有2个线程 - 绘制线程和位图加载线程。

位图是存储在SD卡上的256x256 PNG,我正在缓存加载的位图,缓存容量是64位图。每个缩放级别都有不同的位图集,我的地图有4个缩放级别,每个下一个级别的缩放量都是2倍。

不幸的是,我的Nexus One上的滚动和缩放变焦并不平滑,FPS为15 - 20.当没有加载任何图块时,FPS为35 - 40.如果我降低了位图加载线程的优先级,它会变得完全平滑但我通常会在地图上看到尚未加载的(白色)瓷砖 - 这比非光滑度更差。

那我该怎么办?到目前为止我有两个想法:

  • 尝试使用OpenGL,但是我不想花时间在它上面,然后发现它我的FPS只是由3开始。另外我想在用户点击地图标记后显示弹出窗口(用地图滚动)我不知道怎么做GLSurfaceView。
  • 仅当用户触摸屏幕或正在进行动画时,才将低优先级设置为位图加载线程。我试过了,但由于不明原因它似乎甚至使问题稍微恶化,触摸/不触摸屏幕没有任何影响。如果它只是我可以解决的一些错误,还有另一个问题。如果我使用动态滚动快速移动地图,我会看到许多没有缓存的位图。

1 个答案:

答案 0 :(得分:2)

不要在渲染线程上执行任何 I / O. (你怎么能使用GLSurfaceView而不是顺便使用OpenGL?)

我已经编写了一个基于OpenGL图块的地图视图,它在Nexus One上很平滑(不是测量fps,但它的很容易像iPhone 4上的地图应用程序一样流畅)。诀窍是将所有I / O从渲染线程移开,降低工作线程的优先级,并在当前渲染结束时立即requestRender(),如果您知道需要另一个(例如在平移期间)缩放),即不要等待另一个线程发出信号。在市场中寻找Yell.com以查看其实际情况(尽管可能仅限于英国)。