在位图上绘制vs直接在画布上绘制



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

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

所以我尝试使用一个大的可变位图,只画一次我的整个网络(或者至少每当缩放发生时),并将必要的区域blit到画布上。

我的问题是,由于网络相当大,我在创建位图时得到OOM异常…

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

谢谢,Direz

我的第一个问题是你一次有多少精灵?到目前为止,由于硬件加速,在屏幕上拥有许多精灵的最快机制是使用OpenGL。在Android上,我发现最简单的方法是使用Cocos2d Android(不要与ios版本混淆),它可以在Google Projects上使用。为了理解它,你必须使用IOS文档,网上有一些不错的教程,尤其是这里的hello world模板。Www.sketchydroide.com/Blog/p ? = 8。与最新的IOS cocos2d相比,它已经过时了,但这是意料之中的。在我的实验中,我发现程序在不连接到活动调试器会话时运行得快得多。

如果你想坚持你目前的方法,或者上面的方法仍然不够快,你将不得不尝试剔除任何没有出现在屏幕上的绘图,这意味着"如果精灵的x和y值超出了可见区域的范围,就不要画它"的形式的一般功能,这基本上是大多数基于贴图的游戏处理这个问题的方法。

如果你画的是小方块,听起来你是在手工画。我认为更明智的做法是继续在画布上绘制,但要小心管理精灵数,避免出现过多的循环迭代帧更新在可能的地方循环。用绘图操作来最大化你的小手机是相当容易的。

另一种选择可能是将整个位图一次性绘制到内存中,然后使用复制矩形操作将图像传输到屏幕上,而不绘制您创建的完整位图。我认为copy rect通常应该是一个快速的操作,但如果你用它来绘制整个屏幕,它似乎有点多余,可能不会工作得很好

您可能不喜欢这样,但如果您所做的只是绘制框和线,那么画布的效率将非常高。你是否出现了UI延迟或其他问题?

我搞混的一件事是绘制子组件集合,这些子组件不会改变太多或根本不会改变位图,然后渲染(缩放/移动如果在正确的级别上完成并不那么昂贵)到画布可以帮助提高效率。我过去曾尝试创建一个框架,用于渲染现有较大图像的类瓷砖子集,但没有取得太大成功。我已经让事情工作了,但是代码变得很难看。

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

最新更新