我的目标是拥有低分辨率的圆圈(非常像素化)。我知道还有其他方法可以做到这一点,但我试图了解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;右边的像素:
非常感谢任何见解!
答案 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
时,缓存会更新。这就是为什么你永远不会看到你圈子的像素化版本。