直接在画布上绘制位图vs

时间:2011-08-18 13:41:29

标签: android canvas bitmap

在我的应用程序中,我需要绘制一个大型网络(基本上是与线连接的小盒子),用户将能够进行缩放和平移。

我的第一个选择是将网络直接绘制到画布上,但我认为这不是很有效,因为每次发生一个pan事件时,绘图过程都会重新开始。

所以我尝试使用一个大的可变位图并且只绘制一次整个网络(或者至少每当出现缩放时),然后将必要的区域显示到画布上。

我的问题是,由于网络相当大,我在创建位图时会出现OOM异常......

我该怎么办?直接画到画布?使用几个较小的位图?

谢谢, Direz

2 个答案:

答案 0 :(得分:1)

我的第一个问题是你一次有多少精灵?到目前为止,屏幕上有许多精灵的最快机制是使用OpenGL,因为硬件加速。在Android上的besy方式,我发现这样做是为了使用可在Google Projects上使用的Cocos2d android(不要与ios版本混淆)。你必须使用IOS文档才能理解它,并且有一些不错的教程可以开始使用在线...特别是这里的hello world模板...... Www.sydchydroide.com/Blog/p?= 8。它与最新的IOS cocos2d相比已经过时了,但这是可以预料的。我发现在我的实验中未连接到活动的调试器会话时,程序运行得更快。

如果你想坚持你当前的方法或者上面仍然不够快,你将不得不尝试剔除任何不出现在屏幕上的绘图,这意味着形式的一般功能“如果精灵的x和y值在可见区域的边界之外,不要绘制它“这基本上是大多数瓷砖基础游戏处理问题的方式。

如果您正在做小方块,听起来就像是在手动绘图。我认为继续在画布上画画更值得注意但是要非常小心地管理你的精灵计数并避免重复的循环迭代 帧更新在可能的情况下循环。使用绘图操作最大化您的小型手机相当容易。

另一种选择可能是将整个位图一次绘制到内存中,然后使用复制矩形操作将图像传输到屏幕而不绘制您创建的完整位图。我认为复制rect应该是一个正常的快速操作,但如果你用它来绘制整个屏幕,它似乎有点矫枉过正,可能也不会有效。

答案 1 :(得分:0)

你可能不会喜欢这个,但如果你所做的只是绘制方框和线条,画布的效率将会非常高。你得到UI滞后还是什么?

我搞砸的一件事是绘制子组件的集合,这些子组件不会发生太大变化或根本不会变化到位图,然后渲染(缩放/移动并不是那么昂贵,如果在适当的级别完成)到画布可以帮助提高效率我曾经尝试过创建一个框架来渲染现有大图像的类似瓦片的子集,但是没有取得多大成功。我让事情变得有效,但代码变得很难看。

哦,也是一个快速测试,看你正在渲染的组件是否在屏幕创建的矩形内,可以为你节省大量的处理器时间。

相关问题