Войти
ПрограммированиеФорумГрафика

Текстурный кэш

Страницы: 1 2 3 4 5 Следующая »
#0
23:38, 20 окт. 2013

Никто случаем не возился с сабжем?
Проблема такая, что текстур много, все в память не влезают. Предсказать использование многих текстур практически невозможно.
Поэтому было принято решение реализовать кэш, который будет грузить с HDD передавая текстуру в GPU.

Пробовал с DirectX9 рендером, игра заметно подвисает даже при загрузке одной текстуры ARGB 2048x2048 (~1.5mb с PNG компрессией), как это можно заметно ускорить и правильно ли я это делаю вовсе?
Делал так:
1) Загружаю через libpng изображение (тут профайлер показал, что много времени уходит) [этот момент я скорее всего заменю быстрым компрессом c помощью zlib]
2) Создаю текстуру в системной памяти
3) Заливаю изображение в текстуру, располагающейся в системной памяти
4) Создаю и обновляю посредством UpdateTexture() текстуру на GPU

В инетах трудно было найти что-то дельное по теме, в основном только очень древние статьи.
Благодарю!


#1
23:39, 20 окт. 2013

SoulSharer
> 1) Загружаю через libpng изображение (тут профайлер показал, что много времени уходит)
Зачем тебе png ? DXT Сжатие не решит проблему?

#2
23:41, 20 окт. 2013

Andrey
Сжатие хотелось бы обойти, оно ухудшает качество (хоть и немного).
И тут проблема не в сжатии, даже если умещу больше текстур со сжатием, то всеравно я физически не могу предсказать использование многих других текстур.

Другими словами есть много анимаций у персонажа (2D адвенчура), которые должны проигрываться в любое время по запросу скрипта.

#3
23:51, 20 окт. 2013

SoulSharer
Может тебе стриминг кусков сцены подойдет?

#4
23:53, 20 окт. 2013

Andrey
> Может тебе стриминг кусков сцены подойдет?
Насколько я понял, стриминг загружает сначала низкокачественные версии текстур (через мипмапы или еще как), если да - то наврядли такой вариант пойдет. :( (очень будет заметно)
Да и анимация содержится в атласах/полотенцах из кадров, поэтому не уверен, что это будет стримиться хорошо.

#5
23:53, 20 окт. 2013

Вам серьёзное решение или так? Просто если нужна мегатекстура (а по факту то что вы описали это она и есть), то могу поделится некоторым опытом. Но только через скайп, просто писать простыни текста нету никакого желания (я тут одному парню уже объяснял её, так на 12 страниц вроде написал)

#6
23:55, 20 окт. 2013

Bishop
> Вам серьёзное решение или так? Просто если нужна мегатекстура (а по факту то
> что вы описали это она и есть), то могу поделится некоторым опытом. Но только
> через скайп, просто писать простыни текста нету никакого желания (я тут одному
> парню уже объяснял её, так на 12 страниц вроде написал)

Читал немного про мегатекстуру, но оно как-то заумно там и наврядли нужно обычной 2D Adventure игре? Всетаки такой подход больше для ААА класса игр, требующих тонны перформенса.
Может я ошибаюсь?

#7
1:10, 21 окт. 2013

SoulSharer
> Читал немного про мегатекстуру, но оно как-то заумно там и наврядли нужно
> обычной 2D Adventure игре? Всетаки такой подход больше для ААА класса игр,
> требующих тонны перформенса.
> Может я ошибаюсь?
Это довольно сложная технология, но если у вас тормозит - значит видимо она нужна. Ну просто одно то, что вы ждёте в PNG стримящиеся данные уже как-бы плохо, т.к. медленно. Да и заливать на GPU кусками по 16МБ, может быть тоже не лучшее решение (по крайней мере при ваших метриках производительности).

#8
10:55, 21 окт. 2013

SoulSharer
> 1) Загружаю через libpng изображение (тут профайлер показал, что много времени
> уходит) [
грузи в другом потоке

SoulSharer
> 3) Заливаю изображение в текстуру, располагающейся в системной памяти
заливай по кускам-квадратам за несколько кадров а не сразу всю

