это "жесткий" вопрос. Я не нашел ничего интересного в Интернете.
Я разрабатываю модуль управления памятью для своей компании. Мы разрабатываем игры для консолей следующего поколения (Xbox 360, PS3 и ПК... мы рассматриваем ПК консоль!).
В будущих играх нам понадобится обработать потоки текстур для больших игровых миров, которые не могут быть загружены в основную консольную память (не говоря уже о ПК на данный момент).
Мы собираемся передать в начале hi-res мипмапы текстур (что составляет около 70% от объема мировых данных). Может быть, в будущем нам придется потопить также геометрию, меньшие мип-карты, аудио и т.д.
Я разрабатываю диспетчер памяти для этой проблемы, ориентированный на X360 (потому что на PS3 мы можем использовать память хоста и связанный с ним автодефракционный GMM-распределитель).
Проблема, с которой я сталкиваюсь, заключается в следующем: мы решили зарезервировать определенную область памяти для потоковой передачи текстур (например, 64 мегабайта), и мы хотим обрабатывать все распределения и освобождения от необходимости в этой области. Мы выделили область в начале приложения, и область физически гарантирована быть смежной (не только практически, потому что нам нужно хранить текстуры там).
Я реализовал автоматический дефрагментационный распределитель, используя дескрипторы вместо указателей. Время не проблема, проблема в фрагментации памяти. В игре мы постоянно загружаем и выгружаем потоковые цели, поэтому мы хотели бы использовать максимальный объем нашего буфера (64 мегабайта).
С помощью этого распределителя мы можем использовать все выделенное пространство, но подпрограмма дефрагментации работает в неаккуратное время (иногда 60 миллисекунд, больше, чем кадры!), в то время как алгоритм не так уж плох... есть слишком чересчур непредсказуемые тетср!
Я ищу решение для решения этой проблемы. Я бы хотел найти хотя бы хорошую бумагу или посмертное слово или кого-то, у кого была та же проблема.
Теперь я выбираю между двумя стратегиями: 1) переместите подпрограмму дефрагментации на выделенный поток (хорошо для X360 с потоками 6 hw, плохо для PS3 с потоком hw... и не говорите мне использовать SPU!) Со всеми проблемами многопоточности областей блокировки, доступ к региону, который перемещается,... 2) найти "инкрементное" решение проблемы дефрагментации: мы можем предоставить каждому кадру временный бюджет (например, до 1 миллисекунды) для дефрагментации, а диспетчер памяти будет делать то, что он может сделать в бюджете каждого кадра.
Может ли кто-нибудь рассказать мне о своем опыте?