내 테스트 케이스는 두 개의 삼각형을 그리고 나서 6 밀리 초를 기다리는 것입니다. 이렇게하면 fps는 60입니다.Flash MouseMove 성능 문제
무대 위를 마우스로 움직이면 fps가 안정적이지 않습니다. 비활성 시간이 증가하고 비활성화 시간을 줄일 수있는 방법이 없습니다. 왜 이런 일이 일어나는가?
다음은 몇 가지 스크린 샷입니다.
화면 스카우트의 캡처 : http://i.stack.imgur.com/xK0xV.png
GPUView FPS 그래프 : http://i.stack.imgur.com/XO0HQ.png
그리고 응용 프로그램의 코드
package
{
import com.adobe.utils.AGALMiniAssembler;
import com.adobe.utils.PerspectiveMatrix3D;
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;
import flash.display3D.Context3D;
import flash.display3D.Context3DCompareMode;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DTextureFormat;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.display3D.textures.Texture;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix3D;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.utils.getTimer;
[SWF(width="1000",height="600", backgroundColor = 0x000000, frameRate="60")]
public class SingleThreadRender extends Sprite
{
[Embed(source = "RockSmooth.jpg")]
protected const TextureBitmap:Class;
protected var context3D:Context3D;
protected var vertexbuffer:VertexBuffer3D;
protected var indexBuffer:IndexBuffer3D;
protected var program:Program3D;
protected var texture:Texture;
protected var projectionTransform:PerspectiveMatrix3D;
private var dataReady :Boolean = false;
private var text :TextField = null;
public function SingleThreadRender()
{
text = new TextField();
text.text = "gogo";
addChild(text);
stage.mouseChildren = false;
startRenderThread();
}
private function startRenderThread() :void {
stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, initMolehill);
stage.stage3Ds[0].requestContext3D();
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.stageHeight = 600
stage.stageWidth = 800;
addEventListener(Event.ENTER_FRAME, onRender);
stage.addEventListener(MouseEvent.RIGHT_CLICK,rightClickHandler);
}
protected function initMolehill(e:Event):void
{
context3D = stage.stage3Ds[0].context3D;
context3D.configureBackBuffer(1000, 600, 1, true);
var vertices:Vector.<Number> = Vector.<Number>([
-3,-3, 0,0, 0, // x, y, z, u, v
-3, 3, 0, 0, 1,
3, -3, 0, 1, 1,
3, 3, 0, 1, 0]);
vertexbuffer = context3D.createVertexBuffer(4, 5);
vertexbuffer.uploadFromVector(vertices, 0, 4);
indexBuffer = context3D.createIndexBuffer(6);
indexBuffer.uploadFromVector (Vector.<uint>([0, 1, 2, 2, 3, 0]), 0, 6);
var bitmap:Bitmap = new TextureBitmap();
texture = context3D.createTexture(bitmap.bitmapData.width, bitmap.bitmapData.height, Context3DTextureFormat.BGRA, false);
texture.uploadFromBitmapData(bitmap.bitmapData);
var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
vertexShaderAssembler.assemble(Context3DProgramType.VERTEX,
"m44 op, va0, vc0\n" + // pos to clipspace
"mov v0, va1" // copy uv
);
var fragmentShaderAssembler : AGALMiniAssembler= new AGALMiniAssembler();
fragmentShaderAssembler.assemble(Context3DProgramType.FRAGMENT,
"tex ft1, v0, fs0 <2d,linear,nomip>\n" +
"mov oc, ft1"
);
program = context3D.createProgram();
program.upload(vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode);
projectionTransform = new PerspectiveMatrix3D();
var aspect:Number = 4/3;
var zNear:Number = 0.1;
var zFar:Number = 1000;
var fov:Number = 45*Math.PI/180;
projectionTransform.perspectiveFieldOfViewLH(fov, aspect, zNear, zFar);
}
private function rightClickHandler(event :MouseEvent) :void {
stage.removeEventListener(MouseEvent.RIGHT_CLICK,rightClickHandler);
stage.fullScreenSourceRect = new Rectangle(0,0,stage.fullScreenWidth,stage.fullScreenHeight);
stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
}
private var firstTime :Boolean = true;
protected function onRender(e:Event):void
{
if(stage.frameRate != 60) {
stage.frameRate = 60;
}
if (!context3D)
return;
var start :int = flash.utils.getTimer();
var now :int = 0;
while(true) {
now = flash.utils.getTimer();
if((now - start) > 6) {
break;
}
}
context3D.clear (1,1, 1, 1);
context3D.setDepthTest(true, Context3DCompareMode.LESS_EQUAL);
context3D.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
context3D.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_2);
context3D.setTextureAt(0, texture);
context3D.setProgram(program);
var m:Matrix3D = new Matrix3D();
m.appendTranslation(0, 0, 2);
m.append(projectionTransform);
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, m, true);
var i:int = 2;
while(i--)
context3D.drawTriangles(indexBuffer,0,2);
context3D.present();
while(true) {
now = flash.utils.getTimer();
if((now - start) > 6) {
break;
}
}
}
}
Mac에서 테스트 중이십니까? – ansiart
Starling을 사용하여 Stage3D에서 평생토록 쉽게 사용할 수있는 이유가 있습니까? – antman
이것은 문제를 시연하는 테스트 케이스입니다. – niluzhou1984