2

我正在开发一款游戏,我需要让玩家通过镜头(例如,放大镜)观察飞机(例如,墙壁)。游戏是在 iPhone 上运行的,所以我的选择是 Core Animation 或 OpenGL ES。

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

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

笔记:

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

在我提交大量代码来编写此代码之前,我的问题是您是否看到上述计划中的任何陷阱,或者您能否推荐一种更简单的方法来做到这一点?

4

2 回答 2

3

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

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

  1. 获取当前上下文
  2. 创建用于剪切视图的路径(圆形)
  3. 缩放当前变换矩阵 (CTM)
  4. 移动当前变换矩阵
  5. 绘制CG图像

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

速度非常快,看起来很棒。

于 2008-10-03T00:45:06.740 回答
2

我就是这样做的,这听起来是个不错的计划。

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

  1. 确定您要放大的区域
  2. 将此区域渲染到单独的表面
  3. 将任何边框/叠加层渲染到表面上
  4. 将放大的表面渲染到主场景上,适当地进行裁剪。

在性能方面,您将不得不尝试并查看(只需确保您在实际硬件上进行测试,因为模拟器比硬件快得多)。如果速度变慢,那么您可以考虑减少执行步骤 2/3 的频率,例如每 2-3 帧。这会产生一些放大滞后,但它可能是完全可以接受的。

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

于 2008-10-02T23:29:34.050 回答