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

时间:2020-03-06 15:03:07  来源:igfitidea点击:

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

我的第一个想法(我尚未尝试过)是使用Core Animation进行的。

  • 使用CALayers在其上创建墙和对象。
  • 使用CALayer的renderInContext:方法创建墙的图像作为背景层。
  • 将图像裁剪为镜头形状,按比例放大,然后在背景上绘制。
  • 在所有镜头上方绘制镜头框和"光泽玻璃"层。

笔记:

  • 与OpenGL相比,我对Core Animation更加熟悉,因此也许有更好的方法来使用OpenGL。 (请告诉我!)
  • 如果我正在使用未添加到视图的CALayers,我是否必须自己管理所有动画?还是有直接手动方式运行它们的简单方法?
  • 3D透视并不重要;我只是在放大一面平坦的墙。
  • 我担心上述所有操作对于平滑的动画来说太慢了。

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

解决方案

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

不管我们选择OGL还是CA,其基本原理都是相同的,因此我会坚持我们更喜欢的内容。

  • 确定我们要放大的区域
  • 将此区域渲染到单独的表面
  • 渲染表面上的任何边界/覆盖
  • 将表面放大渲染到主场景上,并进行适当的裁剪。

在性能方面,我们必须尝试一下才能看到(只需确保我们在实际硬件上进行测试,因为模拟器比硬件要快得多)。如果速度变慢,则可以减少执行第2/3步的频率,例如每2-3帧一次。这会带来一些放大滞后,但这可能是完全可以接受的。

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

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

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

  • 获取当前上下文
  • 创建剪切视图的路径(圆形)
  • 缩放当前转换矩阵(CTM)
  • 移动当前的变换矩阵
  • 绘制CGimage

我们可以预先渲染CGImage,然后将其放置在图形内存中。
如果要动态处理,请从头开始绘制,而不要绘制CGImage。

非常快,看起来很棒。