Форум программистов, компьютерный форум, киберфорум
XNA/MonoGame
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/56: Рейтинг темы: голосов - 56, средняя оценка - 4.98
34 / 11 / 0
Регистрация: 22.09.2010
Сообщений: 357
1

Проблемы, связанные с ContentManager и загрузкой/выгрузкой контента

31.12.2010, 13:40. Показов 10307. Ответов 106
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Краткая сводка:

1) Рабочий пример загрузки текстуры
2) RootDirectory нельзя изменить после присвоения. Однако это не мешает инициализировать её абсолютным путём, например: "C:\\"
3) Пример загрузки в случае RootDirectory = "Content" (расширения при загрузке не указываются):
C#
1
texture = Content.Load<Texture2D>(@"folder1\\folder2\\texture");
4) Пример загрузки текстуры, не используя ContentManager:
C#
1
texture = Texture2D.FromStream(GraphicsDevice, File.OpenRead("путь" + ".png"));
5)При выгрузке ассетов(не всех сразу вызовом Unload()), занимаемая ими память не освобождается даже при обнулении ссылки на ассеты и вызова сборщика мусора. Память высвобождается путём обнуления ссылок, которые указывают на этот экземпляр контент менеджера. Есть несколько способов избежать этого:
__А) создавать ContentManager на каждый ассет.
__Б) создать свой класс. наследуя от ContentManager

6) Способ загрузки эффектов, текстур, моделей и т.д. в реальном времени (динамическая компиляция).

7) Чтобы игра не зависала при длительных загрузках, загружать нужно в отдельном потоке, используя классы Thread/Task и т.д.

___________________________________________________________

Помогите, не пойму в чем проблема, в участке кода
spriteTexture = content.Load<Texture2D>(@"all\textures\qwerty1");
выскакивает исключение Error loading "all\textures\qwerty1". File not found.
Хотя в проект добавлен каталог all и в нем textures и внутри файл qwerty1.jpg, и через проект изображение открывается. Я даже задавал полный путь - то же самое пишет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.12.2010, 13:40
Ответы с готовыми решениями:

Проблемы с выгрузкой файлов
Здравствуйте при выгрузке файлов, при совпадении имен как я понимаю почему то одному файлу...

Проблемы с выгрузкой информации в Excel
Есть вьюха первое поле - номер во вьюхе остальные поля с данными текстовыми и одно поле...

Настройки Биос, связанные с загрузкой?
Доброго времени суток! Постигла меня следующая проблема: в windows отказали клавиатура и мышь...

Отслеживание изменений URL на сайте с динамической загрузкой контента
Подскажите пожалуйста, как отслеживать изменения URL при динамической загрузке контента,...

106
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
17.12.2012, 23:44 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Yegorf1 Посмотреть сообщение
Немного непонял задачу... Уточни.
Я создал приложение WindowsFormsApplication и UserControl в котором и рисую с помощью XNA. Но что бы загрузить текстуры и другие ресурсы мне нужен ContentManager. Вот я и спрашиваю как его обьявить и настроить для обычного проекта WindowsFormsApplication
0
25 / 25 / 0
Регистрация: 02.10.2012
Сообщений: 63
20.12.2012, 19:59 62
А ты сделай на оборот, создай проект Windows Game 4.0 и потом заюзай ссылки:
C#
1
2
3
System.Data
System.Drawing
System.Windows.Forms
И будет у тебя и то и другое.
0
-4 / 0 / 1
Регистрация: 24.12.2011
Сообщений: 51
21.12.2012, 15:37 63
Ты не сможешь рисовать текстурами XNA на WinForms
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
21.12.2012, 15:39 64
Цитата Сообщение от Yegorf1 Посмотреть сообщение
Ты не сможешь рисовать текстурами XNA на WinForms
и по чему же? я рисую на userControl
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 3
05.01.2013, 21:35 65
Если я пишу что то вроде Content.Load<Texture2D>("Name"), то всё загружается.
Если же путь до файла сложнее Content.Load<Texture2D>("Level/Name"), пишет, что такого файла нет
Указываю полный путь, говорит, что не может загрузить этот файл.
Как правильно указать путь до файла?
0
5 / 5 / 0
Регистрация: 11.06.2011
Сообщений: 82
06.01.2013, 12:52 66
Попробуй так: Content.Load<Texture2D>(@"Папка/Текстура"); - проще говоря попробуй собаку поставить перед кавычками

