2012-07-18 59 views
3

隨着閃存播放器11來了3D GPU加速但不是每個視頻卡都可以做這項工作,並且當不支持的視頻卡加速切換到軟件。我可以檢查硬件加速是否可用以定製我的應用程序。閃存播放器11檢查GPU加速

回答

8

您必須獲得一個Context3D,查看它的driverInfo

trace("3d mode: " + context3D.driverInfo); 

對於我來說,這表示:

context3d

最簡單的測試對於軟件渲染,硬件加速的GPU將被指示DirectX或OpenGL。

這可以實現這樣的:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Stage3D; 
    import flash.display3D.Context3D; 
    import flash.display3D.Context3DRenderMode; 
    import flash.events.Event; 
    import flash.system.ApplicationDomain; 
    import flash.system.Capabilities; 

    public class X extends Sprite 
    { 
     public function X() 
     { 
      super(); 

      if (ApplicationDomain.currentDomain.hasDefinition("flash.display.Stage3D")) 
      { 
       stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onContext3DCreate); 
       stage.stage3Ds[0].requestContext3D(); 
      } 
     } 

     private function onContext3DCreate(event:Event):void 
     { 
      // obtain context 
      var t:Stage3D = event.target as Stage3D; 
      var context3D:Context3D = t.context3D; 

      // detect software mode 
      if ((context3D.driverInfo == Context3DRenderMode.SOFTWARE) 
       || (context3D.driverInfo.indexOf('oftware') > -1)) 
      { 
       trace("Software mode detected!"); 
      } 

      trace("Flash Version: " + Capabilities.version); 
      trace("3D mode: " + context3D.driverInfo); 
     } 

    } 
} 

對於GPU加速的StageVideo,你聽StageVideoAvailabilityEvent確認StageVideoAvailability.AVAILABLE

這可以被實現爲:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.StageVideoAvailabilityEvent; 
    import flash.media.StageVideoAvailability; 

    public class X extends Sprite 
    { 
     public function X() 
     { 
      super(); 
      stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoState); 
     } 

     private function onStageVideoState(event:StageVideoAvailabilityEvent):void 
     { 
      if (event.availability == StageVideoAvailability.AVAILABLE) 
       trace("available"); 
     } 

    } 
} 

一旦你有一個使用的StageVideo,渲染狀態被StageVideoEvent.RENDER_STATE表示。

var stageVideo = stage.stageVideos[0]; 
stageVideo.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange); 

function stageVideoStateChange(event:StageVideoEvent):void 
{ 
    trace("Render State: " + event.status); 
} 

渲染狀態由StageVideoEvent.status衍生,並且包括:

  • VideoStatus.ACCELERATED - 解碼和呈現既發生在硬件中。 (最佳性能)
  • VideoStatus.SOFTWARE - 硬件介紹,軟件解碼。 (可接受的性能)
  • VideoStatus.UNAVAILABLE - 沒有GPU資源可用於處理視頻,並且不顯示任何內容。回退到Video對象。
+0

謝謝@Jason Sturges。 – Yovo 2012-07-19 08:34:43

+0

您不能在'Sprite'構造函數中使用'stage',[缺少一個步驟](http://stackoverflow.com/a/13444450/238419)。 – 2014-03-17 22:54:52

+0

@ BlueRaja-DannyPflughoeft這是一個孤立的例子,其中stage是存在的,因爲這個類是應用程序的根視圖;不會被後代顯示對象所需的'Event.ADDED_TO_STAGE'處理程序的標準生命週期所捲入。 – 2014-03-18 02:30:36