После выхода 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, false, true);
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.