1

该项目是用 as3 编写的,使用 AIR 28.0 打包,并在 Android 7 设备上运行(在 Windows 桌面环境中运行时运行良好)。

在我的 Android 7 (S7) 上,被 scrollRect 从视图中隐藏的对象仍在接收鼠标事件,但当我在桌面环境中运行相同的应用程序时却没有。

这是 Android 还是 AIR 错误?还是我做错了什么?

例子:

EDIT: (Original code example was incomplete see edit below)
var button:Sprite = new Sprite();
button.graphics.beginFill(0x00FF11, 1);
button.graphics.drawRect(0, 0, 50, 50);
button.graphics.endFill();
addChild(button);

button.addEventListener(MouseEvent.CLICK, buttonClick);

var outer:Sprite = new Sprite();
var square:Sprite = new Sprite();
outer.cacheAsBitmap = true;
outer.addChild(square);
var rect:Rectangle = new Rectangle(0, 0, 50, 50);
outer.scrollRect = rect;
addChild(outer);
outer.y = 50;

square.graphics.lineStyle();
square.graphics.beginFill(0x000000, 1);
square.graphics.drawRect(0, 0, 100, 100);
square.graphics.endFill();

square.addEventListener(MouseEvent.MOUSE_DOWN, squareDown);
square.y = -50;

在此示例中,在内部对象中绘制的矩形仅在 outer.scrollRect 中可见(因此是 50x50 而不是 100x100),并且按钮对象在其上方可见。当可见按钮上发生单击事件时,将触发 innerClick 事件,而不是 buttonClick 事件。

似乎被应用的 scrollRect 隐藏的内部容器的不可见部分仅在视觉上隐藏并且仍然阻止输入事件。

该应用程序正在通过我的 IDE (Flash Builder) 进行编译和安装。我尝试了不同版本的 IDE 和 AIR SDK,结果相同。

任何帮助将不胜感激。

编辑:

我发现了 scrollRect 正常工作的实例,因此进行了进一步测试以缩小错误范围。

删除线:

outer.cacheAsBitmap = true;

...解决了这个问题。将 cacheAsBitmap 应用于方形对象本身也仍然可以正常工作。

出于某种原因,将 cacheAsBitmap 应用于具有 scrollRect 的对象会导致此错误,但将 cacheAsBitmap 应用于更下游的子对象可以正常工作。

我没有足够的经验来了解性能影响或为什么建议使用 scrollRect 将 cacheAsBitmap 添加到对象中。也许其他人可以告知。

4

1 回答 1

1

scrollRect属性可能是使用矩形掩码剪辑某些内容的最性能明智的方式(使用常规 Flash 内容)。

cacheAsBitmap属性使 Flash Player 无需渲染对象的内容,除非对象内部发生了变化。

简而言之。想象一页插图丰富的童话书:一张过于复杂的矢量图片,有很多细节,一些带有花哨字体的文本等。你把它放在舞台上,Flash Player 需要渲染所有这些:矢量填充和笔触,花哨的字体. 然后,在几帧的过程中你不需要改变任何东西,Flash Player 不需要渲染任何东西,这很好。然后你将这个页面向右移动 1px,然后——猜猜看——Flash Player 需要再次渲染整个内容。

在该页面下、在该页面上或对该页面的任何更改——该页面边界框内的任何内容——都会使 FP 再次呈现页面的全部内容——这将对性能造成相当大的影响。

使用cacheAsBitmap允许 FP 只渲染一次,因此只有对该页面的内部更改才会使 FP 再次渲染它,其他任何东西都会使 FP 只使用缓存版本,这比一遍又一遍地渲染它更快。我同意,这可能是移动设备的解决方案,因为它们速度慢且缺乏 CPU。

因此,如果您的应用具有以下元素:

  • 包含复杂的矢量形状和文本
  • 是静态的或很少变化的
  • 不是太大

然后您可以使用cacheAsBitmap = true缓存它们,以牺牲 RAM 为代价获得一些性能。

然而。

如果您正在构建商店级产品,而不仅仅是学校项目或个人娱乐,我建议您研究Gamua Starling,因为您永远无法让您的应用程序在正常的 Flash 内容下运行顺畅。一旦你需要重新绘制整个屏幕,FPS 就会掉到海底,因为 Flash 需要 CPU,而移动设备则缺乏 CPU。另一方面,Starling 利用Stage3D和设备的GPU 资源,因此您可以毫不费力地以 60 FPS 的速度运行过于丰富和动画的东西。

于 2018-01-06T19:56:01.153 回答