По идеи все так, у меня и без собаки работает.
0
25 / 25 / 0
Регистрация: 02.10.2012
Сообщений: 63
06.01.2013, 16:14 67
Ну смотри путь который ты описываешь в методе Load есть относительный, относительно корневого каталога Content, по умолчанию корень = Content/, следовательно если в проекте контента есть каталог Textures а в нем есть текстура img.png, то путь к ней будет Textures/img.png, если ты поставишь корень как Content/Textures/ то путь к той же текстуре уже будет просто img.png;
Файлы которые лежат не в проекте контента нельзя загрузить через Content; Для этого есть другие средства.
0
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
07.01.2013, 14:38 68
В Load, да, путь относительно root-директории которую можно поставить и абсолютной, главное чтобы загружаемые файлы были скомпилированы. RootDirectory можно менять сколько угодно раз.
C#
1
2
Content.RootDirectory = @"C:\";
Content.Load<Model>("1");
Ну или сделать расширение
C#
1
2
3
4
5
6
7
8
    public static class Extension
    {
        public static void LoadAbsolute<T>(this ContentManager cm, String str)
        {
            cm.RootDirectory = Path.GetDirectoryName(str);
            cm.Load<T>(Path.GetFileNameWithoutExtension(str));
        }
    }
Потом вызывать Content.LoadAbsolute <тип> (полный путь);
1
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 3
09.01.2013, 16:31 69
Проблему решил. Я зачем то в классе Level создавал свой ContentManager.

C#
1
2
3
4
5
 public Level(IServiceProvider ServiceProvider, LevelName level)
        {
            content = new ContentManager(ServiceProvider, "Content");
            LoadLevel(level);
        }
Если использовать Content из Game1 всё работает.
0
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
09.01.2013, 17:26 70
Цитата Сообщение от ganja_san Посмотреть сообщение
Если использовать Content из Game1 всё работает.
Работает то работает, но забивающуюся память обнулением ссылки и вызовами сборщика не очистишь, потому что последнюю ссылку которая сидит списке загруженных файлов в cm не удасться занулить ввиду его приватности, выход можно найти только при использовании нескольких cm или наследовать от него.
0
0 / 0 / 0
Регистрация: 08.08.2012
Сообщений: 15
17.01.2013, 01:48 71
Доброго времени суток гуру XNA)

Начинаю изучать xna, хотелось бы узнать как сделать прелоадер.

Ну тоесть пока грузится весь нужный контент, что бы внизу проценты писало или еще что-то.
0
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 4
18.01.2013, 17:17 72
Вот не сильно сложный "Прелоадер" - сам выставляешь время в секундах в переменной timetoload (в примере я беру рандомные значения).
Он показывает сколько прцоентов "Загрузилось".
Как сделать прелоадер, который показывал бы сколько загрузилось контента - не знаю
Думаю лучше вообще его не надо использовать, если делаешь простую игру.

Добавь в контент текстуру черного пикселя, назови pixel.
Добавь в контект шрифт и назови его font.
(Правой клавишей на Content -> Add -> Existing Item -> Font и название font)

Класс Loading
В нем создаем наш компонент "Загрузку", который будет рисоваться.
DrawableGameComponent - Игровой компонент который рисуется, методы Update, Draw обрабатываются вместе с классом Game1.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
 
 
namespace Preloader
{
    class Loading : Microsoft.Xna.Framework.DrawableGameComponent
    {
        SpriteBatch spriteBatch;
        //Всемогущий Рандом!
        Random rnd = new Random();
        //Текстура белого пикселя
        Texture2D pixel;
        //Шрифт
        SpriteFont font;
        //Время загрузки
        int timetoload;
        //Переменная чтобы получить время
        private double time;
        //Свойство, вычисляющее процент загрузки
        public int LoadPercent
        {
            get
            {
                //Если меньше 100, то считаем
                if (((int)(time / 10) / timetoload) < 100)
                    return ((int)(time / 10) / timetoload);
                //Если равно 100 или больше - будет возвращать 100
                else
                    return 100;
            }
            set
            {
                time = 0;
            }
        }
 
        
 
        public Loading(Game game)
            : base(game)
        {
            Game.Content.RootDirectory = "Content";
            //Берем произвольное количество секунд через Рандом
            timetoload = rnd.Next(1, 10);
        }
 
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            //Загружаем текстуру пикселя и шрифта
            pixel = Game.Content.Load<Texture2D>("pixel");
            font = Game.Content.Load<SpriteFont>("font");
 
        }
 
        public override void Update(GameTime gameTime)
        {
            //Каждый раз прибавляет в переменную время, которое прошло в миллисекундах
            time += gameTime.ElapsedGameTime.TotalMilliseconds;
            base.Update(gameTime);
        }
 
        public override void Draw(GameTime gameTime)
        {
            spriteBatch.Begin();
            //Рисуем прямогульник из пикселей
            spriteBatch.Draw(pixel, new Rectangle(0, 0, LoadPercent, 20), Color.White);
            //Рисуем текст
            spriteBatch.DrawString(font, LoadPercent.ToString() + "%", new Vector2(40, 0), Color.White);
            spriteBatch.End();
        }
    }
}


Класс Game1
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
 
