aruslan: (Default)
[personal profile] aruslan
Иногда создается ощущение, что то, как линкер работает - военная тайна.
И поэтому делают странное и смешное.

Например, в процессе чтения одного ассета (или библиотеки ассетов) - лезут в другой, в третий, обратно в первый, обратно во второй.
До тех пор, пока много секунд загрузки не будут потрачены исключительно на DVD seek.
Про циркулярные зависимости я промолчу. И про тонны копирований внутри - тоже.
Ну и про отсутствие минимального контроля целостности.

А вот линкеры - они обычно умнее. Особенно те, что разрешают связи при загрузке.
Конечно, не все.
Есть пара линкеров, которые умиляют всех уже давно, и вот они как раз делают очень похоже.

В потрепанной жёлтой книжке про Ассемблер и Линкер я вычитал в детстве тривиальный принцип: cначала надо собрать всю инфу о связях,
и только потом эти связи разрешить.

В геймдеве ассеты, используемые одновременно, обычно складывают в библиотеки. Ассеты ссылаются на ассеты в других библиотеках, и обычно можно понять в каких именно. И памяти всегда более чем хватает чтобы всю инфу собрать. Всё это - сильно упрощает.

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

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

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

Плюс в реальной жизни библиотеки ассетов не бывают вот уж прям настолько отдельными. Поэтому можно вполне еще в оффлайне построить карту связей, отсортировать её топологически да грузить в том порядке который подходит.
И на DVD/Blu-ray в оптимальном порядке записать.
И табличку заранее составить типа какой ассет где лежит.
Патчи и лок-киты в эту схему обычно вполне вписываются.

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

Замечу - эта схема более чем тривиальная.
Её в самом тупом виде реализовать ничуть не сложнее, чем сложную обычную.
Учитывая управление временем жизни и прочее счастье вроде хэш-таблиц - так еще и проще.

Грустно про это рассказывать, на самом деле. Ведь не стриминг бесконечных миров даже.
Вот и дядя Дима на gamedeff рассказывает хоть и уровнем повыше, но всё про то же.

Зачем делать плохо - вот загадка.
Лучше уж не делать совсем - хотя бы устойчивее работать будет, да и дешевле.

Date: Dec. 21st, 2007 01:57 (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
>Её в самом тупом виде реализовать ничуть не сложнее, чем сложную обычную
Я не согласный. hash_map<string, T> - гораздо проще чем тонны кода в оффлайне.

ДУМАТЬ о том что бы всё сролось после СЛОЖНО!

Date: Dec. 21st, 2007 03:26 (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Вот есть у нас D3DXCreateTextureFromFile, std::map, shared_ptr. "Текстурный менеджер" пишется меньше чем за час. Твои же мега-системы билда ассетов сначала продумываются днями, затем днями на white-board и на бумажках, затем пишется неделю в несколько пар рук, затем ещё несколько месяцев находим редкие баги и забытые ассерты. Как можно сложное называть простым - я не понимаю. Разумеется, у KISS решения куча недостатков, но его нельзя нельзя назвать "таким же простым".

Date: Dec. 21st, 2007 03:42 (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
А потом к тебе приходят, и спрашивают, а как загрузить двумерный массив

char *characters[3] = { "cat", "dot", "mouse" };
for (int i = 0; i < ARRAY_SIZE(characters); ++i)
   for (int j = 0; j < ANIMATION_MAX; ++j)
     ... = LoadTexture("animations/%s_%02d", characters[i], j);


и оказываетя что надо либо ограничить себя в хотениях, либо проводить сложные модификации билдера ресурсов, либо при старте делать что-то с массивами, структурами и вообще новым языком программирования для описания ресурсов.

Date: Dec. 21st, 2007 08:29 (UTC)
From: [identity profile] virtul.livejournal.com
Думаеццо, что на консолях по другому не взлетит. Да и крупном писишном стоит имхо заморочиться на нечто подобное.

Date: Dec. 21st, 2007 09:06 (UTC)
From: [identity profile] aruslan.livejournal.com
Взлететь-то взлетит, к сожалению.
Если ассертов понаставить, сделать руками кэширующие фиберы и с бубном потанцевать.

Просто вот эта пластическая хирургия - она не нужна совсем.
Проще написать то же самое - но дешевле и яснее.

Date: Dec. 21st, 2007 09:20 (UTC)
From: [identity profile] virtul.livejournal.com
>Если ассертов понаставить, сделать руками кэширующие фиберы и с бубном >потанцевать.

Ну это из серии "а давайте [пока] делать игровые объекты в хмльках". Знаем проходили.

Date: Dec. 21st, 2007 09:32 (UTC)
From: [identity profile] aruslan.livejournal.com
Вот через это и.

Date: Dec. 21st, 2007 11:51 (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Но зато в простой схеме, которая потом становится сложней, каждый шаг следующий шаг очевиден.

1) Грузим в игровом цикле. После десяти картинок - FPS никакой.
2) Грузим перед игровым циклом. Скорость загрузки - в три раза больше, чем хочется.
3) hash_map. Тонем в сиках.
4) Выдаем пользователю не текстуру, а пустышку-прокси, которую грузим потом когда удобней. Менеджер мержит и сортирует запросы, что бы читать по порядку. Барахтаемся в сиках.
5) Profile Guided Optimization. Пишем скрипты, который смотрит что когда игра грузит, и под это переставляет файлы.
7) Тестеры часто жалуются на assertion failed на недостающий файл. Пишем regexp, который по коду находит использующиеся текстуры, с 5% LoadTexture которые не подходят под regexp разбираемся отдельно.
7) Много лишних неиспользующихся текстур, проблема решается как в предыдущем пункте.

