AS3 cacheAsBitmap混乱

时间:2016-07-13 00:45:14

标签: actionscript-3

我的目标是拥有低分辨率的圆圈(非常像素化)。我知道还有其他方法可以做到这一点,但我试图了解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);
        }

然后在我的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;
    }

而不是左边的大像素,我得到了微小的&#34;真实的屏幕&#34;右边的像素:

enter image description here

非常感谢任何见解!

2 个答案:

答案 0 :(得分:4)

如果您将转换为BitmapData,则可以禁用平滑:

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位颜色,然后调整大小,可能会得到一个像素图像的硬像素。

答案 1 :(得分:2)

  

但是当我以编程方式绘制一个非常小的圆(比如半径为4),然后将其缓存,然后将其放大时,它就会像素化,但非常圆整圆。

事情是,它只是缓存作为位图。它并不像一个人那样行事。 The documentation非常清楚这一点:

  

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

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

  

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

它基本上&#34;烘烤&#34;将矢量几何体组合成幕后的像素,这样它就不必进行计算以反复显示它。

转换DisplayObject时,缓存会更新。这就是为什么你永远不会看到你圈子的像素化版本。