Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flex/Flash/AS3中的Vsync?_Apache Flex_Flash_Actionscript 3_Vsync - Fatal编程技术网

Apache flex Flex/Flash/AS3中的Vsync?

Apache flex Flex/Flash/AS3中的Vsync?,apache-flex,flash,actionscript-3,vsync,Apache Flex,Flash,Actionscript 3,Vsync,我在做一个2D射击游戏,屏幕上有很多移动的物体(子弹等) 我使用BitmapData.copyPixels(…)将整个屏幕渲染到一个缓冲区:BitmapData。 然后我从“缓冲区”复制像素到屏幕:BitmapData。帧率是60 private var bitmap:Bitmap = new Bitmap(); private var buffer:Bitmap = new Bitmap(); private function start():void { addChild(bitm

我在做一个2D射击游戏,屏幕上有很多移动的物体(子弹等)

我使用BitmapData.copyPixels(…)将整个屏幕渲染到一个缓冲区:BitmapData。 然后我从“缓冲区”复制像素到屏幕:BitmapData。帧率是60

private var bitmap:Bitmap = new Bitmap();
private var buffer:Bitmap = new Bitmap();

private function start():void {
    addChild(bitmap);
}

private function onEnterFrame():void {
    // render into "buffer"
    // copy "buffer" -> "bitmap"
}
问题是精灵正在撕裂: 精灵的某些部分水平移动

它看起来像一个关闭了VSYNC的PC游戏

有人解决了这个问题吗

更新:问题不在于性能,而在于消除屏幕撕裂


[!]更新:我已经创建了,您可以在这里尝试两种实现:使用Flash方式或BitmapData+copyPixels()

您可能要做的第一件事是停止将Flash播放器当作DOS来对待。Flash Player是一个高度优化的2D游戏引擎,我真的不明白你为什么要通过复制大量位图切片来重新发明轮子。当然,您会遇到性能问题

FlashPlayer不允许您同步到任何垂直或水平空白,因为FlashPlayer根本没有这方面的概念


我个人认为,如果你想要“更流畅”的动画,你应该重新考虑你的方法。Flash Player当然能够做到这一点,你只是尝试了错误的方法。

不要将内容保存到BitmapData,这会杀死,绝对会杀死你的应用程序。位图数据的性能不是很好


在flash中制作所有游戏元素,如精灵(或MovieClips,如果必须的话),然后将flash作为矢量动画平台来工作。它从未针对2d位图图形进行过优化。2d矢量图形工作得很好,即使你导入位图,它们也可以更好地四处移动,然后渲染到BitmapData对象。

我感觉到了你的痛苦,因为我目前正在开发自己的游戏。在默认设置下,Flash渲染器会产生可怕的屏幕撕裂/v同步问题,而不管生成什么代码

这就是为什么我很高兴找到了最简单、最优雅的答案,那不是重新分解代码(这一点都没有帮助,问题是Flash播放器,而不是代码)

只需在发布设置中启用硬件加速即可。有两种不同的选择:

第一级:直接;和级别2:GPU

在官方文档中阅读更多关于它的信息,并决定什么选项最适合您的游戏

目标市场确实是一个因素,如果这是一个严肃的游戏玩家,你不需要担心可能的性能问题,因为大多数玩家都有GPU


并没有为我提供具体的解决方案,而是引导我走向正确的方向。但是,如果您的游戏将在浏览器窗口中运行,您可能还必须使用相同的技术将wmode设置为direct或gpu。

如果我放弃缓冲并将位图添加为本机Flash Sprite(仍然是位图),那么它会解决VSYNC问题吗?不会。但它看起来会比你现在拥有的要好得多。正如我在回答你的问题时所说,Flash播放器没有vsync的概念。当您将fps设置为60时(这很荒谬,但这并不重要),Flash播放器将尝试生成60 fps。实际上,它几乎永远也无法做到这一点。我发现,确实有很多时候你应该使用Bitmapdata来提高性能。@Matt但你的整个应用程序,每帧都在Bitmapdata对象中渲染?这真是个坏主意。我并不是说位图数据没有用。奇怪的是,拷贝内存中的字节(位图)应该比用数学计算来渲染更容易。Flash中存在“cacheAsBitmap”应该是有原因的。此外,请选中此项:您的精灵(DisplayObject)根本不必是矢量。Flash播放器经过优化以处理此问题。当您开始用位图在ActionScript中重新创建Flash Player已经做得很好并针对其进行了优化的内容时,您就错过了要点。我认为你应该多读一些Tinic Uro的博客:@Luke:如果你的回答提出了一个切实可行的替代方案,而不仅仅是说原来的方法是错误的,那么你的回答会更有用。网上有好几个来源建议在制作2D游戏时使用位图和CopytoPixel,因此不是原始海报在进行改造。您是否知道是否可以为此指定元数据标记属性?(对于FlashDevelop,仅作为游戏开发,没有FLAs)。大致是这样的:[SWF(hardwareAcc=“gpu”)]存在吗?我知道的唯一其他参数是wmode,它可以在嵌入Flash文件的html文件中设置。我相信没有flashide肯定有什么东西可以做到这一点。结论是什么?这确实是Flash播放器的问题,我们不能做任何事情来改善它?是的,也不是。如果在Flash中不启用某种硬件加速,就会出现屏幕撕裂。如果您启用它,Flash将渲染良好。即使使用某些硬件渲染,仍可能发生撕裂。我尝试使用Context3D,速度为60fps,带有context.clear(随机颜色)。撕裂仍然会发生,尽管比以前明显的情况要好一点。其他人是对的,这种方法不太适合flash player。。。不过,我很惊讶,它根本不起作用。。。几个问题:-是否尝试锁定正在绘制的位图数据?(如果没有,这可能会有很大帮助!)-您使用的是透明位图吗?(常规性能杀手)-您是否尝试在
事件上执行
Stage::invalidate
和渲染。是否使用渲染
而不是渲染?greetz back2dos-锁定/解锁没有帮助,因为复制“缓冲区”->“位图”会产生单个事件,所以在这两种情况下都是相同的单个通知-我确实使用透明位图来处理投射-但是,问题不在于性能,而在于