Actionscript 3 AS3缓存和位图混淆

Actionscript 3 AS3缓存和位图混淆,actionscript-3,Actionscript 3,我的目标是制作低分辨率的圆(非常像素化)。我知道还有其他方法可以做到这一点,但我正试图了解cacheAsBitmap是如何工作的。当我使用我绘制的非常小的精灵图纸,然后放大位图时,它看起来很棒(非常块状、像素化、平滑关闭)。好的但当我以编程的方式画一个非常小的圆(比如说半径4),然后缓存它,然后放大它时,它是像素化的,但实际上是一个完整的圆。我认为在屏幕上呈现之前,播放器实际上并没有将其缓存为位图。即使在swf完全加载并运行之前我不会进行放大,我仍然会得到非常圆的大圆圈(但像素化)。是否有一种方

我的目标是制作低分辨率的圆(非常像素化)。我知道还有其他方法可以做到这一点,但我正试图了解cacheAsBitmap是如何工作的。当我使用我绘制的非常小的精灵图纸,然后放大位图时,它看起来很棒(非常块状、像素化、平滑关闭)。好的但当我以编程的方式画一个非常小的圆(比如说半径4),然后缓存它,然后放大它时,它是像素化的,但实际上是一个完整的圆。我认为在屏幕上呈现之前,播放器实际上并没有将其缓存为位图。即使在swf完全加载并运行之前我不会进行放大,我仍然会得到非常圆的大圆圈(但像素化)。是否有一种方法可以通过编程方式缓存某些内容,然后按照导入位图的方式进行放大

我尝试的代码基本上如下所示:

        for (var i: int = 0; i < 200; i++) {
            var size: Number = 8;
            var item: RunnerMassObj = new RunnerMassObj();
            item.graphics.lineStyle(0,0x0,0,true);
            item.graphics.beginFill(0xFF8844 + i * 10);
            if (i < 10) {
                item.graphics.drawCircle(0, 0,size);
            } else {
                item.graphics.drawRect(0, 0, size, size);
            }
            item.graphics.endFill();
            addChild(item);
            item.x = Math.random() * 1000 + 50;
            item.y = Math.random() * 1000;
            item._bottom.y = size;

            // here I cache it as a bitmap.
            item.cacheAsBitmap = true;
            allMassObj.push(item);
        }
for(变量i:int=0;i<200;i++){
变量大小:数值=8;
变量项:RunnerMassObj=新的RunnerMassObj();
item.graphics.lineStyle(0,0x0,0,true);
项目图形填充(0xFF8844+i*10);
如果(i<10){
项目。图形。绘图圈(0,0,大小);
}否则{
item.graphics.drawRect(0,0,大小,大小);
}
item.graphics.endFill();
addChild(项目);
item.x=Math.random()*1000+50;
item.y=Math.random()*1000;
项目。y=尺寸;
//在这里,我将其缓存为位图。
item.cacheAsBitmap=true;
所有质量推送(项目);
}
然后在我的engineTick代码中,我有:

    for(var i:int = 0; i < allMassObj.length; i++)
    {
        // and here I scale it up, expecting the pixels to stay pixelated.
        // has the circle somehow maintained its vector shape?
        allMassObj[i].scaleX = 10;
        allMassObj[i].scaleY = 10;
    }
for(变量i:int=0;i
而不是左边的大像素,我在右边得到了微小的“真实屏幕”像素:


任何见解都将不胜感激

如果将转换为
位图数据
,则可以禁用平滑:

item = new BitmapData(instance.width * scale, instance.height * scale, true, 0x0);

item.draw(instance, m, null, null, null, false); // final false disables smoothing
(不要尝试,但我认为值得一看)

最好的

编辑:另外:尝试调查位图颜色深度附近的内容。如您所知,如果您可以将位图转换为1或2位颜色,然后调整其大小,则可能会得到您想要的硬像素图像

但当我以编程的方式画一个非常小的圆(比如说半径4),然后缓存它,然后放大它时,它是像素化的,但实际上是一个完整的圆

问题是它只是缓存为位图。它不像一个。这一点非常清楚:

cacheAsBitmap
属性设置为
true
后,渲染不会更改

cacheAsBitmap
的目的是提高不发生变化的复杂矢量数据的渲染性能:

如果设置为
true
,Flash运行时将缓存显示对象的内部位图表示。这种缓存可以提高包含复杂矢量内容的显示对象的性能

它基本上是在幕后将向量几何体“烘焙”成像素,这样就不必反复计算来显示它


转换
DisplayObject
时,缓存将更新。这就是为什么你从来没有看到过你的圆圈的像素化版本。

+1感谢你给了我向这个方向前进的信心。我以为这只是为了消除混叠。我终于让它工作了,减去了一些必要的tweek,但我得到了粗像素。我会用完整的工作代码编辑你的答案。谢谢你的关注。我很高兴看到你找到了自己的路。上帝保佑,谢谢你的澄清!非常感谢!