在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。
非常快,看起来很棒。