我希望在Flex / AS3中实现三个位图上的特定按位逻辑运算。它可能必须使用DisplayObject混合模式,ColorMatrix滤镜的某些组合,以及可能还有其他我没有想到的东西,因为FLex / As3在像素上没有按位逻辑运算(BlendMode.INVERT除外)。 / p>
所以这是操作:
(B& S)| (F& ~S)
[其中B,S,F是三个位图]
就是这样。
顺便说一下,我用Pixel Bender试过这个,但令人难以置信的是,它也没有按位逻辑操作。 (你到底在想什么Adobe)。所以我模拟它们没有大约50模数和分歧但它出来的方式太慢了。 (可能是因为我没有支持的图形卡,这会带来另一个问题 - 如果Pixel Bender仅适用于某些卡,如果浏览器计算机有支持的卡,如何在运行时从Flex / AS3中找到它。)< / p>
但无论如何,我的主要问题是如何在Flex / AS3中执行上面那个微不足道的小位操作。 (它必须和BlendModes一样快。)
答案 0 :(得分:1)
我在使用按位操作方面不是很有经验,但我使用花哨的新Flash播放器10向量组合了一个快速测试用例,这对于这种类型的数据争用非常好。
使用我的计算机上的独立调试播放器,它在115ms内运行2000x2000像素,在发布播放器中可能会快一点。
我不确定这是否足够快,因为我不知道你需要多长时间或多大的图像来运行它,但它至少可能是一个起点。
package {
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.utils.getTimer;
/**
* ...
* @author Martin Jonasson
*/
public class Test extends Sprite {
public function Test() {
var output:TextField = new TextField();
output.autoSize = "left";
addChild(output);
var bmpB:BitmapData = new BitmapData(2000, 2000, false, 0xff00ff);
var bmpS:BitmapData = new BitmapData(2000, 2000, false, 0xffffff);
var bmpF:BitmapData = new BitmapData(2000, 2000, false, 0x000000);
var rect:Rectangle = new Rectangle(0, 0, 2000, 2000)
var vecB:Vector.<uint> = bmpB.getVector(rect);
var vecS:Vector.<uint> = bmpS.getVector(rect);
var vecF:Vector.<uint> = bmpF.getVector(rect);
var vecFinal:Vector.<uint> = new Vector.<uint>(vecB.length, true);
var startTime:int = getTimer();
for (var i:int = vecB.length - 1; i >= 0; --i) {
vecFinal[i] = (vecB[i] & vecS[i]) | (vecF[i] & ~vecS[i]);
}
output.appendText("bitwise stuff done, took: " + (getTimer() - startTime) + "ms \n");
startTime = getTimer();
var bmpFinal:BitmapData = new BitmapData(2000, 2000, false);
bmpFinal.setVector(rect, vecFinal);
output.appendText("created bitmapdata, took: " + (getTimer() - startTime) + "ms \n");
}
}
}
答案 1 :(得分:0)
至grapefrukt:
1000X1000位图在我的系统上是47毫秒,所以这看起来很有希望(接近标准刷新率,并希望有一些调整)。
我首先学习了Flex 2,因此不了解向量,这显然只是高效的单类型数组。
我需要在某个时候开始向前付款,因为这个论坛很棒(自从我10天前第一次发现它以来,在一些相当模糊的问题上有4个问题。)
再次感谢。