2011-08-18 154 views
0

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

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

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

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

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

感谢, Direz

+0

你可以将网络分成几个较小的位图,但你不能同时拥有网络的所有部分。只有当用户平移到该区域时,才可以创建屏幕外片段。 – Ronnie

回答

0

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

我弄糊涂的一件事是绘制子组件的集合,它们不会变化太大或根本不变成位图,然后在画布上渲染(如果在正确的级别上执行缩放/移动并不是那么昂贵)可以帮助效率。过去我曾尝试创建一个框架来呈现现有较大图像的类似瓦片的子集,但没有取得太大的成功。我做了一些工作,但代码变得很难看。

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

+0

谢谢你的帮助 – Direz

1

我的第一个问题,你是多少精灵你去一次?到目前为止,屏幕上有许多精灵的最快机制是使用OpenGL,因为硬件加速。在Android上,我发现这样做的方式就是使用Google项目上提供的Cocos2d android(不要与ios版本混淆)。你将不得不使用IOS文档来了解它,但是有一些体面的教程可以开始在线..特别是,这里有你好的世界模板...... www.wwchchina.com.cn/Blog/p?= 8。它与最新的IOS cocos2d相比已经过时了,但那是可以预料的。我发现,在我的实验中没有连接到活动的调试器会话时,程序运行得更快。

如果您想坚持使用您当前的方法,或者上面的方法仍然不够快,您将不得不试图挑选任何未在屏幕上显示的图形,这意味着形式的一般功能“如果精灵的x和y值超出了可见区域的范围,不会画出“这基本上是大多数瓷砖基础游戏处理问题的方式。

这听起来像你正在做手动绘图,如果你正在做小方块。我认为继续前进并在画布上绘制更具建议性,但要小心处理精灵数量并避免在可能的情况下发生在帧更新循环上的重迭循环迭代。用绘图操作最大限度地减少你的小手机是相当容易的。

另一种选择是将整个位图一次绘制到内存中,然后使用复制矩形操作将图像传输到屏幕,而不绘制已创建的完整位图。我认为copy rect应该是一个快速的操作,但是如果你使用它来画整个屏幕,看起来好像是过度杀伤,可能也不会工作。

+0

感谢您的意见。关于你最后的消化,我不能在内存中绘制整个位图,因为我得到了带有createbitmap函数的OOM ... – Direz