namespace Preloader
{
 
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        //Наша загрузка
        Loading loading;
 
 
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            //Высота окна
            graphics.PreferredBackBufferHeight = 20;
            //Ширина окна
            graphics.PreferredBackBufferWidth = 100;
        }
 
 
        protected override void Initialize()
        {
            //Создаем экземпляр компонента "Загрузка"
            loading = new Loading(this);
            //Добавляем в компоненты
            Components.Add(loading);
            base.Initialize();
        }
 
 
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
        }
 
 
        protected override void UnloadContent()
        {
 
        }
 
 
        protected override void Update(GameTime gameTime)
        {
            //Пишем такое: если загрузка завершена - выключаем компонент загрузки
            if (loading.LoadPercent >= 100)
            {
                //Выключаем компонент "Загрузка"
                loading.Enabled = false;
                //Отключаем видимость компонента
                loading.Visible = false;
                //Обнуляем время "Загрузки", чтобы включить в следующий раз
                loading.LoadPercent = 0;
            }
            base.Update(gameTime);
        }
 
 
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            base.Draw(gameTime);
        }
    }
}
0
25 / 25 / 0
Регистрация: 02.10.2012
Сообщений: 63
19.01.2013, 22:23 73
Делать прелоадер на таймере или на временных задержках полностью бессмысленно. А вот если делать на контенте это правильно.
Чтобы сделать загрузку по контенту её надо выложить в отдельный поток, а именно в поток Update().
При каждом выполнении метода Update() мы загружаем 1 единицу контента, а в методе Draw() помним сколько контента было в начале и выводим любым способом (количественном или процентном) сам прогресс загрузки.
Вот тебе и прелоадер простыми словами.

Если кому интересно я могу описать очень интересный процесс контента типа Common, и загрузки контента по слоям - это позволит значительно экономить память как ПК так и телефона.
2
46 / 46 / 12
Регистрация: 03.08.2012
Сообщений: 215
26.03.2013, 00:50 74
Случайно удалил ссылку на проект content. Как ее вернуть?
Изображения
 
0
58 / 58 / 9
Регистрация: 09.01.2013
Сообщений: 247
26.03.2013, 10:33 75
Цитата Сообщение от dood Посмотреть сообщение
Случайно удалил ссылку на проект content. Как ее вернуть?
ПКМ и AddContentReference.
Там будут папки контента которые лежат в корне папки проекта (по идее только одна), выбираете нужную и добавляете.
1
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
04.05.2013, 00:40 76
Уважаемые форумчане облазил весь интернет и ничего толкового не нашел. Мне нужно создать ContentManager через который я смогу загружать текстуры. Пробовал делать так в классе который наследуется от класса Game:
C#
1
content=new ContentManager(Services);
после чего загружаю так
C#
1
 texture = content.Load<Texture2D>(puth);
выдает ошибку Error loading "don.jpg". File not found.
Как правильно загружать текстуры?

Добавлено через 55 минут
Добавил в проект Empty Content Project и в него добавил нужные текстуры, но все равно та же самая ошибка!
кто нибудь может помочь???
0
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
04.05.2013, 11:59 77
а ты вот так сделал?
C#
1
content.RootDirectory = "Content";
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
04.05.2013, 12:35 78
Цитата Сообщение от WWWinplex Посмотреть сообщение
а ты вот так сделал?
C#
1
content.RootDirectory = "Content";
да, но все равно файл не найден
0
46 / 46 / 12
Регистрация: 03.08.2012
Сообщений: 215
04.05.2013, 12:36 79
В классе получайте ContentManager, а из Game1 передавайте Content.
0
to
19 / 19 / 2
Регистрация: 28.10.2010
Сообщений: 296
04.05.2013, 12:43 80
Цитата Сообщение от dood Посмотреть сообщение
В классе получайте ContentManager, а из Game1 передавайте Content.
не получается так, потому как у меня нет класса Game, я пытаюсь рисовать на WinForm, и это у меня получается, но вот загрузить текстуру не получается.
Хотя я могу создать производный класс от Game, но все равно что-то не получается.
как сделать просто Контент не использую XNA
0
04.05.2013, 12:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2013, 12:43
Помогаю со студенческими работами здесь

Подскажите совет как разобраться с загрузкой разного контента
Имеется пункты меню &lt;MenuItem Header=&quot;База данных&quot;&gt; &lt;MenuItem Header=&quot;База...

Оптимизация и доработка выпадающего меню с загрузкой, посредством Ajax, контента
Всем добра. Делаю меню для сайта, вот сам код. &lt;ul class=&quot;sub-catalog&quot;&gt; &lt;li&gt; &lt;a...

Проблемы с загрузкой
Здравствуйте. У меня есть такая проблема. Я установил Windows 8, перезагрузил, и тут же у меня...

Проблемы с загрузкой HDD
Ребутнул ноут на днях, теперь не грузит систему с диска. БИОС определяет веник все как надо быть,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru