Software Archive
Read-only legacy content
17060 Discussions

Facial Expression done, but optimization issue!

Priyadhars_K_Intel
630 Views

Hi,

Someone please help, It is urgent!

Now that I have face animation based on emotion done, I have optimization issue. 

The framerate drops severely when I turn on RSHandler.cs and SenseToolkitManager.cs. The most bottleneck seems to be happening from RSHandler.cs's Update() which I pasted below. (Also attached for RSHandler.cs code) 

I am wondering if it(blue text) is correct way to get emotion data. It doesn't make sense to Init in every Update(), but when I take the sm.Init(); out, the emotion tracking doesn't work. If it is in the Update, it works but uses up 99% of the CPU. 

Am I missing something? 

Thanks! 

Priya 

0 Kudos
2 Replies
Xusheng_L_Intel
Employee
630 Views

Could you attach your RSHandler.cs code? Thanks!

0 Kudos
Jake_K_
Beginner
630 Views

David Lu (Intel) wrote:

Could you attach your RSHandler.cs code? Thanks!

Here it is.

 

using UnityEngine;
using System.Collections;
using RSUnityToolkit;

public class RSHandler : MonoBehaviour {


    public static bool oneHandDetected = false;
    public GameObject RSImage;
    

    InGameUIPanelManager UIPM;
    PXCMSenseManager sm;
    FaceTrackingRule _faceTrackingRule = null;


    BlendShapeTarget BSTarget_surprise;
    BlendShapeTarget BSTarget_negative;
    BlendShapeTarget BSTarget_positive;


    pxcmStatus emotionFrame;
    PXCMEmotion em;

    PXCMEmotion.EmotionData emotion_surprise;
    PXCMEmotion.EmotionData emotion_negative;
    PXCMEmotion.EmotionData emotion_positive;



    // Use this for initialization
    void Start () {


        UIPM = FindObjectOfType<InGameUIPanelManager>();
        sm = PXCMSenseManager.CreateInstance();
        


        sm.EnableEmotion();
        
        
        RSImage.SetActive(false);
        
        BSTarget_surprise = FindObjectOfType<ann_blendshapeLinker>().blendShapeTargetScripts[0];
        BSTarget_negative = FindObjectOfType<ann_blendshapeLinker>().blendShapeTargetScripts[1];
        BSTarget_positive = FindObjectOfType<ann_blendshapeLinker>().blendShapeTargetScripts[3];
        
    }


    // Update is called once per frame
    void Update () {

        if (Input.GetKeyDown(KeyCode.I))
        {
            RSImage.SetActive(!RSImage.activeSelf);
        }

        sm.Init();

        emotionFrame = sm.AcquireFrame(true);
        em = sm.QueryEmotion();
        //print("em : " + em);
        em.QueryEmotionData(0, PXCMEmotion.Emotion.EMOTION_PRIMARY_SURPRISE, out emotion_surprise);
        em.QueryEmotionData(0, PXCMEmotion.Emotion.EMOTION_PRIMARY_SADNESS, out emotion_negative);
        em.QueryEmotionData(0, PXCMEmotion.Emotion.EMOTION_PRIMARY_JOY, out emotion_positive);
        
        BSTarget_surprise.weight = emotion_surprise.intensity * 1.25f;
        BSTarget_negative.weight = emotion_negative.intensity * 1f;
        BSTarget_positive.weight = emotion_positive.intensity * 1f;

        //if (BSTarget_surprise.weight > 1) BSTarget_surprise.weight = 1;
        //if (BSTarget_negative.weight > 1) BSTarget_negative.weight = 1;
        //if (BSTarget_positive.weight > 1) BSTarget_positive.weight = 1;
        
	}

    void OnOneHandDetected(EventTrigger e)
    {
        print("OnOneHandDetected called");

        print("EventSource : " + e.EventSource);
        print("TriggerAttributeName : " + e.TriggerAttributeName);
        print("Source : " + e.Source);
        print("FriendlyName : " + e.FriendlyName);


        if (e.Source == "Hand Detected")
        {
            oneHandDetected = true;
        }
        else if (e.Source == "Hand Lost")
        {
            oneHandDetected = false;
        }

    }

    void OnTwoHandsDetected(EventTrigger e)
    {
        print("OnTwoHandsDetected called " + UIPM);

        
        if(UIPM.state != InGameUIPanelManager.UIState.FAILED)
            UIPM.RestartStage();
            /*
        else if (e.Source == "Hand Lost")
        {
            twoHandsDetected = false;
        }*/

    }


    bool popupLock = false;
    void OnFaceLost(EventTrigger e)
    {
        if (popupLock == true) return;
        
        print("Come closer");
        GO_RSNotice.SetActive(true);

        popupLock = true;

    }
    void OnFaceDetected(EventTrigger e)
    {
        if (popupLock == false) return;

        print("Hide");
        GO_RSNotice.SetActive(false);

        popupLock = false;
    }
    public GameObject GO_RSNotice;

}

 

0 Kudos
Reply