Суббота, 23 Ноября 2024, 08:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Приложение съедает очень много оперативной памяти
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 (там много професионалов)

Ну и удачи решеная проблемы ! smile


ваще пох на суши... ем МЯСО)))))


Сообщение отредактировал 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
участник
Сейчас нет на сайте


Параноик с гениальным планом по захвату мира.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг