Могу ли я (ab) использовать VirtualAlloc для каждого векторного контейнера в игре?

Представь, что я делаю игру

  • Я знаю, что он будет работать в 64-битной системе, в 64-битной ОС
  • бюджет памяти для игры фиксирован 2 (или 4) гибибайта

Это будет означать, что из 64 бит Virtual Address Space для процесса, я бы получил 32 бита, чтобы поиграть, как я хочу?

Могу ли я — например — для каждый контейнер в игре (контейнер = что-то вроде std::vector) использовать VirtualAlloc а также MEM_RESERVE 2 гибибайта памяти?

По мере добавления новых элементов новые pages (где-то около 64К) MEM_COMMITпо мере необходимости Как контейнер умирает память освобождается с VirtualFree соответственно.

Из любопытства:

  1. Будет ли это технически Работа?

  2. Есть ли какие-то причины для производительности, чтобы этого не делать?


РЕДАКТИРОВАТЬ: Уточнение: если в игре 10000 контейнеров, это будет резерв 2 ГБ * 10000 памяти — НО поручены память будет менее 2 (или 4) ГиБ.

Эти 10000 контейнеров также могут составить 2 ^ 16 контейнеров (или столько, сколько позволяет адресное пространство).

1

Решение

Да, это можно заставить работать.

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



1. Хотя это было довольно давно — Windows NT 4 или, может быть, временные рамки Windows 2000, так что с тех пор все могло измениться.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]