В результате получается гораздо сложней чем линкер, но 1) можно вовремя остановиться 2) 7 по 0.2 может быть легче чем 1.0 одним куском.

Date: Dec. 21st, 2007 11:53 (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
> Скорость загрузки - в три раза больше, чем хочется
*Время загрузки - в три раза больше, чем хочется
*Скорость загрузки - в три раза меньше, чем хочется

Date: Dec. 21st, 2007 22:21 (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Читаю The way that the system developed is perfectly logical. It makes sense., и оно мне напомнило этот пост :)

Date: Dec. 21st, 2007 09:02 (UTC)
From: [identity profile] aruslan.livejournal.com
Если что - ты говоришь странное.
Я строго за тупую загрузку ассетов говорю.
Без всяких этих энтелегентских шалостей.

LoadTexture будет работать вполне себе замечательно.

Date: Dec. 21st, 2007 09:04 (UTC)
From: [identity profile] aruslan.livejournal.com
Опять ты говоришь странное.
Я не предлагаю мегаунификации или там спецификации.
Я наоборот - предлагаю простые тупые решения.

Или уж тогда не делать вид что решение есть и тупо юзать map+ptr, да.

Date: Dec. 21st, 2007 08:59 (UTC)
From: [identity profile] aruslan.livejournal.com
Дык я ж не против hashmap! Это как раз из серии "лучше уж не делать совсем" - быстро дешево и работает!

Я против когда делают много всякого - и оно работает плохо.

Date: Dec. 21st, 2007 09:02 (UTC)
From: [identity profile] fenikso.livejournal.com
Если я правильно помню, некоторые линуксовые LiveCD как раз оптимайзят в том плане, чтобы при загрузе минимум DVD seeks был. Вроде как хорошее ускорение загрузки получается :)

Date: Dec. 21st, 2007 09:11 (UTC)
From: [identity profile] aruslan.livejournal.com
Оптимайзить игру в плане DVD layout - простое и радостное занятие.
Но не в случае, если кто-то бегает по диску туда-сюда в поисках утерянного счастья. Не всегда под кэш есть много памяти, обычно есть только на один-два уровня промахов. Ну и фрагменты файла разместить непоследовательно может просто не получиться.

Date: Dec. 24th, 2007 09:31 (UTC)
From: [identity profile] loyso-b.livejournal.com
> Зачем делать плохо - вот загадка.

Какая уж тут загадка. Традиционно систему зачинает группа amateurs у которой весь анализ происходит в спинном мозге (на уровне "лучше уж не делать совсем"). А потом про нее забывают. Ибо даже у студентов все фичи - по экспоненте ;)

Date: Feb. 4th, 2010 14:38 (UTC)
From: [identity profile] al-zatv.livejournal.com
привет! вопрос немного не по теме, но по программированию
http://al-zatv.livejournal.com/137474.html
если есть чего посоветовать, буду признателен.

tigla tondach

Date: May. 5th, 2011 10:22 (UTC)
From: (Anonymous)
Ola i,m new in this web site and i will want the newideas postated heare.I know your web frombing blog and i have tryed to register some seconds a go but this secret code was hard ro see but i manage it : This was my introduction in this questbook
Regards Me
And this is my blog you can send to my e-mail



[url=http://www.austrodach.ro/acoperisuri-si-fatade/tigle-tondach-ceramica-metalice.html]http://www.austrodach.ro/[/url]
tigle metalice (http://www.austrodach.ro/)


http://cgi.ebay.com/Blog-Forum-Questbook-Profile-BACKLINKS-6000-pakage-/260776115215?pt=LH_DefaultDomain_0&hash=item3cb777bc0f FOR YOUR WEB SITE

Profile

aruslan: (Default)
aruslan

January 2014

S M T W T F S
   1234
56789 1011
12131415161718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 27th, 2025 08:08
Powered by Dreamwidth Studios