Android 设备上的关卡加载速度极慢,但在 iOS 上运行良好 (Unity3D)

Level loading is extremely slow on Android device but works fine on iOS (Unity3D)

我 运行 在 android 设备(运行 Android SDK 23 和 JDK(Java Dev.Kit) 1.8.0_144 在 Unity 5.5.2f1) 我使用了这些 SDK、JDK 和 Unity 版本,因为它们修复了我遇到的其他一些错误问题。

现在我的问题是: 场景 1 是我的主菜单。我想从那里通过一个简短的其他场景 (2) 进入我的主要游戏 (场景 3)。在场景 3 中,用户可以解决难题并获得积分。这些点被保存(似乎在这一点上工作正常)...... 但是当我按下后退按钮返回主菜单时,如果没有要保存的点,加载这个场景需要超过 20 秒,而当用户获得一些点时,需要超过 30 秒才能无限。

奇怪的事情:在 iOS 上,这需要 3-4 秒,而且效果很好。 Android 问题仍然存在。

我知道我经常在主菜单中使用 Resources.Load() 来加载一些图形,但即使排除所有 Resources.Load() 函数,这个问题仍然存在。其他场景如 0,2 也需要永远加载。所以我认为这是 Scenemanager.LoadScene("scene name") 的问题。

我也尝试了异步加载(没有进展),我还压缩了所有内容(纹理、精灵),甚至在背景中放置了纯色而不是天空盒。

这是我从 Scene3 返回到 Scene1 的代码:

void Awake()
{
    SD = GameObject.FindGameObjectWithTag ("GM").GetComponent<SaveData> ();
    MS = GameObject.FindGameObjectWithTag ("MainCamera").GetComponent<MailerScript> ();
}
// Use this for initialization
void Start () 
{
    BBH.BackToMapButtonsPanel.SetActive (false);
    BackPanelIsActive = false;
    AnimationHandler.STATICbeenInVillageScene = true;
}

public void ShowBackToMapButtons()
{
    if (!BackPanelIsActive) 
    {
        BBH.BackToMapButtonsPanel.SetActive (true);
        BackPanelIsActive = true;
    } 
    else 
    {
        BBH.BackToMapButtonsPanel.SetActive (false);
        BackPanelIsActive = false;
    }
}

public void BackToHOME()
{
    Debug.Log ("Back To Home Executed");
    STATICgoToHome = true;
    BLACK3.SetActive(true);
    WantBackToHome = true;
    if (LocalizationCheck.LanguageGerman) {
        BLACK3.GetComponentInChildren<Text> ().text = "Möchtest du zurück zum Hauptmenü?";
    } else {
        BLACK3.GetComponentInChildren<Text> ().text = "Return to main menue?";
    }

}
public void GoBackToHomescreen()
{
    if (!YesChosen && PostenPunkte.postenRunning == false) 
    {
        CheckNewstarte.newGameStart = false;
        if (LocalizationCheck.LanguageGerman) {
            BLACK3.GetComponentInChildren<Text> ().text = "Einen Moment.\nDeine Punkte werden gespeichert...";
        } else {
            BLACK3.GetComponentInChildren<Text> ().text = "One Moment.\nYour points are beeing saved...";
        }
        StartCoroutine (WaitAndGoBackToHomescreen ());
        YesChosen = true;
        WantBackToHome = false;
        STATICgoToHome = false;
    }
}

IEnumerator WaitAndGoBackToHomescreen()
{
    yield return new WaitForSeconds(2);
    SceneManager.LoadScene(1);
}
public void BackToVillage ()
{
    if (Linkposten.parentalgateOpen == false) 
    {
        Debug.Log ("BackToVillageExecuted");
        if (MailerScript.camOn == false) 
        { //Debug.Log ("Back To Home works");
            BackToHOME ();
        } else if (MailerScript.camOn) 
        { //Debug.Log ("Cam Stop works");
            MS.StopCam ();
        } else {
            //Debug.Log ("Parentalgate Stop works");
            ParentalGate.SetActive (false);
            Linkposten.parentalgateOpen = false;
        }

    }
}

