Android 在位图上绘制与直接在画布上绘制

Android 在位图上绘制与直接在画布上绘制,android,canvas,bitmap,Android,Canvas,Bitmap,在我的应用程序中,我需要画一个大的网络(基本上是用线连接的小盒子),用户将能够缩放和平移它 我的第一个选择是直接将网络绘制到画布上,但我认为这不是很有效,因为每次pan事件发生时,绘制过程都会再次开始 因此,我尝试使用一个大的可变位图,只绘制一次整个网络(或者至少在缩放发生时),并将必要的区域拼接到画布上 我的问题是,由于网络相当大,我在创建位图时遇到OOM异常 我该怎么办?直接画到画布上?使用几个较小的位图 谢谢, 迪雷斯我问你的第一个问题是你一次有多少个精灵?到目前为止,由于硬件加速,在屏幕

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

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

因此,我尝试使用一个大的可变位图,只绘制一次整个网络(或者至少在缩放发生时),并将必要的区域拼接到画布上

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

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

谢谢,
迪雷斯

我问你的第一个问题是你一次有多少个精灵?到目前为止,由于硬件加速,在屏幕上显示多个精灵的最快机制是使用OpenGL。在安卓系统上,我发现这样做的最佳方式是使用谷歌项目上提供的Cocos2d安卓系统(不要与ios版本混淆)。为了理解它,你必须使用IOS文档,这里有一些不错的在线入门教程。特别是这里的hello world模板。。。Www.sketchydroide.com/Blog/p?=8。与最新的IOS cocos2d相比,它已经过时了,但这是意料之中的。在我的实验中,我发现程序在未连接到活动调试器会话时运行得更快

如果您想坚持当前的方法,或者上述方法仍然不够快,则必须尝试剔除屏幕上未显示的任何图形,这意味着“如果精灵的x和y值超出可见区域的边界,请不要绘制”形式的一般功能这就是大多数平铺游戏处理这个问题的基本方式

如果你在做小正方形,听起来像是在手工绘制。我认为更可取的做法是继续在画布上绘制,但要非常小心地管理精灵计数,避免在画布上发生重for循环迭代 帧更新将尽可能循环。这是相当容易的最大化您的小手机与绘图操作


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

你可能不会喜欢这个,但是如果你所做的只是绘制框和线,画布的效率将会非常高。你是不是有点UI滞后

有一件事我搞砸了,那就是画一些不会有太大变化或根本不会变化的子组件集合到位图,然后在画布上渲染(如果在正确的级别上进行缩放/移动,成本不会太高)可以提高效率。我过去曾尝试创建一个框架,用于渲染现有较大图像的类似平铺的子集,但没有获得太多成功。我已经把事情做好了,但是代码变得很难看


哦,还可以快速测试您正在渲染的组件是否在屏幕创建的矩形内,这样可以节省大量处理器时间。

您可以将网络划分为几个较小的位图,但不能同时拥有网络的所有部分。只有当用户平移到该区域时,您才能创建屏幕外的片段。谢谢您的评论。关于你上次的建议,我无法在内存中绘制整个位图,因为我使用createbitmap函数获得OOM。。。