내 게임의 기본 메모리 사용량은 약 315MB입니다. 그러나 다음 함수를 호출하면 메모리 사용량이 급격히 증가하고 약 480MB로 평준화되며 580MB 이상의 스파이크에 도달하면 메모리 경고 및 충돌이 발생합니다.Unity iOS 메모리 사용량이 증가하고 다시 돌아 가지 않음
어떻게됩니까? 먼저 TakeScreenshot
IEnum이 최대 세 번 연속해서 호출됩니다. 한 세션의 스크린 샷 수입니다. 둘째로, 사용자가 하나를 선택할 수 있도록 세 개의 그림을 모두 표시하는 함수 SendEmailTask
이 호출됩니다. 그림 "# 1"을 선택하면 기능 SendImage1
이 트리거됩니다.
어쩌면 누군가가 그 기억의 일부를 어디서 어떻게 얻을 수 있는지 가르쳐 줄 수 있습니다. 그러면 정말 좋을 것입니다!
모든 관련 코드는 여기에 있어야한다 :
public class Picture : MonoBehaviour {
private int ssCount = 0;
private Sprite cachedImage1sprite;
private Sprite cachedImage2sprite;
private Sprite cachedImage3sprite;
private Texture2D cachedImage1;
private Texture2D cachedImage2;
private Texture2D cachedImage3;
private Texture2D JPGtex1;
private Texture2D JPGtex2;
private Texture2D JPGtex3;
private Texture2D tex;
void Awake() {
}
// Use this for initialization
void Start() {
JPGtex1 = new Texture2D (2, 2, TextureFormat.RGB24, false);
JPGtex2 = new Texture2D (2, 2, TextureFormat.RGB24, false);
JPGtex3 = new Texture2D (2, 2, TextureFormat.RGB24, false);
// Create a texture the size of the screen, RGB24 format
int width = Screen.width;
int height = Screen.height;
tex = new Texture2D(width, height, TextureFormat.RGB24, false);
}
// Update is called once per frame
void Update() {
if (ssCount == 0) {
SendEmail.interactable = false;
TakePhoto.interactable = true;
} else if (ssCount == 1) {
SendEmail.interactable = true;
} else if (ssCount == 3) {
TakePhoto.interactable = false;
}
//Debug.Log (ssCount);
}
void SendEmailTask(){
if (ssCount == 3) {
cachedImage1 = SA.IOSNative.Storage.AppCache.GetTexture ("IMAGE_1");
cachedImage2 = SA.IOSNative.Storage.AppCache.GetTexture ("IMAGE_2");
cachedImage3 = SA.IOSNative.Storage.AppCache.GetTexture ("IMAGE_3");
ImagePicker.SetActive (true);
//Image1
Rect rec1 = new Rect(0, 0, cachedImage1.width, cachedImage1.height);
cachedImage1sprite = Sprite.Create(cachedImage1, rec1, new Vector2(0,0),1);
Image1.image.sprite = cachedImage1sprite;
//Image2
Rect rec2 = new Rect(0, 0, cachedImage2.width, cachedImage2.height);
cachedImage2sprite = Sprite.Create(cachedImage2, rec2, new Vector2(0,0),1);
Image2.image.sprite = cachedImage2sprite;
//Image3
Rect rec3 = new Rect(0, 0, cachedImage3.width, cachedImage3.height);
cachedImage3sprite = Sprite.Create(cachedImage3, rec3, new Vector2(0,0),1);
Image3.image.sprite = cachedImage3sprite;
SA.IOSNative.Storage.AppCache.Remove ("IMAGE_1");
SA.IOSNative.Storage.AppCache.Remove ("IMAGE_2");
SA.IOSNative.Storage.AppCache.Remove ("IMAGE_3");
}
}
IEnumerator TakeScreenshot() {
// Wait till the last possible moment before screen rendering to hide the UI
yield return null;
GameObject.Find("Buttons").GetComponent<Canvas>().enabled = false;
FlashImage();
// Wait for screen rendering to complete
yield return new WaitForEndOfFrame();
// Create a texture the size of the screen, RGB24 format
int width = Screen.width;
int height = Screen.height;
// Read screen contents into the texture
tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
tex.Apply();
//byte[] screenshot = tex.EncodeToPNG();
print("Size is " + tex.width + " by " + tex.height);
if (ssCount == 0) {
SA.IOSNative.Storage.AppCache.Save ("IMAGE_1", tex);
ssCount++;
} else if (ssCount == 1) {
SA.IOSNative.Storage.AppCache.Save ("IMAGE_2", tex);
ssCount++;
} else if (ssCount == 2) {
SA.IOSNative.Storage.AppCache.Save ("IMAGE_3", tex);
ssCount++;
}
IOSCamera.Instance.SaveTextureToCameraRoll(tex); //Save to Cameraroll
// Show UI after we're done
GameObject.Find("Buttons").GetComponent<Canvas>().enabled = true;
}
public void SendImage1() {
byte[] screenshot1;
screenshot1 = cachedImage1.EncodeToJPG();
if (Facebook == false) {
JPGtex1.LoadImage (screenshot1);
TextureScale.Bilinear (JPGtex1, 1200, 900);
IOSSocialManager.Instance.SendMail (SubjectText, EmailText, "", JPGtex1);
} else {
StartCoroutine(UploadToPage(screenshot1));
}
backToGame();
}
public void backToGame() {
Destroy (cachedImage1sprite);
Destroy (cachedImage2sprite);
Destroy (cachedImage3sprite);
SA.IOSNative.Storage.AppCache.Remove ("IMAGE_1");
SA.IOSNative.Storage.AppCache.Remove ("IMAGE_2");
SA.IOSNative.Storage.AppCache.Remove ("IMAGE_3");
Destroy(cachedImage1);
Destroy(cachedImage2);
Destroy(cachedImage3);
cachedImage1 = null;
cachedImage2 = null;
cachedImage3 = null;
Image3Obj.SetActive (true);
ImagePicker.SetActive (false);
}
}
편집
자세한 메모리 프로파일 두 번 루틴을 통해 진행 후 :를 통해 진행 한 후
엑스 코드 메모리 프로파일 루틴 두 번 :
프로파일 러를 실행하여 응용 프로그램을 실행 했습니까? 이렇게하면 많은 양의 메모리를 사용하는 것을 정확히 볼 수 있습니다. – Eoghan
잠시 동안 앱을 사용한 후에 자세한 메모리 프로파일 러의 스크린 샷을 업로드 할 수 있습니까? 사용하지 않는 모든 텍스처를 파괴해야합니다. 그렇지 않으면 메모리에 남아 있습니다. –
@JuanBayonaBeriso가 스크린 샷으로 내 질문을 편집했습니다. – somejonus