这是保存脚本,有很多值(我只是展示一下,以明确这些都是运行顺利地在iOS上):

public void SaveCharacterDATA()
{
    //BINARY FORMATTER AND FILE CREATE
    BinaryFormatter bf2 = new BinaryFormatter ();
    FileStream file2 = File.Create (Application.persistentDataPath + "/CharakterInfo.dat"); // Debug.Log(Application.persistentDataPath); --> shows path

    //CONTAINER FOR DATA
    CharakterData chara = new CharakterData ();
    chara.PD_was_safed = 1; //to check if there is already sth. saved
    chara.PD_charakterItemKopf = ShopScript.SaveReference_Kopf;
    chara.PD_charakterItemAuge = ShopScript.SaveReference_Auge;
    chara.PD_charakterItemTorso = ShopScript.SaveReference_Torso;
    chara.PD_charBodyPart = ShopScript.activeBodyPartIndex;
    chara.PD_charMainInt = ShopScript.mainInt;
    chara.PD_charakterMK1 = ShopScript.boughtItem_MK [0];
    chara.PD_charakterMK2 = ShopScript.boughtItem_MK [1];
    chara.PD_charakterMK3 = ShopScript.boughtItem_MK [2];
    chara.PD_charakterMK4 = ShopScript.boughtItem_MK [3];
    chara.PD_charakterMK5 = ShopScript.boughtItem_MK [4];
    chara.PD_charakterMK6 = ShopScript.boughtItem_MK [5];
    chara.PD_charakterMK7 = ShopScript.boughtItem_MK [6];
    chara.PD_charakterMK8 = ShopScript.boughtItem_MK [7];
    chara.PD_charakterMA1 = ShopScript.boughtItem_MA [0];
    chara.PD_charakterMA2 = ShopScript.boughtItem_MA [1];
    chara.PD_charakterMA3 = ShopScript.boughtItem_MA [2];
    chara.PD_charakterMA4 = ShopScript.boughtItem_MA [3];
    chara.PD_charakterMA5 = ShopScript.boughtItem_MA [4];
    chara.PD_charakterMA6 = ShopScript.boughtItem_MA [5];
    chara.PD_charakterMA7 = ShopScript.boughtItem_MA [6];
    chara.PD_charakterMA8 = ShopScript.boughtItem_MA [7];
    chara.PD_charakterMT1 = ShopScript.boughtItem_MT [0];
    chara.PD_charakterMT2 = ShopScript.boughtItem_MT [1];
    chara.PD_charakterMT3 = ShopScript.boughtItem_MT [2];
    chara.PD_charakterMT4 = ShopScript.boughtItem_MT [3];
    chara.PD_charakterMT5 = ShopScript.boughtItem_MT [4];
    chara.PD_charakterMT6 = ShopScript.boughtItem_MT [5];
    chara.PD_charakterMT7 = ShopScript.boughtItem_MT [6];
    chara.PD_charakterMT8 = ShopScript.boughtItem_MT [7];
    chara.PD_charakterFK1 = ShopScript.boughtItem_FK [0];
    chara.PD_charakterFK2 = ShopScript.boughtItem_FK [1];
    chara.PD_charakterFK3 = ShopScript.boughtItem_FK [2];
    chara.PD_charakterFK4 = ShopScript.boughtItem_FK [3];
    chara.PD_charakterFK5 = ShopScript.boughtItem_FK [4];
    chara.PD_charakterFK6 = ShopScript.boughtItem_FK [5];
    chara.PD_charakterFK7 = ShopScript.boughtItem_FK [6];
    chara.PD_charakterFK8 = ShopScript.boughtItem_FK [7];
    chara.PD_charakterFA1 = ShopScript.boughtItem_FA [0];
    chara.PD_charakterFA2 = ShopScript.boughtItem_FA [1];
    chara.PD_charakterFA3 = ShopScript.boughtItem_FA [2];
    chara.PD_charakterFA4 = ShopScript.boughtItem_FA [3];
    chara.PD_charakterFA5 = ShopScript.boughtItem_FA [4];
    chara.PD_charakterFA6 = ShopScript.boughtItem_FA [5];
    chara.PD_charakterFA7 = ShopScript.boughtItem_FA [6];
    chara.PD_charakterFA8 = ShopScript.boughtItem_FA [7];
    chara.PD_charakterFT1 = ShopScript.boughtItem_FT [0];
    chara.PD_charakterFT2 = ShopScript.boughtItem_FT [1];
    chara.PD_charakterFT3 = ShopScript.boughtItem_FT [2];
    chara.PD_charakterFT4 = ShopScript.boughtItem_FT [3];
    chara.PD_charakterFT5 = ShopScript.boughtItem_FT [4];
    chara.PD_charakterFT6 = ShopScript.boughtItem_FT [5];
    chara.PD_charakterFT7 = ShopScript.boughtItem_FT [6];
    chara.PD_charakterFT8 = ShopScript.boughtItem_FT [7];

    //CONTAINER INSIDE FILE AND CLOSE
    bf2.Serialize (file2, chara);
    file2.Close ();

    Debug.Log ("Charakter Data Safed");
}
public void LoadCharacterDATA()
{
    if (File.Exists (Application.persistentDataPath + "/CharakterInfo.dat") )
    {
        BinaryFormatter bf = new BinaryFormatter ();
        FileStream file2 = File.Open (Application.persistentDataPath + "/CharakterInfo.dat", FileMode.Open);
        CharakterData chara = (CharakterData)bf.Deserialize (file2);
        file2.Close ();

        wasSafedIndex = chara.PD_was_safed;
        SdCharakterItemString_Kopf = chara.PD_charakterItemKopf;
        SdCharakterItemString_Auge = chara.PD_charakterItemAuge;
        SdCharakterItemString_Torso = chara.PD_charakterItemTorso;
        SdCharakterActiveBodyPart = chara.PD_charBodyPart;
        SdCharakterMainInt = chara.PD_charMainInt;
        SdCharakterMK1 = chara.PD_charakterMK1;
        SdCharakterMK2 = chara.PD_charakterMK2;
        SdCharakterMK3 = chara.PD_charakterMK3;
        SdCharakterMK4 = chara.PD_charakterMK4;
        SdCharakterMK5 = chara.PD_charakterMK5;
        SdCharakterMK6 = chara.PD_charakterMK6;
        SdCharakterMK7 = chara.PD_charakterMK7;
        SdCharakterMK8 = chara.PD_charakterMK8;
        SdCharakterMA1 = chara.PD_charakterMA1;
        SdCharakterMA2 = chara.PD_charakterMA2;
        SdCharakterMA3 = chara.PD_charakterMA3;
        SdCharakterMA4 = chara.PD_charakterMA4;
        SdCharakterMA5 = chara.PD_charakterMA5;
        SdCharakterMA6 = chara.PD_charakterMA6;
        SdCharakterMA7 = chara.PD_charakterMA7;
        SdCharakterMA8 = chara.PD_charakterMA8;
        SdCharakterMT1 = chara.PD_charakterMT1;
        SdCharakterMT2 = chara.PD_charakterMT2;
        SdCharakterMT3 = chara.PD_charakterMT3;
        SdCharakterMT4 = chara.PD_charakterMT4;
        SdCharakterMT5 = chara.PD_charakterMT5;
        SdCharakterMT6 = chara.PD_charakterMT6;
        SdCharakterMT7 = chara.PD_charakterMT7;
        SdCharakterMT8 = chara.PD_charakterMT8;
        SdCharakterFK1 = chara.PD_charakterFK1;
        SdCharakterFK2 = chara.PD_charakterFK2;
        SdCharakterFK3 = chara.PD_charakterFK3;
        SdCharakterFK4 = chara.PD_charakterFK4;
        SdCharakterFK5 = chara.PD_charakterFK5;
        SdCharakterFK6 = chara.PD_charakterFK6;
        SdCharakterFK7 = chara.PD_charakterFK7;
        SdCharakterFK8 = chara.PD_charakterFK8;
        SdCharakterFA1 = chara.PD_charakterFA1;
        SdCharakterFA2 = chara.PD_charakterFA2;
        SdCharakterFA3 = chara.PD_charakterFA3;
        SdCharakterFA4 = chara.PD_charakterFA4;
        SdCharakterFA5 = chara.PD_charakterFA5;
        SdCharakterFA6 = chara.PD_charakterFA6;
        SdCharakterFA7 = chara.PD_charakterFA7;
        SdCharakterFA8 = chara.PD_charakterFA8;
        SdCharakterFT1 = chara.PD_charakterFT1;
        SdCharakterFT2 = chara.PD_charakterFT2;
        SdCharakterFT3 = chara.PD_charakterFT3;
        SdCharakterFT4 = chara.PD_charakterFT4;
        SdCharakterFT5 = chara.PD_charakterFT5;
        SdCharakterFT6 = chara.PD_charakterFT6;
        SdCharakterFT7 = chara.PD_charakterFT7;
        SdCharakterFT8 = chara.PD_charakterFT8;
        Debug.Log ("charakter Data Loaded");
    }
}

