2008-10-02 78 views
2

我正在制作一款游戏,我需要让玩家通过镜头(例如放大镜)看一架飞机(如墙壁)。游戏将在iPhone上运行,所以我的选择是Core Animation或OpenGL ES。在2D场景上创建“放大镜”的最佳方式是什么?

我的第一个想法(我还没有尝试过)是使用Core Animation来做到这一点。

  1. 使用CALayers创建墙和对象。
  2. 使用CALayer的renderInContext:方法创建墙的图像作为背景图层。
  3. 将图像裁剪成镜片形状,将其放大,然后在背景上绘制。
  4. 在上面画出镜框和“玻璃光泽”层。

注:

  • 我多了很多熟悉的Core Animation比OpenGL的,所以也许有一个更好的方法与OpenGL的做到这一点。 (请告诉我!)
  • 如果我使用未连接到视图的CALayers,是否必须自己管理所有动画?还是有一种直接的方式来手动运行它们?
  • 3D透视并不重要;我只是放大平坦的墙壁。
  • 我担心上面的所有操作对于流畅的动画来说太慢了。

之前,我犯了很多代码写这个,我的问题是你看到任何缺陷在上面的计划,也可以推荐一个更简单的方法来做到这一点?

回答

2

这就是我如何去做,这听起来像一个很好的计划。

无论你选择OGL还是CA,基本原理都是一样的,所以我会坚持你更自在的。

  1. 确定你希望放大
  2. 渲染这一地区单独的表面
  3. 渲染任何边界/覆盖的区域在表面上
  4. 的渲染你的面扩大到主场景中,适当地修剪。

就性能而言,您将不得不尝试一下,看看(只要确保在实际硬件上测试,因为模拟器比硬件快得多)。如果速度缓慢,那么你可以少看2/3步,例如每2-3帧。这会给一些放大倍数滞后,但它可能是完全可以接受的。

我怀疑OGL/CA之间的性能大致相当。 CA建立在OGL库的顶部,但您的成本将用于实际渲染,而不是在层中花费的时间。

+0

CA比OGL慢很多。实际上,速度变慢。 – lajos 2008-10-03 00:37:54

+0

你是怎么得到你的数字的?在原始图像构成方面,这不是我的经验。到目前为止,瓶颈是光栅化图像的时间。 – 2008-10-03 00:42:48

3

我已经在iPhone上使用UIView实现了放大镜。 CA太慢了。

您可以使用它的drawRect方法将CGImage绘制到UIView中。下面是我的drawRect的步骤:

  1. 获得当前的背景下
  2. 创建路径剪裁的视图(圈子)
  3. 规模当前变换矩阵(CTM)
  4. 移动当前变换矩阵
  5. 绘制CGImage

您可以将CGImage预先渲染,然后它在图形内存中。 如果您想要动态的东西,请从头开始绘制,而不是绘制CGImage。

非常快,看起来不错。

相关问题