代码之家  ›  专栏  ›  技术社区  ›  Pierre Arnaud

优化二维Flash游戏的过渡/移动平滑度

  •  2
  • Pierre Arnaud  · 技术社区  · 6 年前

    更新6 :

    费诺梅纳斯建议我尽可能简单地重新创造一切。我怀疑这会有什么不同,因为算法保持不变,性能似乎不是问题。不管怎样,这是我得到的唯一建议,这里是:

    1. 30个FPS: http://www.feedpostal.com/test/simple/30/SimpleMovement.html
    2. 40个FPS: http://www.feedpostal.com/test/simple/40/SimpleMovement.html
    3. 60个FPS: http://www.feedpostal.com/test/simple/60/SimpleMovement.html
    4. 100个FPS: http://www.feedpostal.com/test/simple/100/SimpleMovement.html

    代码:

    package {
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.utils.getTimer;
    
        [SWF(width="800", height="600", frameRate="40", backgroundColor="#000000")]
    
        public class SimpleMovement extends Sprite
        {
            private static const TURNING_SPEED:uint = 180;
            private static const MOVEMENT_SPEED:uint = 400;
            private static const RADIAN_DIVIDE:Number = Math.PI/180;
            private var playerObject:Sprite;
            private var shipContainer:Sprite;
            private var moving:Boolean = false;
            private var turningMode:uint = 0;
            private var movementTimestamp:Number = getTimer();
            private var turningTimestamp:Number = movementTimestamp;
    
            public function SimpleMovement()
            {
                //step 1: create player object
                playerObject = new Sprite();
                playerObject.graphics.lineStyle(1, 0x000000);
                playerObject.graphics.beginFill(0x6D7B8D);
                playerObject.graphics.drawRect(0, 0, 25, 50);
                //make it rotate around the center
                playerObject.x = 0 - playerObject.width / 2;
                playerObject.y = 0 - playerObject.height / 2;
                shipContainer = new Sprite();
                shipContainer.addChild(playerObject);
                shipContainer.x = 100;
                shipContainer.y = 100;
                shipContainer.rotation = 180;
                addChild(shipContainer);
    
                //step 2: install keyboard hook when stage is ready
                addEventListener(Event.ADDED_TO_STAGE, stageReady, false, 0, true);
    
                //step 3: install rendering update poll
                addEventListener(Event.ENTER_FRAME, updatePoller, false, 0, true);
            }
    
            private function updatePoller(event:Event):void
            {
                var newTime:Number = getTimer();
    
                //turning
                if (turningMode != 0)
                {
    
                    var turningDeltaTime:Number = newTime - turningTimestamp;
                    turningTimestamp = newTime;
                    var rotation:Number = TURNING_SPEED * turningDeltaTime / 1000;
                    if (turningMode == 1) shipContainer.rotation -= rotation;
                    else shipContainer.rotation += rotation;
                }
    
                //movement
                if (moving)
                {
                    var movementDeltaTime:Number = newTime - movementTimestamp;
                    movementTimestamp = newTime;
                    var distance:Number = MOVEMENT_SPEED * movementDeltaTime / 1000;
                    var rAngle:Number = shipContainer.rotation * RADIAN_DIVIDE; //convert degrees to radian
                    shipContainer.x += distance * Math.sin(rAngle);
                    shipContainer.y -= distance * Math.cos(rAngle);
                }
            }
    
            private function stageReady(event:Event):void
            {
                //install keyboard hook
                stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown, false, 0, true);
                stage.addEventListener(KeyboardEvent.KEY_UP, keyUp, false, 0, true);
            }
    
            private final function keyDown(event:KeyboardEvent):void
            {
                if ((event.keyCode == 87) && (!moving))  //87 = W
                {
                    movementTimestamp = getTimer();
                    moving = true;
                }
                if ((event.keyCode == 65) && (turningMode != 1)) //65 = A
                {
                    turningTimestamp = getTimer();
                    turningMode = 1;
                }
                else if ((event.keyCode == 68) && (turningMode != 2)) //68 = D
                {
                    turningTimestamp = getTimer();
                    turningMode = 2;
                }
            }
    
            private final function keyUp(event:KeyboardEvent):void
            {
                if ((event.keyCode == 87) && (moving)) moving = false; //87 = W
                if (((event.keyCode == 65) || (event.keyCode == 68)) && (turningMode != 0)) turningMode = 0; //65 = A, 68 = D
            }
        }
    }
    

    结果如我所料。绝对没有改善。我真的希望有人有另一个建议,因为这件事需要解决。另外,我怀疑它是我的系统,因为我有一个相当好的系统(8GB RAM,Q9550四核Intel,ATI Radeon 4870 512MB)。另外,到目前为止,我询问的其他人都和我的客户有同样的问题。

    更新5: 另一个例子是一个流畅的闪光灯游戏,只是为了证明我的动作绝对是不同的!参见 http://www.spel.nl/game/bumpercraft.html

    更新4 :我跟踪了渲染前(event.render)和渲染后(event.enter_frame)的时间,结果:

    rendering took: 14 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 14 ms
    rendering took: 14 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 24 ms
    rendering took: 18 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 232 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 16 ms
    rendering took: 12 ms
    rendering took: 14 ms
    rendering took: 12 ms
    

    范围是12-16毫秒。在这些差异期间,震动/扭曲/闪烁运动已经开始。也有1个峰值232毫秒,此时有一个相对较大的翘曲。然而,这不是最大的问题,最大的问题是在正常运动过程中持续的小翘曲。这有什么线索吗?

    更新3: 经过测试,我知道以下因素是 导致我的问题:

    • 位图的质量--随着photoshop的变化,它变成了一个更丑的8色优化图形,根本没有改善。
    • 旋转时图像不断旋转--禁用它,完全没有改善
    • 浏览器呈现->尝试独立使用Flash播放器,没有任何改进

    我百分之百地相信问题在于我的代码或算法。请帮帮我。已经快两个星期了(一个星期我就这样问这个问题),现在我仍然需要得到我的黄金答案。

    更新1: 请参阅底部了解完整的flex项目源代码和演示我的问题的实况演示。

    我在做一个二维的游戏。玩家船被创建为一个对象:

    ships[id] = new GameShip();
    

    当移动和旋转信息可用时,这将被定向到相应的船舶:

    ships[id].setMovementMode(1); //move forward
    

    现在,在这个游戏中,对象移动使用“event.enter”事件工作:

    addEventListener(Event.ENTER_FRAME, movementHandler);
    

    正在运行以下函数:

    private final function movementHandler(event:Event):void
            {
                var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
                var distance:Number = (newTimeStamp - movementTimeStamp) / 1000 * movementSpeed; //speed = x pixels forward every 1 second
                movementTimeStamp = newTimeStamp; //update old timeStamp
                var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //the diagonal position update based on angle and distance
                charX += diagonalChange[0];
                charY += diagonalChange[1];
                if (shipContainer)
                { //when the container is ready to be worked with
                    shipContainer.x = charX;
                    shipContainer.y = charY;
                }
            }
    
    private final function getDiagonalChange(angle:Number, distance:Number):Array
            {
                var rAngle:Number = angle * Math.PI/180; //convert degrees to radian
                return [Math.sin(rAngle) * distance, (Math.cos(rAngle) * distance) * -1];
            }
    

    当对象不再移动时,事件侦听器将被删除。同样的方法也用于旋转。一切都很完美。

    我已经将项目的目标fps设置为100,并创建了一个fps计数器。根据fps计数器,firefox中的平均fps大约是100,而顶部是1000,底部是22。我认为底部和顶部的fps仅在客户端初始化(启动)期间发生。

    问题是,这艘船看起来几乎是完全平稳的,而没有“几乎”的部分就应该是平稳的。几乎就像船在“闪烁”非常快,你实际上看不到它,但当它用你的眼睛移动时,很难聚焦在物体上。而且,时不时地,似乎有一点帧速率峰值,就像客户机跳过了几个帧,然后您会看到它很快扭曲。

    很难解释真正的问题是什么,但总的来说,运动并不是完全平稳的。那么,你对如何使物体的运动或过渡非常顺利有什么建议吗?

    更新1:

    我重新创建了客户来演示我的问题。请检查一下。

    客户: http://feedpostal.com/test/MovementTest.html

    ActionScript项目(完整源代码): http://feedpostal.com/test/MovementTest.rar

    一个流畅的flash游戏的例子 (不是我创建的): http://www.gamesforwork.com/games/swf/Mission%20Racing_august_10th_2009.swf

    我花了很长时间重新创建这个客户端版本,我希望这将有助于解决问题。

    请注意:是的,它实际上很光滑。但它肯定不够光滑。

    8 回复  |  直到 6 年前
        1
  •  9
  •   fenomas    15 年前

    我不知道这里是否有黄金答案,但我有一些建议。

    首先,我不需要对优化math.pi/180等问题进行任何查询。通常较高的帧速率应该清楚地表明,简单的计算不会减慢任何速度。

    其次,要解决显示延迟的偶尔峰值:在我看来,这些非常像垃圾收集器运行非常频繁。通过非常简短的代码检查,我没有发现任何导致频繁使用GCS的明显原因,但我有两个建议。首先,如果您可以访问flash-ide,我将尝试在不使用flex框架的情况下重新创建您的项目。一个flash项目不包含任何代码,除了你输入的代码,但是flex使用了很多它自己的秘密,这可能并不总是显而易见的,并且你的代码和框架之间的一些交互可能导致GCS。

    如果这不起作用,另一个尝试是生成一个大大简化的代码版本(如果可能的话,使用flash),希望它足够简单,不会触发相同的峰值。我的意思是,例如,一个附加到图形的类,它只有一个用于关键事件的监听器和一个用于帧(或计时器)事件的第二个监听器,其中不创建变量。如果一个最小版本没有显示这些峰值,那么应该可以在这个版本和您的完整客户机之间进行三角定位,找出导致峰值的原因。

    最后,关于一般的平滑度,我唯一的评论是flash的屏幕更新本质上是稍微不均匀的,实际上您只有两种方法可用。要么根据帧更新移动演员,这会使他们的移动随帧速率的变化而略有不均匀,要么根据经过的时间移动演员,这会使他们的整体移动平滑(以每秒像素为单位),但他们的显示略有不均匀(以每帧移动的像素为单位)。差异在较高的fps下放大。

    另外,重要的是要记住,在Flash进行更新后,它们在屏幕上的显示方式会受到视频卡的严重影响。特别是,您会发现剪切和垂直同步问题在一个环境中非常明显,而在另一个环境中却不存在。开发人员没有真正的方法来解决这个问题,除非通常避免非常高的fps动画,并尽可能降低整个处理器的负担。

    编辑: 有关我所说的帧更新时间“本质上不均匀”的更多信息,请参见 this blog post . 屏幕更新之间的延迟介于12-16毫秒之间,这不是您可以做的事情;这是操作系统和浏览器影响Flash计时工作方式的结果。(这也是你在一部空电影中也会看到的东西,这就是为什么这条关于优化数学等的评论对你没有帮助。)你不能避免这种变化,但是正如我上面所说,你可以调整你的视觉效果来唤起你想要的效果。不管怎样,我认为尖峰更值得担心。你所看到的变化是微妙的,在一个有很多东西的游戏中很难被注意到,但是尖峰是令人震惊的。

    编辑2 你问:“你真的认为那些流畅的游戏和我一样使用相同的移动算法吗?”

    答案是,我认为他们做的事情要简单得多。他们几乎肯定在做以下工作之一:

    function onEnterFrame() { // move at a constant speed per frame
        ship.angle += dtheta;
        ship.x += speed * Math.cos( ship.angle );
        ship.y += speed * Math.sin( ship.angle );
    }
    
    function onEnterFrame2() { // move at a constant speed per second
        var dt:Number = getTimeSinceLastFrame();
        ship.angle += anglePerSecond * dt/1000;
        var dist:Number = speedPerSecond * dt/1000;
        ship.x += dist * Math.cos( ship.angle );
        ship.y += dist * Math.sin( ship.angle );
    }
    

    换句话说,要么每帧移动一个恒定的距离,要么每秒移动一个恒定的距离。这是两种最简单的方法,你可以达到这一点,这两个选项将导致在闪光灯最平滑的外观。在恒定的帧速率下,它们看起来是相同的,后一种方法在稍有变化的帧速率下看起来更平滑,原因与您链接的文章中提到的“时间混叠”类似。但是,在这些方法之间的选择真的可以归结为,如果CPU出现尖峰,在它结束后,你想让飞船继续移动还是不?这真是一个游戏设计问题。我过去做过的一件事是在夹紧时使用第二种方法 dt 至多为理想帧持续时间的2或3倍(1/fps)。

    正如您可能注意到的,我刚才推荐的两种方法正是“修复时间步骤”的方法。文章说不要做。这是因为这篇文章是关于数值积分物理引擎的,而这不是你要做的。如果您开始实现弹簧和重力,那么是的,每当时间步长变大时,都会引入大量的错误,因为对于这种模拟,为了使事情过于简单化,错误取决于时间步长的大小。在您所做的工作中,它没有,因此偶尔的大时间步骤不会影响模拟的正确性。

    回复更新6

    首先,我没有告诉你你的问题是你的表现,我说的恰恰相反。我建议进行最小限度的复制,因为我认为你的问题不是在你的项目中的某个地方,就是不可避免的,我仍然这样做。第二,我现在很舒服地说,你做的事情和其他任何一款Flash游戏都是一样的,无论你看到什么问题,除了感知之外都无法解决。在您发布的新链接中,如果我在独立的SWF播放器中查看动画,动画看起来非常平滑,并且在浏览器的前后边缘有细微的闪烁(在Firefox中比在IE中更常见)。从技术上讲,我认为它无法改进(特别是当它在独立播放器中基本上是完美的,这意味着浏览器中的任何不稳定都会受到容器的影响。)

    当然, 感知 性能仍然可以提高。例如,如果飞船没有与背景形成如此鲜明的对比,那么闪烁就不会那么明显了。此外,简单地使船移动得更慢会使移动看起来更平稳,并且可以与移动的背景相结合,以产生更高速度的假象(正如您的一个例子所做的那样)。

    作为一个健全性检查,这里有一个我在IDE中做的类似的最小版本。 http://www.fenomas.com/random/ship/ 在我的机器上,性能与你的相当,正如我所说,我真的没有看到任何问题。(除了偶尔出现的尖峰,我现在注意到它只在火狐中出现。)再次,特别是两个版本在独立的播放器中对我来说基本上都是完美的,这进一步让我相信这里没有黄金算法。我知道这不是你想要的答案,但这是我得到的答案。

        2
  •  2
  •   Virusescu    15 年前

    你的代码对我来说很流畅。没有任何尖峰。 使用在updatepoller函数末尾添加的以下代码对其进行了测试。

    var shadow:Sprite = new Sprite();
    shadow.graphics.beginFill(0xFFFFFF, 0.01);
    shadow.graphics.lineStyle(1, 0xFFFFFF, 0.8);
    shadow.graphics.drawRect(0, 0, 25, 50);
    this.addChildAt(shadow, 0);
    shadow.x = shipContainer.x;
    shadow.y = shipContainer.y;
    shadow.rotation = shipContainer.rotation;
    

    100 fps版本往往会得到不均匀的图案,但这是正常的,因为根据您的计算,如果计算一个帧需要超过10 ms,那么在一秒钟内不可能渲染100帧。 所以,至少对我来说,最后一个代码以30fps的速度平稳运行。

    至于模糊部分,一个大傻瓜,希望你不会因为我问你: 模糊/模糊效果是否有可能是因为你的显示器? 即使在液晶显示器上的响应时间为10毫秒,一个白色快速移动的东西强加在静态的黑色背景上,看起来也很模糊。

        3
  •  1
  •   grapefrukt    15 年前

    我认为你问题的根源在于 vertical sync “与屏幕上的不同。这与在60Hz屏幕上观看24fps电影时发生的问题相同。更新不会完全匹配(在您的例子中是100/60),当它们遇到更大的跳跃时,它看起来就像运动中的一个小抖动。

    这可以通过降低帧速率来解决,任何高于屏幕帧速率的东西都会浪费处理能力。这是无法完全避免的,尽管 newer wmodes for flash embedding 可能是一个可行的解决方案。

        4
  •  0
  •   Selene    15 年前

    我可以建议你早点担心吗?

    如果你仔细观察你链接到的“完美流畅”的flash游戏,你会发现它用流畅动作的“假象”欺骗了你。

    这辆车一点速度都不快——可能每几帧就有一个像素。大部分动作都是由背景造成的。仔细看一下:有一点抖动和你试图修复的相同的“难以聚焦”效果,但因为它是背景,所以看起来很正常。即使汽车显示出这些效果,背景和游戏也会分散你的注意力。

    我认为你注意到了这种抖动,因为你现在所拥有的只是一艘在完全黑色背景上行驶的船。一旦游戏的其余部分就位,玩家可能不会有多余的注意力来注意到一点抖动。至于“难以聚焦”效应,它会随着船的移动速度的降低而消失。

    你为什么不先做剩下的比赛呢?如果仍然有问题的话,你可以稍后回来调整动作。你花了很多时间在一个动画作品上。游戏是否更重要?

        5
  •  0
  •   George Profenza    15 年前

    这是个很好的问题。我已经扫描了代码,我有一些建议,尽管我的建议可能不太好。

    我想你可以做很多事情来优化代码。显然,不是在这个早期阶段。但是您可以使用该代码进行测试,并看到它使用优化的代码快速运行,然后您就知道是否值得继续。

    以下是我的“反对意见”:

    • 你使用了很多划分。除法 比…贵 乘法。

      var距离:数字=(newtimestamp-movementtimestamp)/1000*movementspeed;

    可以很容易地写为

    var distance:Number = (newTimeStamp - movementTimeStamp) * .001 * movementSpeed;
    
    • 你有很多参考资料 函数的

      像fixangle()之类的东西可以在同一个函数内,而不需要经常来回运行调用。这适用于引用外部类和math.pi或math.sin等等,正如Fenomas和Allan指出的那样。

    我已经测试过 this 正弦波和余弦的方法很快。当然,这会使代码变脏,但这就是为什么你不尽快优化它,直到你让它的大部分工作方式它需要工作,优化只会让你发疯,因为代码将变得更难阅读。根据我的经验,sin和cos是相当昂贵的操作。

    正如其他人已经提到的,您可能在这一步工作得太多了。记住,有很多事情你可以加快速度,直到你的所有逻辑工作正常,甚至不要考虑优化。

        6
  •  0
  •   Iain    15 年前

    我想这几乎是肯定的,因为你的速度是80fps。flash无法提供如此快的一致帧速率。降到30fps并继续测试。另外,试着在真实的背景下驾驶飞船,我想你会注意到这点。

        7
  •  0
  •   Rafael B.    15 年前

    要下载的文件不存在( http://feedpostal.com/test/MovementTest.rar )

        8
  •  0
  •   Daniel Carvalho    15 年前

    我已经回答了另一个与此问题相关的问题,请阅读以下内容:

    我感到你的痛苦,因为我现在正在战壕中开发自己的游戏。在默认设置下,无论生成什么代码,Flash渲染器都会产生可怕的屏幕撕裂/V同步问题。

    这就是为什么我很高兴找到了最简单、最优雅的答案,而不是对代码进行分解(这一点毫无帮助,问题在于Flash播放器,而不是代码)。

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

    等级1:直接 2级:GPU .

    在官方文件中了解更多信息: Specify publish settings for SWF files 并决定什么选项最适合您的游戏。

    目标市场确实在这里扮演了一个重要的角色,如果这对玩家来说是一个严肃的游戏,你不必担心可能出现的性能问题,因为大多数玩家都有GPU。

    This article 没有给我具体的解决方案,而是引导我朝着正确的方向前进。但是,如果你的游戏将在一个浏览器窗口中,你可能需要使用相同的技术来设置wmode为direct或gpu。