在2D场景上创建“放大镜”的最佳方法是什么?

时间:2008-10-02 21:44:09

标签: iphone objective-c opengl core-animation

我正在开发一款游戏,我需要让玩家通过镜头(例如放大镜)看一个平面(例如墙壁)。该游戏将在iPhone上运行,因此我的选择是Core Animation或OpenGL ES。

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

  1. 使用CALayers在其上创建墙和对象。
  2. 使用CALayer的renderInContext:方法将墙的图像创建为背景图层。
  3. 将图像裁剪为镜头形状,将其放大,然后将其绘制在背景上。
  4. 在所有镜头上绘制镜框和“闪亮玻璃”层。
  5. 注意:

    • 我对核心动画比OpenGL更熟悉,所以使用OpenGL可能有更好的方法。 (请告诉我!)
    • 如果我使用未附加到视图的CALayers,我是否必须自己管理所有动画?或者有一种直接的方式来手动运行它们吗?
    • 3D视角并不重要;我只是放大一面墙。
    • 我担心上面的所有内容对于流畅的动画来说太慢了。

    在我提交大量代码编写本文之前,我的问题是您是否看到上述计划中存在任何陷阱,或者您是否可以建议更简单的方法来执行此操作?

2 个答案:

答案 0 :(得分:3)

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

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

  1. 获取当前上下文
  2. 创建剪裁视图的路径(圆圈)
  3. 缩放当前转换矩阵(CTM)
  4. 移动当前转换矩阵
  5. 绘制CGimage
  6. 您可以预先渲染CGImage,然后将其放在图形内存中。 如果你想要动态的东西,请从头开始绘制而不是绘制CGImage。

    非常快,看起来很棒。

答案 1 :(得分:2)

我就是这样做的,这听起来像个好计划。

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

  1. 确定您要放大的区域
  2. 将此区域渲染到单独的表面
  3. 渲染表面上的任何边框/叠加层
  4. 将表面放大到主场景,适当剪裁。
  5. 在性能方面,您必须尝试并查看(只需确保您在实际硬件上进行测试,因为模拟器远远快于硬件)。如果它变慢,那么你可以看一下不太频繁地做2/3的步骤,例如每2-3帧。这会产生一些放大延迟,但可能完全可以接受。

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