我正在为我的公共(public)交通应用制作 map 。我正在使用 SurfaceView,它是一个基于图 block 的 map ,除了主线程之外还有 2 个线程 - 绘图线程和位图加载线程。
位图是存储在SD卡上的256x256 PNG,我正在缓存加载的位图,缓存容量为64位图。每个缩放级别都有不同的位图集,我的 map 有 4 个缩放级别,每个下一个级别缩放 2 倍。
不幸的是,在我的 Nexus One 上滚动和捏合缩放不流畅,FPS 是 15 - 20。当没有加载任何图 block 时,FPS 是 35 - 40。如果我降低位图加载线程的优先级,它会变得完全流畅,但我经常在 map 上看到尚未加载(白色)的图 block - 这比不平滑更糟糕。
那我该怎么办呢?到目前为止我有 2 个想法:
- 尝试 OpenGL,但我不想花时间在它上面然后发现我的 FPS 只增加了 3。我还想在用户点击 map 标记后显示弹出窗口(随 map 滚动),这我不知道如何在 GLSurfaceView 中执行。
- 仅当用户触摸屏幕或有正在进行的动画时,才为位图加载线程设置低优先级。我试过了,但由于未知原因,它似乎使问题变得更糟了一点,触摸/不触摸屏幕没有任何效果。如果这只是我可以修复的一些错误,那么还有另一个问题。如果我使用动态滚动快速移动 map ,我会看到许多未缓存的位图。
最佳答案
不要在渲染线程上执行任何 I/O。 (顺便说一句,你怎么能使用 GLSurfaceView 而不使用 OpenGL?)
我已经编写了一个基于 OpenGL tile 的 map View ,它在 Nexus One 上像黄油一样平滑(没有测量 fps,但它很容易像 iPhone 4 上的 map 应用程序一样平滑)。诀窍是将所有 I/O 移出渲染线程,降低工作线程的优先级,并在当前渲染结束时立即 requestRender() 如果您知道将需要另一个渲染线程(例如在平移或缩放),即不要等待另一个线程发出信号。在市场中寻找 Yell.com 以查看它的实际效果(尽管可能仅适用于英国)。
关于android - 基于自定义图 block 的 map 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335651/