android - 基于自定义图 block 的 map 很慢

标签 android opengl-es

我正在为我的公共(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/

相关文章:

ios - Swift OpenGL ES 应用程序模板?

objective-c - iPad 应用更新到 iOS4 SDK 后只显示黑屏

android - 使用 Mockito 模拟回调和监听器

android - 在我的应用程序中创建一个模拟的 Android 环境

安卓 : Update on UI Thread very fast

java - Android没有定义GL_DEPTH_COMPONENT24?

java - OpenGL2.0教程的示例代码在运行时崩溃

android 内核 libm pow(float,float) 实现

android - 如何将图像从 Listview 传递到另一个 Activity

gwt - 在 WebGL 中绘制 3D 树结构