Могу ли я (ab) использовать VirtualAlloc для каждого векторного контейнера в игре?
Представь, что я делаю игру
- Я знаю, что он будет работать в 64-битной системе, в 64-битной ОС
- бюджет памяти для игры фиксирован 2 (или 4) гибибайта
Это будет означать, что из 64 бит Virtual Address Space
для процесса, я бы получил 32 бита, чтобы поиграть, как я хочу?
Могу ли я - например - для каждого контейнера в игре (контейнер = что-то вроде std::vector
) использовать VirtualAlloc
а также MEM_RESERVE
2 гибибайта памяти?
По мере добавления новых элементов новые pages
(где-то около 64К) MEM_COMMIT
по мере необходимости Когда контейнер умирает, память освобождается VirtualFree
соответственно.
Из любопытства:
Будет ли это технически работать?
Есть ли какие-то причины для производительности, чтобы этого не делать?
РЕДАКТИРОВАТЬ: Уточнение: если в игре 10000 контейнеров, это зарезервирует 2 ГБ * 10000 памяти - НО выделенная память будет менее 2 (или 4) ГиБ.
Эти 10000 контейнеров также могут составить 2^16 контейнеров (или столько, сколько позволяет адресное пространство).
1 ответ
Да, это можно заставить работать.
Когда я поэкспериментировал с ним1, я обнаружил, что он по-прежнему работает лучше всего для выделения памяти, начиная с довольно большого куска памяти (например, мегабайта), затем следуя геометрической прогрессии размеров. призвание VirtualAlloc
(по-видимому) требует переключения в режим ядра, так что есть достаточно накладных расходов, которые вы хотите избегать делать это очень часто, если можете помочь.
1. Хотя это было довольно давно -Windows NT 4 или, может быть, временные рамки Windows 2000, так что с тех пор все могло измениться.