在我的flex应用程序中,我有一个以模态方式弹出的自定义TitleWindow。当我调整浏览器窗口的大小时,我收到此警告:
警告:过滤器不会渲染。 DisplayObject的过滤尺寸(1286,107374879)太大而无法绘制。
显然,我没有设置高度为107374879。
之后,每当我将鼠标悬停在Flash Player中的任何内容(第10节)时,CPU都会以100%的速度进行搅拌。当我关闭TitleWindow时,问题就会消退。遗憾的是,警告似乎并不表示哪个DisplayObject对象太大而无法绘制。我已经尝试将明确的高度/宽度附加到TitleWindow及其中的组件,但仍然没有运气。
[编辑]
情节变厚: 我发现只有当我将PopUpManager的createPopUp模态参数设置为“true”时才会出现问题。当模态设置为“false”时,我没有看到行为。将灰色过滤器应用于来自模态的其他组件时失败了。有什么想法我如何追踪尚未初始化但在模态阶段过滤的一个物体?
感谢阅读。
答案 0 :(得分:3)
在你的应用程序中可能不是这种情况,但是我遇到过类似的情况,其中一个对象的高度或宽度被设置为一些不合理的大数,因为在计算中误用了无符号整数,高度或宽度。
这种情况的示意图代码可能是这样的:
var offset:uint = 30;
var position:uint = txt.textHeight - offset;
divider.y = position;
代码错误地假定txt.textHeight总是大于30.如果不是,则txt.textHeight - offset将是一个负数,当存储在uint中时将变为非常大的数字。
例如,假设txt中的文本(假定为长多行文本)是一条20像素高的单行。结果将为-10,当存储在uint var位置时,position的值将为4294967286。
以上是糟糕的代码,一个例子,但在现实世界的情况下,uint问题可能以更复杂的方式发生,可能更难立即发现。我想对于像x和y位置这样的东西使用无符号整数很少是一个好主意,它可以有负值。
答案 1 :(得分:3)
您可以编写一些代码来递归地降低DisplayObjectContainer和DisplayObject对象的层次结构,并检查较大的高度。
写起来应该很简单。像这样的函数应该可以解决这个问题:
function RecurseDisplayObjects(DisplayObject obj):void
{
//check for height and do a trace() or whatever here
if(obj is DisplayObjectContainer)
{
var container:DisplayObjectContainer = obj as DisplayObjectContainer;
for(var i:int=0; i<container.numChildren; i++)
{
RecurseDisplayObjects(container.getChildAt(i);
}
}
}
您需要通过在应用程序中传递顶级DisplayObject来启动它。 (可能使用DisplayObject.root获得)
您拥有的另一个选择是获取Flex框架源并对其进行修改,以便为您提供更有意义的错误。
答案 2 :(得分:1)
问题可能不在你的TitleWindow中,而是在它下面的对象中。无法渲染的滤镜可能是模糊滤镜闪光适用于模态对话框下方的所有内容。如果舞台上的其中一个对象太大而无法实时应用模糊,则会出现您提到的错误。
我通过在标题窗口下方的对象上应用蒙版来解决该问题,设置为舞台的大小。这可能会解决你的问题,但你应该明白为什么东西达到那个大小,听起来不健康。 : - )
答案 3 :(得分:0)
http://www.mail-archive.com/flashcoders@chattyfig.figleaf.com/msg48091.html
答案 4 :(得分:0)
我遇到了类似的问题,将其追踪到应用于缩放到-0.23453422334的对象的Alpha滤镜。一旦我将比例舍入为2位有效数字,一切正常。但是要追查一个很难的错误。