场景 1 中的代码在从场景 0 到场景 1 时执行完美。

void Awake ()
{
        SD = GameObject.FindGameObjectWithTag ("GM").GetComponent<SaveData> ();

        boughtItem_MK = new string[8];
        boughtItem_MA = new string[8];
        boughtItem_MT = new string[8];
        boughtItem_FK = new string[8];
        boughtItem_FA = new string[8];
        boughtItem_FT = new string[8];
        //male items
        boughtItem_MK [0] = SaveData.SdCharakterMK1;
        boughtItem_MK [1] = SaveData.SdCharakterMK2;
        boughtItem_MK [2] = SaveData.SdCharakterMK3;
        boughtItem_MK [3] = SaveData.SdCharakterMK4;
        boughtItem_MK [4] = SaveData.SdCharakterMK5;
        boughtItem_MK [5] = SaveData.SdCharakterMK6;
        boughtItem_MK [6] = SaveData.SdCharakterMK7;
        boughtItem_MK [7] = SaveData.SdCharakterMK8;
        boughtItem_MA [0] = SaveData.SdCharakterMA1;
        boughtItem_MA [1] = SaveData.SdCharakterMA2;
        boughtItem_MA [2] = SaveData.SdCharakterMA3;
        boughtItem_MA [3] = SaveData.SdCharakterMA4;
        boughtItem_MA [4] = SaveData.SdCharakterMA5;
        boughtItem_MA [5] = SaveData.SdCharakterMA6;
        boughtItem_MA [6] = SaveData.SdCharakterMA7;
        boughtItem_MA [7] = SaveData.SdCharakterMA8;
        boughtItem_MT [0] = SaveData.SdCharakterMT1;
        boughtItem_MT [1] = SaveData.SdCharakterMT2;
        boughtItem_MT [2] = SaveData.SdCharakterMT3;
        boughtItem_MT [3] = SaveData.SdCharakterMT4;
        boughtItem_MT [4] = SaveData.SdCharakterMT5;
        boughtItem_MT [5] = SaveData.SdCharakterMT6;
        boughtItem_MT [6] = SaveData.SdCharakterMT7;
        boughtItem_MT [7] = SaveData.SdCharakterMT8;
        //female items
        boughtItem_FK [0] = SaveData.SdCharakterFK1;
        boughtItem_FK [1] = SaveData.SdCharakterFK2;
        boughtItem_FK [2] = SaveData.SdCharakterFK3;
        boughtItem_FK [3] = SaveData.SdCharakterFK4;
        boughtItem_FK [4] = SaveData.SdCharakterFK5;
        boughtItem_FK [5] = SaveData.SdCharakterFK6;
        boughtItem_FK [6] = SaveData.SdCharakterFK7;
        boughtItem_FK [7] = SaveData.SdCharakterFK8;
        boughtItem_FA [0] = SaveData.SdCharakterFA1;
        boughtItem_FA [1] = SaveData.SdCharakterFA2;
        boughtItem_FA [2] = SaveData.SdCharakterFA3;
        boughtItem_FA [3] = SaveData.SdCharakterFA4;
        boughtItem_FA [4] = SaveData.SdCharakterFA5;
        boughtItem_FA [5] = SaveData.SdCharakterFA6;
        boughtItem_FA [6] = SaveData.SdCharakterFA7;
        boughtItem_FA [7] = SaveData.SdCharakterFA8;
        boughtItem_FT [0] = SaveData.SdCharakterFT1;
        boughtItem_FT [1] = SaveData.SdCharakterFT2;
        boughtItem_FT [2] = SaveData.SdCharakterFT3;
        boughtItem_FT [3] = SaveData.SdCharakterFT4;
        boughtItem_FT [4] = SaveData.SdCharakterFT5;
        boughtItem_FT [5] = SaveData.SdCharakterFT6;
        boughtItem_FT [6] = SaveData.SdCharakterFT7;
        boughtItem_FT [7] = SaveData.SdCharakterFT8;

}

