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