Scaleform BitmapData:无效的位图数据

Posted

技术标签:

【中文标题】Scaleform BitmapData:无效的位图数据【英文标题】:Scaleform BitmapData: Invalid Bitmapdata 【发布时间】:2016-12-13 10:52:50 【问题描述】:

我正在尝试在我们的 UI 中添加“着火效果”。 我正在使用 BitmapData 和 PerlinNoise 以及其他一些方法来实现这一点。

当我对 BitmapData 所做的任何事情都会导致此错误时,问题就出现了:

 ArgumentError: Error #2015: Argument error: Invalid BitmapData.
    at effects::FireFX/updateBitmaps()...

像这样简单的事情会导致错误出现。

displayBmp = new BitmapData(200, 200, true, 0);
scratchBmp = displayBmp.clone();

就我而言,clone() 或 perlinNoise() 或 colorTransform.... 等函数会导致崩溃。

在 Animate CC 下调试/运行效果很好。

PD:发布到 Flash 10.3,使用 Scaleform:4.1.19

谢谢

【问题讨论】:

错误 2015 可能是由 BitmapData 的宽度或高度为零引起的 检查是否内存不足。 不涉及Scaleform是否有效?仅使用 AS3 代码声明 var displayBmp : BitmapData;var scratchBmp : BitmapData; 然后我可以使用您显示的代码进行克隆而不会出现问题。甚至将 scratchBmp.width 跟踪为 200。也许您应该发布一个完整但最小的代码供我们测试/重新创建您的问题。 一切都可以在没有 scaleform 的情况下工作。 Width 和 Height 都经过了上面提到的测试,足以导致崩溃。 对不起哥们,我上次读得太快了。那就没有头绪了。如果这是我的问题,我会尝试示例new BitmapData(200, 200, false, 0xFF0000);,以确保在您显示的transparency=true0 的颜色十六进制之间,它不会生成没有像素可克隆的空位图数据。至少在使用.clone 之前尝试displayBmp.draw(something);。如果在.drawing 之后数据仍然无效,那么您在其他地方遇到了问题... 【参考方案1】:

Scaleform 从 4.1 版 (reference) 开始支持 BitmapData API。但是,4.1.19 是 4.1 的第一个版本,因此是支持 BitmapData 的初始版本。您可能需要升级到较新的版本,因为 BitmapData 支持自最初发布以来肯定已经修复。

出现此错误的最常见原因是没有将ThreadCommandQueue 实例作为最后一个参数传递给MovieDef::CreateInstance,并且在第一帧上使用了BitmapData 操作。如果没有ThreadCommandQueue 的实例,渲染器将无法为 Scaleform 中的 BitmapData 对象创建支持。在以后的版本中,Scaleform 中添加了更具描述性的警告。

对于ThreadCommandQueue,您通常需要自己实现它,以便与您的应用程序的呈现代码正确集成。最简单的多线程实现将简单地将ThreadCommand 对象存储在(线程安全)列表中,当从PushThreadCommand 调用时,并在应用程序渲染循环期间的某个时间点对对象调用Execute

在更高版本的 SDK 中,提供了一个名为 SingleThreadedCommandQueue 的类,它提供了一个基本实现,可以立即执行所有命令。这仅在您在同一线程上使用Movie::AdvanceHAL::Display 时有效。您可以看到ThreadCommandQueue 实现的更复杂版本,用于RenderHALThread 类的Scaleform 示例,它将大部分重要实现推迟到RTCommandQueue

【讨论】:

感谢您的回复,非常感谢。我将如何初始化 RenderThread 类以便将其传递给 HAL 构造函数,找不到任何文档。 'RenderThread' 类并不是真正需要的。如果需要,您可以重用示例中的那些(在 Src/Platform 中)。如果你将它集成为一个多线程渲染应用程序,你只需要提供一个 ThreadCommandQueue 的实现。如果你是单线程的,你可以使用 SingleThreadedCommandQueue (help.autodesk.com/view/SCLFRM/ENU/?guid=__cpp_ref_06044_html)。 我无法创建 ThreadCommandQueue 的实例,因为该类实际上是空的。无法以任何方式初始化或实现。我也没有 SingleThreadedCommandQueue。 SingleThreadedCommandQueue 在 SDK 的后续版本中提供。不直接实例化 ThreadCommandQueue,必须实现派生类。 你能发布一个例子来说明你的意思吗?我从来没有真正研究过 Scaleform 的代码部分。谢谢

以上是关于Scaleform BitmapData:无效的位图数据的主要内容,如果未能解决你的问题,请参考以下文章

RangeError [BITFIELD_INVALID]:无效的位域标志或数字

Scaleform 与 Stage3d

链接 Scaleform 以在 Qt Creator 中构建应用程序

Xcode 8.2.1 - 错误:无效的位码版本(生产者:'802.0.41.0_0' 读者:'800.0.42.1_0')

用于游戏开发的 Autodesk Scaleform [关闭]

scaleform 4.4.30 关于opengl的问题