SoulSharer
> 2) Создаю текстуру в системной памяти
в идеале аллоцируй сразу макс число текстур всех нужных размеров на старте игры

#9
11:14, 21 окт. 2013

Mr F
> грузи в другом потоке
трудно представить, как это поможет. Ведь рендер будет всеравно ждать тоже самое время (пока текстура не загрузится), только теперь с добавленной стоимостью потоков.

Mr F
> заливай по кускам-квадратам за несколько кадров а не сразу всю
Речь о Dirty regions? сомнительная идея

Mr F
> в идеале аллоцируй сразу макс число текстур всех нужных размеров на старте игры
В системной памяти то? Да, наверное имеет смысл взять и все стандартные размеры подготовить от 512х512 до 2048х2048, и через них уже производить обновления текстур на GPU.

#10
11:30, 21 окт. 2013

SoulSharer
> Ведь рендер будет всеравно ждать тоже самое время (
ясен пень - нет.
ты должен запускать поток за некоторое время ДО того когда он понадобится.
говоришь - 2D адвенчура. значит есть направление движения персонажа хотя бы - значит можно начинать загружать то, что находится за экраном, но куда движется персонаж.
UpdateTexture вызываешь, когда загружающий поток закончил работу.

SoulSharer
> сомнительная идея
обоснуй.
я делал - у меня работало. быстрее, чем всю текстуру.

SoulSharer
> В системной памяти то?
во всех, тебе же для UpdateTexture нужны пары системная-видео.

#11
11:41, 21 окт. 2013

Проблема не в подгрузке уровня/сцены. А в непредсказуемости требуемых анимаций.

SoulSharer
> Другими словами есть много анимаций у персонажа (2D адвенчура), которые должны
> проигрываться в любое время по запросу скрипта.

Я не могу никак предсказать, какая анимация будет использоваться в какой момент. Поэтому загружать в итоге остается только во время запроса.
Конечно, можно извращаться и парсить скрипт на наличие нужных анимаций или делать предзагрузку анимаций в скрипте, но это будет слишком накладно. (в том плане что придется писать парсер, его поддерживать итд, или то, что придется смотреть за тем какие анимации юзаются и предзагружать их руками итд)
Вобщем говоря видел как другие адвенчуры подгружают по мегабайту-двух с диска каждый раз когда проигрывается новая анимация - и там лаги незаметны. Хочется сделать также.

#12
11:55, 21 окт. 2013

SoulSharer
Чтобы я поковырял:
1. НЕ создавать тексы каждый кадр.
2. Делать preload, правильно сказали. Если есть возможность, показывать мир на 1-2 кадра позже, пока там что-то грузится, разжимается.
3. Если есть много мелких/средних тестур, запихать их в один большой файл. Seek-ом бегать по ним.
4. Подумать про компрессию. Если не DXT, то хоть визуально посмотреть на свой арт. Может где-то RLE, может в палитру можно запихать,
    может переходы между соседними пикселями 2-4 бита и т.д.

#13
12:13, 21 окт. 2013

> Поэтому было принято решение реализовать кэш, который будет грузить с HDD передавая текстуру в GPU.
SoulSharer, какой-то странный кэш.

> ~1.5mb с PNG компрессией
SoulSharer, не надо грузить PNG. Во-первых, это просто плохо, во-вторых, в видео-памяти пнг жрёт в разы больше места, чем сжатые DDS-текстуры.

> Проблема не в подгрузке уровня/сцены. А в непредсказуемости требуемых анимаций.
SoulSharer, грузи их все заранее, в чём проблема-то? DDS позволяет сжать текстуры в 4-8 раз. Т.е. даже в 512 Мб видео-памяти влезет порядка 500 текстур 1024*1024.

#14
12:57, 21 окт. 2013

slava_mib
> какой-то странный кэш.
Кэш заключается в том, что то, что уже загружено будет переиспользовано. И если не хватает памяти то ненужное будет выгружено соответственно.

Смысл темы потерялся, потому что я видимо неправильно выразил проблему в первом сообщении, а далее никто читать не стал.
Тем не менее спасибо за помощь, может какие мысли из этого выйдут.

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.