![]() |
1
9
我不知道这里是否有黄金答案,但我有一些建议。 首先,我不需要对优化math.pi/180等问题进行任何查询。通常较高的帧速率应该清楚地表明,简单的计算不会减慢任何速度。 其次,要解决显示延迟的偶尔峰值:在我看来,这些非常像垃圾收集器运行非常频繁。通过非常简短的代码检查,我没有发现任何导致频繁使用GCS的明显原因,但我有两个建议。首先,如果您可以访问flash-ide,我将尝试在不使用flex框架的情况下重新创建您的项目。一个flash项目不包含任何代码,除了你输入的代码,但是flex使用了很多它自己的秘密,这可能并不总是显而易见的,并且你的代码和框架之间的一些交互可能导致GCS。 如果这不起作用,另一个尝试是生成一个大大简化的代码版本(如果可能的话,使用flash),希望它足够简单,不会触发相同的峰值。我的意思是,例如,一个附加到图形的类,它只有一个用于关键事件的监听器和一个用于帧(或计时器)事件的第二个监听器,其中不创建变量。如果一个最小版本没有显示这些峰值,那么应该可以在这个版本和您的完整客户机之间进行三角定位,找出导致峰值的原因。 最后,关于一般的平滑度,我唯一的评论是flash的屏幕更新本质上是稍微不均匀的,实际上您只有两种方法可用。要么根据帧更新移动演员,这会使他们的移动随帧速率的变化而略有不均匀,要么根据经过的时间移动演员,这会使他们的整体移动平滑(以每秒像素为单位),但他们的显示略有不均匀(以每帧移动的像素为单位)。差异在较高的fps下放大。 另外,重要的是要记住,在Flash进行更新后,它们在屏幕上的显示方式会受到视频卡的严重影响。特别是,您会发现剪切和垂直同步问题在一个环境中非常明显,而在另一个环境中却不存在。开发人员没有真正的方法来解决这个问题,除非通常避免非常高的fps动画,并尽可能降低整个处理器的负担。 编辑: 有关我所说的帧更新时间“本质上不均匀”的更多信息,请参见 this blog post . 屏幕更新之间的延迟介于12-16毫秒之间,这不是您可以做的事情;这是操作系统和浏览器影响Flash计时工作方式的结果。(这也是你在一部空电影中也会看到的东西,这就是为什么这条关于优化数学等的评论对你没有帮助。)你不能避免这种变化,但是正如我上面所说,你可以调整你的视觉效果来唤起你想要的效果。不管怎样,我认为尖峰更值得担心。你所看到的变化是微妙的,在一个有很多东西的游戏中很难被注意到,但是尖峰是令人震惊的。 编辑2 你问:“你真的认为那些流畅的游戏和我一样使用相同的移动算法吗?” 答案是,我认为他们做的事情要简单得多。他们几乎肯定在做以下工作之一:
换句话说,要么每帧移动一个恒定的距离,要么每秒移动一个恒定的距离。这是两种最简单的方法,你可以达到这一点,这两个选项将导致在闪光灯最平滑的外观。在恒定的帧速率下,它们看起来是相同的,后一种方法在稍有变化的帧速率下看起来更平滑,原因与您链接的文章中提到的“时间混叠”类似。但是,在这些方法之间的选择真的可以归结为,如果CPU出现尖峰,在它结束后,你想让飞船继续移动还是不?这真是一个游戏设计问题。我过去做过的一件事是在夹紧时使用第二种方法
正如您可能注意到的,我刚才推荐的两种方法正是“修复时间步骤”的方法。文章说不要做。这是因为这篇文章是关于数值积分物理引擎的,而这不是你要做的。如果您开始实现弹簧和重力,那么是的,每当时间步长变大时,都会引入大量的错误,因为对于这种模拟,为了使事情过于简单化,错误取决于时间步长的大小。在您所做的工作中,它没有,因此偶尔的大时间步骤不会影响模拟的正确性。 回复更新6 首先,我没有告诉你你的问题是你的表现,我说的恰恰相反。我建议进行最小限度的复制,因为我认为你的问题不是在你的项目中的某个地方,就是不可避免的,我仍然这样做。第二,我现在很舒服地说,你做的事情和其他任何一款Flash游戏都是一样的,无论你看到什么问题,除了感知之外都无法解决。在您发布的新链接中,如果我在独立的SWF播放器中查看动画,动画看起来非常平滑,并且在浏览器的前后边缘有细微的闪烁(在Firefox中比在IE中更常见)。从技术上讲,我认为它无法改进(特别是当它在独立播放器中基本上是完美的,这意味着浏览器中的任何不稳定都会受到容器的影响。) 当然, 感知 性能仍然可以提高。例如,如果飞船没有与背景形成如此鲜明的对比,那么闪烁就不会那么明显了。此外,简单地使船移动得更慢会使移动看起来更平稳,并且可以与移动的背景相结合,以产生更高速度的假象(正如您的一个例子所做的那样)。 作为一个健全性检查,这里有一个我在IDE中做的类似的最小版本。 http://www.fenomas.com/random/ship/ 在我的机器上,性能与你的相当,正如我所说,我真的没有看到任何问题。(除了偶尔出现的尖峰,我现在注意到它只在火狐中出现。)再次,特别是两个版本在独立的播放器中对我来说基本上都是完美的,这进一步让我相信这里没有黄金算法。我知道这不是你想要的答案,但这是我得到的答案。 |
![]() |
2
2
你的代码对我来说很流畅。没有任何尖峰。 使用在updatepoller函数末尾添加的以下代码对其进行了测试。
100 fps版本往往会得到不均匀的图案,但这是正常的,因为根据您的计算,如果计算一个帧需要超过10 ms,那么在一秒钟内不可能渲染100帧。 所以,至少对我来说,最后一个代码以30fps的速度平稳运行。 至于模糊部分,一个大傻瓜,希望你不会因为我问你: 模糊/模糊效果是否有可能是因为你的显示器? 即使在液晶显示器上的响应时间为10毫秒,一个白色快速移动的东西强加在静态的黑色背景上,看起来也很模糊。 |
![]() |
3
1
我认为你问题的根源在于 vertical sync “与屏幕上的不同。这与在60Hz屏幕上观看24fps电影时发生的问题相同。更新不会完全匹配(在您的例子中是100/60),当它们遇到更大的跳跃时,它看起来就像运动中的一个小抖动。 这可以通过降低帧速率来解决,任何高于屏幕帧速率的东西都会浪费处理能力。这是无法完全避免的,尽管 newer wmodes for flash embedding 可能是一个可行的解决方案。 |
![]() |
4
0
我可以建议你早点担心吗? 如果你仔细观察你链接到的“完美流畅”的flash游戏,你会发现它用流畅动作的“假象”欺骗了你。 这辆车一点速度都不快——可能每几帧就有一个像素。大部分动作都是由背景造成的。仔细看一下:有一点抖动和你试图修复的相同的“难以聚焦”效果,但因为它是背景,所以看起来很正常。即使汽车显示出这些效果,背景和游戏也会分散你的注意力。 我认为你注意到了这种抖动,因为你现在所拥有的只是一艘在完全黑色背景上行驶的船。一旦游戏的其余部分就位,玩家可能不会有多余的注意力来注意到一点抖动。至于“难以聚焦”效应,它会随着船的移动速度的降低而消失。 你为什么不先做剩下的比赛呢?如果仍然有问题的话,你可以稍后回来调整动作。你花了很多时间在一个动画作品上。游戏是否更重要? |
![]() |
5
0
这是个很好的问题。我已经扫描了代码,我有一些建议,尽管我的建议可能不太好。 我想你可以做很多事情来优化代码。显然,不是在这个早期阶段。但是您可以使用该代码进行测试,并看到它使用优化的代码快速运行,然后您就知道是否值得继续。 以下是我的“反对意见”:
可以很容易地写为
我已经测试过 this 正弦波和余弦的方法很快。当然,这会使代码变脏,但这就是为什么你不尽快优化它,直到你让它的大部分工作方式它需要工作,优化只会让你发疯,因为代码将变得更难阅读。根据我的经验,sin和cos是相当昂贵的操作。 正如其他人已经提到的,您可能在这一步工作得太多了。记住,有很多事情你可以加快速度,直到你的所有逻辑工作正常,甚至不要考虑优化。 |
![]() |
6
0
我想这几乎是肯定的,因为你的速度是80fps。flash无法提供如此快的一致帧速率。降到30fps并继续测试。另外,试着在真实的背景下驾驶飞船,我想你会注意到这点。 |
![]() |
7
0
要下载的文件不存在( http://feedpostal.com/test/MovementTest.rar ) |
![]() |
8
0
我已经回答了另一个与此问题相关的问题,请阅读以下内容: 我感到你的痛苦,因为我现在正在战壕中开发自己的游戏。在默认设置下,无论生成什么代码,Flash渲染器都会产生可怕的屏幕撕裂/V同步问题。 这就是为什么我很高兴找到了最简单、最优雅的答案,而不是对代码进行分解(这一点毫无帮助,问题在于Flash播放器,而不是代码)。 只需在发布设置中启用硬件加速 . 有两种不同的选择: 等级1:直接 和 2级:GPU . 在官方文件中了解更多信息: Specify publish settings for SWF files 并决定什么选项最适合您的游戏。 目标市场确实在这里扮演了一个重要的角色,如果这对玩家来说是一个严肃的游戏,你不必担心可能出现的性能问题,因为大多数玩家都有GPU。 This article 没有给我具体的解决方案,而是引导我朝着正确的方向前进。但是,如果你的游戏将在一个浏览器窗口中,你可能需要使用相同的技术来设置wmode为direct或gpu。 |
![]() |
Stephen · 展平或平滑一系列数字[闭合] 6 年前 |
|
Nimal Naser · 如何使用SciPy/Numpy过滤/平滑? 10 年前 |
![]() |
Mary · 重排分布函数Matlab 11 年前 |