flash player 11 проверить ускорение графического процессора

С Flash Player 11 появилось 3D-ускорение с помощью графического процессора, но не каждая видеокарта может справиться с этой задачей, а когда неподдерживаемое ускорение видеокарты переключается на программное. Могу ли я проверить, доступно ли аппаратное ускорение, чтобы настроить мое приложение.


person Yovo    schedule 18.07.2012    source источник


Ответы (1)


Вы должны получить Context3D, чтобы просмотреть его driverInfo:

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

Для меня это указывает:

context3d

Проще всего протестировать программный рендеринг, аппаратное ускорение графического процессора будет указано 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);
        }

    }
}

Для StageVideo с GPU-ускорением вы прослушиваете 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 — Ресурсы графического процессора недоступны для обработки видео, и ничего не отображается. Вернитесь к объекту Video.
person Jason Sturges    schedule 19.07.2012
comment
Вы не можете использовать stage в конструкторе Sprite, вы пропустили шаг. - person BlueRaja - Danny Pflughoeft; 18.03.2014
comment
@BlueRaja-DannyPflughoeft Это изолированный пример, где присутствует stage, поскольку этот класс является корневым представлением приложения; не запутан стандартным жизненным циклом Event.ADDED_TO_STAGE обработчиков, требуемых дочерними экранными объектами. - person Jason Sturges; 18.03.2014