Приложение съедает очень много оперативной памяти
|
|
vaulverin | Дата: Вторник, 18 Декабря 2012, 15:56 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Доброго времени суток,
есть сцена, которая подгружает картинки из папки ( они не зашиты в приложение, так как требуется возможность замены этих картинок ), беда в том что делает она это очень медленно ( около минуты, хотя общий вес картинок 10Мб ), это во первых, а во вторых "съедается" огромное количество ОП ( примерно 2 Гб !), что делает не возможным запуск приложения на машинах с объемом ОП 2Гб и меньше. При исключении этой сцены приложение загружается почти мгновенно и требует совсем не много ОП.
Вот код сцены: Code using UnityEngine; using System.Collections; using System.Collections.Generic;
// класс для загрузки картинок public class Images : MonoBehaviour{ public Dictionary<string, Texture2D[]> Slider; public Texture[] fullsizePictures; public IEnumerator getImages(){ string filePath; string[] Folders = new string[] { "Layer1Slides", "Layer2Slides", "Layer3Slides", "Layer4Slides", "Layer5Slides", "Layer6Slides", "Layer7Slides", "BottomLayer1Slides", "BottomLayer2Slides", "BottomLayer3Slides", "BottomLayer4Slides", "BottomLayer5Slides", "BottomLayer6Slides", "BottomLayer7Slides", "BottomLayer8Slides", "BottomLayer9Slides", "BottomLayer10Slides", "BottomLayer11Slides", "BottomLayer12Slides", "fullsizePictures" }; Slider = new Dictionary<string, Texture2D[]>(); for(int j = 0; j < Folders.Length; j++){ filePath = Application.streamingAssetsPath+"/slides/"+Folders[j]+"/"; string[] images = System.IO.Directory.GetFiles(@filePath, "*.jpg"); if(Folders[j] == "fullsizePictures") fullsizePictures = new Texture[images.Length]; else Slider[Folders[j]] = new Texture2D[images.Length]; for (int i = 0; i < images.Length; i++){ WWW img = new WWW("file://"+images[i]); yield return img; if(Folders[j] == "fullsizePictures") fullsizePictures[i] = img.texture; else Slider[Folders[j]][i] = img.texture; if(j == Folders.Length - 1 && i == images.Length - 1){ Application.LoadLevel("main"); } } } } }
public class preload : MonoBehaviour { public Images img; void Awake(){ DontDestroyOnLoad(this); } void Start () { img = gameObject.AddComponent<Images>(); StartCoroutine(img.getImages()); } }
|
|
| |
BlackDevid | Дата: Вторник, 18 Декабря 2012, 19:38 | Сообщение # 2 |
частый гость
Сейчас нет на сайте
| Я в языке C# знаю мало ) Но может быть распаковывать эти картинки из архива или перегони их в более легкий формат к примеру jpg (если у тя png и.т.д.) А лучше ищи совета на официальныйх рускоязычныйх форумах Unity3D (там много професионалов)
Ну и удачи решеная проблемы !
ваще пох на суши... ем МЯСО)))))
Сообщение отредактировал BlackDevid - Вторник, 18 Декабря 2012, 19:39 |
|
| |
SEvg | Дата: Вторник, 18 Декабря 2012, 20:04 | Сообщение # 3 |
Алхимик
Сейчас нет на сайте
| Мне кажется, что-то напутано и создаются лишние текстуры...
Можно как нибудь узнать, сколько было создано текстур движком? И сравнить с желаемым.
В два гига, влезет около 500 текстур, разрешением 1024х1024. И вообще, разве Unity не пихает их в видеопамять?
Сообщение отредактировал SEvg - Среда, 19 Декабря 2012, 11:58 |
|
| |
TreinDSM | Дата: Среда, 19 Декабря 2012, 08:47 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| BlackDevid, Размер текстуры на жестком диске и размер текстуры в оперативки - это два разных размера. Формат сжатия влияет только на вес файла.
vaulverin, А каковы линейные размеры текстур? Хотя 2 Гб это все равно много. Соглашусь с SEvg - надо смотреть, не создаются ли одни и те же текстуры несколько раз.
|
|
| |
vaulverin | Дата: Среда, 19 Декабря 2012, 13:46 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| 95 jpg картинок с разрешением 1500 x 722 (RGB 24bit), текстура каждого изображения получается занимает чуть больше 3Мб, все вместе около 300Мб, но ни как не 2Гб.
А как посмотреть не создаются ли одни и те же текстуры несколько раз? Проверил массив с текстурами ни чего лишнего там нет.
|
|
| |
Левша | Дата: Среда, 19 Декабря 2012, 14:25 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| Quote (vaulverin) 1500 x 722 Весьма нежелательно использовать в Юнити *неквадратные* и не кратные 2-м (нестандартных разрешений) текстуры. Возможно что это и есть причина. А вообще для того чтоб найти утечку памяти существует профайлер (ПРО).
X.cor.R (Prologue)
|
|
| |
uniMaker | Дата: Среда, 19 Декабря 2012, 19:54 | Сообщение # 7 |
уже был
Сейчас нет на сайте
| У меня была такая же проблема. Создавал интерактивное приложение в которое загружались текстуры размером около 8к на 4к. После последовательной загрузки нескольких ОП забивалась напрочь (6Гб). В сё решилось простым уничтожением ( Destroy() ) старой текстуры и загрузки новой.
|
|
| |
Fumlead | Дата: Среда, 19 Декабря 2012, 20:05 | Сообщение # 8 |
участник
Сейчас нет на сайте
|
Параноик с гениальным планом по захвату мира.
|
|
| |