Как стать автором
Обновить

Flash 10.1 стресс тест, где скорость?

Время на прочтение5 мин
Количество просмотров1.6K
image
После выхода 10.1 pre-release версии решил потестить её на drawTriangles()
Написано приложение, которое в 800x600 рисует 2700 крутящихся текстурированных треугольников (текстура 32х32 random perlin noise)
Скомпилировано под flash 10.0 и flash 10.1.

Компилировалось под flex builder 3, playerglobal.swc под 10.1 взят с официальной страницы http://labs.adobe.com/downloads/flashplayer10.html
Драйвера на видео поставлены из поста http://habrahabr.ru/blogs/adobe/75532/
Система Core i7 920 + gtx295
www.rexxar.ru/stress10 (сборка под 10.0.ххх)
flash 10.0 — в среднем 22 fps (debug) / 25 fps (release)
flash 10.1 — в среднем 36 fps
www.rexxar.ru/stress101 (сборка под 10.1.ххх)
flash 10.0 — понятно не работает, нужен 10.1
flash 10.1 — в среднем 36 fps

Кстати, в 10.1 версии под opera/firefox на пустом клипе fps режется до 120, хотя во флеше прописано 200. В 10.0 такого нет.
Исходники обоих приложений — www.rexxar.ru/data/stress.zip

Ну и здесь выложу, там всего два класса.
Главный:
package {
  import flash.display.Sprite;
  
  [SWF(frameRate="200", width="800", height="600")]

  public class stress101 extends Sprite
  {
    private static const NUM_COLS : int = 60;
    private static const NUM_ROWS : int = 45;
    
    private var canvas : Sprite = new Sprite();
    
    public function stress101()
    {
      canvas.graphics.beginFill(0xDDDDFF);
      canvas.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
      canvas.graphics.endFill();
      
      addChild(canvas);
      addChild(new FPSCounter());
      
      drawTriangles();      
    }
    
    private function drawTriangles() : void
    {
      const dx : Number = canvas.width / NUM_COLS;
      const dy : Number = canvas.height / NUM_ROWS;
      
      const size : Number = 0.5 * (dx > dy ? dx : dy);
      
      var cy : Number = 0.5 * dy;
      for(var row : int = 0; row < NUM_ROWS; row++, cy += dy)
      {
        var cx : Number = 0.5 * dx;
        for(var col : int = 0; col < NUM_COLS; col++, cx += dx)
        {
          var triangle : Triangle = new Triangle(size);
          triangle.x = cx;
          triangle.y = cy;
          canvas.addChild(triangle);
        }
      }
    }
  }
}

* This source code was highlighted with Source Code Highlighter.


Triangle:
package
{
  import flash.display.BitmapData;
  import flash.display.Shape;
  import flash.events.Event;

  public class Triangle extends Shape
  {
    private static const TEXTURE_WIDTH : int = 32;
    private static const TEXTURE_HEIGHT : int = 32;
    
    public function Triangle(size : Number)
    {
      super();
      
      var bitmapData : BitmapData = new BitmapData(TEXTURE_WIDTH, TEXTURE_HEIGHT, false);
      bitmapData.perlinNoise(TEXTURE_WIDTH, TEXTURE_HEIGHT, 6, Math.random() * int.MAX_VALUE, falsetrue);
      
      graphics.beginBitmapFill(bitmapData, null, false, true);
      graphics.drawTriangles(
        Vector.<Number>([
          0, -size,
          size, size,
          -size, size,        
        ]),
        Vector.<int>([
          0, 1, 2,
        ]),
        Vector.<Number>([
          0.5, 0.0, 0.5,
          1.0, 1.0, 0.5,
          0.0, 1.0, 0.5,
        ])
      );
      graphics.endFill();
      
      addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    
    private function onEnterFrame(event : Event) : void
    {
      rotation += 1.0;
    }
  }
}


* This source code was highlighted with Source Code Highlighter.


Так вот — или я что-то делаю не так или одно их двух. Настойчивое гугление не дало никаких зацепок.
Конечно приятно повышение производительности в ~1.6 раза, но ёлки-палки, 36fps на 2700 треугольников это уровень 3dfx Voodoo.

Ещё для теста можно сходить на http://www.rexxar.ru/3d/ (flash player 10.0.xx required)
Для начала ткнуть во флешку, а то всё забываю фокус на неё переставить, без этого клавиши работать не будут. И дальше:
key 1 — beginFill + moveTo/lineTo
key 2 — beginBitmapFill + moveTo/lineTo
key 3 — beginBitmapFill + drawTriangles
key 4 — beginShaderFill (3-point bilinear gradient) + drawTriangles
key 5 — beginBitmapFill (3-point bilinear gradient emulation with 2x2 texture) + drawTriangles
keys w+s+a+d — смена кол-ва треугольников по осям

Сейчас сам потестил — всё как было (
Робкие надежды на то, что pixel-bender шейдер как-нибудь скомпилируется, заработает под CUDA и позволит рисовать вообще ВСЁ, накрылись либо моим неумением либо медным тазом.
Грустно всё.

p.s.

Объяснение картинки в заглавии:
первая — flash player 10.0, 3-point gradient shader, треугольники набраны до ~32fps, полная — http://www.rexxar.ru/img/flash100.jpg
вторая — flash player 10.1, 3-point gradient shader, треугольники набраны до ~32fps, полная — http://www.rexxar.ru/img/flash101.jpg

Использование ядер очень странное.
Сначала 5, чуть больше треугольников — 8, возвращаешься назад — 4, снова больше — 6.
Теги:
Хабы:
+38
Комментарии35

Публикации

Изменить настройки темы

Истории

Ближайшие события