// Use this for initialization
void Start () 
{

    //Charakter load and assign sprites
    SD.LoadCharacterDATA ();
    if (SaveData.CharPicIndex == 1) 
    {
        charakter.sprite = CharMale;
        CharIndexCheck = 1;
    }
    if (SaveData.CharPicIndex == 2) 
    {
        charakter.sprite = CharFemale;
        CharIndexCheck = 2;
    }
    if (SaveData.wasSafedIndex == 1) 
    {
        currINT = SaveData.SdCharakterMainInt;
    }
    else if (SaveData.wasSafedIndex == 0) 
    {
        currINT = 2;
    }

    mainInt = currINT;
    leftInt = mainInt - 1;
    rightInt = mainInt + 1;


    LoadSafedItemSetup ();  
    ShowCurrItemSetup (); 

    if (!AnimationHandler.STATICfirstTimeStartApp) 
    {
        SetUpNameAndMoney ();
    }
    if (PostenPunkte.earnedPoints) 
    {
        SetUpNameAndMoney ();
        //Debug.Log ("earnedPosten Setup executed");
    }

}

IEnumerator WaitforNameAndMoneyToLoad()
{
    yield return new WaitForSeconds (1);
    MoneyPoints = SaveData.Savedmoney;
    currMoney = MoneyPoints;
    MoneyText.text = currMoney.ToString ();
    UserNameText.text = CheckNewstarte.PlayerName;
    UserProfilMoney.text = currMoney.ToString ();
    //Debug.Log ("Moneypoints = " + MoneyPoints + " and UserprofilMoney = " + UserProfilMoney.text);
}
public void SetUpNameAndMoney()
{
    //Only in iOS/Android

    //Show saved money
    SD.LoadDATA ();
    StartCoroutine (WaitforNameAndMoneyToLoad ());

}

难道是……与协程?正如我提到的,它(有时)有效,但需要很长时间。

我希望有人能帮助我,因为很长一段时间以来一直在努力解决这个问题。 提前致谢!

[已解决] 行。要解决具有上述规格的 android 设备上加载缓慢的问题:

检查你是否 运行

        Resources.Load() 

我读到你应该只在 Start() 方法中使用它们,但实际上我删除了每个 Resource.Load() 函数并替换了我试图做的精灵加载。我现在只是在 Unity 中分配 public 变量。它解决了这个问题。加载时间现在少于 3 秒。