Управление памятью C++ для потоковой передачи структуры в видеоиграх

Использовать 1 a float и float division

public static void main(String d[]){
    double g=1f/3;
    System.out.printf("%.2f",g);
}
20
задан ugasoft 19 March 2009 в 11:35
поделиться

5 ответов

Я сделал большое исследование недавно относительно управления памятью, и это - самая информативная и полезная статья, которую я нашел в сети.

http://www.ibm.com/developerworks/linux/library/l-memory/

На основе той бумаги лучший и самый быстрый результат, который Вы получите, должен разделить Ваших 64 МБ на равные размерные блоки. Размер блоков будет зависеть от Вашего размера объекта. И выделите или освободите полный блок за один раз. Это

  1. Быстрее, чем возрастающая сборка "мусора".
  2. Более простой.
  3. И решает то "слишком много фрагментации" проблема некоторой суммой.

Read это, Вы найдете превосходную информацию о каждом возможном решении существует и достоинства и недостатки для каждого.

14
ответ дан 30 November 2019 в 00:59
поделиться

Почему бы не использовать несколько областей памяти для переданных потоком структур и пула размером структуры?

у Страдающего бессонницей есть статья об их реализации потоковой передачи структуры на PS3. Я предполагаю, что это могло быть полезно: ссылка .

, Чтобы общие стратегии выделения минимизировали фрагментацию, возможно , Doug Lea может помочь.

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

5
ответ дан 30 November 2019 в 00:59
поделиться

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

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

существуют некоторые вопросы, которые я оставляю неразрешенным здесь - например, точно как уплотнить память. Стандартное невозрастающее средство выделения копирования может только начать выделять от передней стороны, затем скопировать все в спину (освобождающий память в передней стороне), когда память заканчивается, но у Вас нет той свободы здесь. Вам, возможно, понадобилась бы некоторая эвристика, чтобы решить, переместить ли блоки вперед или назад. Важная вещь состоит в том, чтобы избежать колебаний (тот же блок, перемещаемый вперед тогда назад в последовательные вызовы к malloc() или free()).

2
ответ дан 30 November 2019 в 00:59
поделиться

Я рекомендовал бы поэтапный подход. Каждый кадр находит непрерывный блок inuse памяти, которая имеет свободное пространство с обеих сторон, и переместите его в то, какой бы ни направление позволит этому соответствовать. или Вы могли просто переместить все блоки в одно направление, найти разрыв и inuse блок, который является лучшим пригодным для него, и переместите его. На 360 необходимо, вероятно, использовать поток, чтобы сделать перемещение, в то время как на PS3 было бы лучше использовать GPU для перемещения данных для Вас.

1
ответ дан 30 November 2019 в 00:59
поделиться

У нас почти точно такая же система, как вы описали, за исключением того, что мы размещаем в слотах фиксированного размера - текстуры 256x256, 512x512, 1024x1024 и 2048x2048, в двух форматах каждый (DXT1 и DXT5) - точно так, чтобы избегайте управления памятью.

2
ответ дан 30 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: