Actionscript 3 AS3缓存和位图混淆
我的目标是制作低分辨率的圆(非常像素化)。我知道还有其他方法可以做到这一点,但我正试图了解cacheAsBitmap是如何工作的。当我使用我绘制的非常小的精灵图纸,然后放大位图时,它看起来很棒(非常块状、像素化、平滑关闭)。好的但当我以编程的方式画一个非常小的圆(比如说半径4),然后缓存它,然后放大它时,它是像素化的,但实际上是一个完整的圆。我认为在屏幕上呈现之前,播放器实际上并没有将其缓存为位图。即使在swf完全加载并运行之前我不会进行放大,我仍然会得到非常圆的大圆圈(但像素化)。是否有一种方法可以通过编程方式缓存某些内容,然后按照导入位图的方式进行放大 我尝试的代码基本上如下所示:Actionscript 3 AS3缓存和位图混淆,actionscript-3,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);
}
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,但我得到了粗像素。我会用完整的工作代码编辑你的答案。谢谢你的关注。我很高兴看到你找到了自己的路。上帝保佑,谢谢你的澄清!非常感谢!