【发布时间】:2013-03-04 19:09:48
【问题描述】:
我正在寻找有关动画内容的最佳渲染(以及可能的缓存)的建议,这些内容的性质在运行时确定并且无法预先计算。
我正在开发我的第一个 Android 应用程序,并决定开发一个(当前)“玩具”项目,该项目采用相对较短的字母数字代码并将它们转换为图像和动画。 (SourceForge 项目在http://sourceforge.net/projects/picturecode,设计文档在https://docs.google.com/file/d/0B-yO-2scTVuRSkk2NDdiZ3YzTDg/edit?usp=sharing)
我正在设计用于在其他代码中嵌套预定义和用户定义代码的操作,以允许更复杂的图像使用更短的代码。我也在尝试设计相关的操作,以相对简单的代码表示来帮助制作同样复杂但有趣的图像。
因此,我认为有用的操作之一是能够使用预定义或用户定义的代码作为掩码来剪辑其他绘图操作。在我发现硬件加速视图不支持 clipPath 并强制视图基于软件后,我得以实现此功能。 (我的渲染器检查我们是否处于定义“剪切路径”并将操作添加到路径而不是在画布上绘制它们的模式,但这有点乏味并且不支持所有操作。)
我正在考虑切换回硬件加速模式的替代方案。我想到的是创建一个 ALPHA_888 位图并绘制到该位图,而不是在我处于该剪切模式时创建剪切路径。这可能具有的一个优点是支持任意操作会更直接。当我处于剪切模式时,我只是在该位图上而不是在主画布上绘制它们。一旦我有了位图,我假设我可以使用具有适当 PorterDuff 模式的 Paint 以某种方式将它与 drawBitmap 一起使用(进入另一个中间位图)。
我希望有一天我(或任何人,因为该项目在 SourceForge 上)可能会在更大的项目中重用这个组件,作为表示可以以纯文本传输但简短/优化的图形的轻量级方式格式。我将其视为动画 GIF,但创建起来更简单,传输也更小。
我的问题是:
- 一般来说硬件加速有多重要?这是保留的重要功能还是应该放弃它以支持其他功能? (如果其他人要使用此功能,我假设他们通常希望组件与硬件加速兼容。)
- 屏蔽是一项强大/重要的操作,还是我可以使用更好的方法(例如直接在画布上进行纯 porter-duff-filtered 绘图)?
- 我是否正在考虑实施复杂屏蔽的正确轨道?
最后也是最重要的:
- 我应该如何使用和管理位图(例如,掩码位图)?当我开始这个项目时,我注意到在 OnDraw 期间分配任何新对象是不可取的。所以我预先分配了所有我可以使用的东西——一个 Paint、一个 PointF、一个 RectF、一个 Path 和其他一些,以便我可以在 onDraw 期间使用它们。目前,我仍在直接绘制到画布上,但我想知道是否应该在单独的线程上渲染到某种缓冲区,如位图,然后在 onDraw 期间将缓冲区绘制到屏幕上。这是否会破坏硬件加速的目的(并且首先不需要关闭视图本身的硬件加速)?更重要的是,我如何/何时可以安全地分配这些位图而不会冒犯 lint 和经验丰富的 android 开发人员,他们知道在 onDraw 期间分配内存是不好的?如果我在单独的绘图线程上分配位图,我可能必须为每个包含/嵌入图片的每一帧分配一次,因为这些图片可以是动画。或者我可能只想为当前帧分配一个位图,以帮助剪辑或合成多幅图像。
很难将其缩小到一个非常具体的问题。我所拥有的介于一堆问题和关于我什至可能不知道的功能或想法的一般建议之间。我对 Java 和 Android 开发比较陌生,但对 C#、2D 图形和游戏开发非常熟悉。我的问题是否指出了我对 2D 动画在 Android 上应如何工作的理解中存在的任何明显漏洞?
【问题讨论】:
-
PorterDuff可以做的一些很好的例子是here。另一方面,SVG 不是已经这样做了吗? -
SVG 是一个很好的替代品 except 最重要的功能让我首先开始这个项目 - 它不是纯文本(无法复制和粘贴到纯文本字段中),并且可能不像纯文本那样紧凑。我的第二个目标是确保每个可能的代码都是有效的代码,而 SVG 也无法做到这一点。