Timer vs While Loop - Использование памяти - PullRequest
4 голосов
/ 16 августа 2011

Я программирую тип игры на C #, и я хочу знать, как лучше использовать память.Прямо сейчас у меня есть, так что он проходит через цикл while, и пока игра запущена, он проверит определенные вещи (мертв ли ​​этот человек и т. Д.), Поспит одну секунду, затем попытается снова.Когда игра заканчивается, в то время как false устанавливается и выходит из метода.Будет ли таймер лучшим способом сделать это?Иногда я замечаю проблемы с памятью, когда запускаю эту игру.

Ответы [ 6 ]

4 голосов
/ 16 августа 2011

Использование цикла while, вероятно, не ваша проблема.Timer на самом деле немного тяжелее, чем этот подход, и потребляет больше системных ресурсов, но это будет разовое выделение.Другими словами, изменение кода основного цикла из одной структуры в другую вряд ли существенно изменит профиль памяти вашего приложения.

Вы пытались профилировать использование памяти вашим приложением?Вы, вероятно, держитесь за предметы, которые вам больше не нужны.Профилировщик может помочь вам определить, где.

(Если вам интересно, использование Timer, вероятно, окажет очень небольшое влияние на производительность, поскольку каждая итерация вызовет вызов указателя функции, которыйПроцессор и JIT-компилятор не могут оптимизировать очень хорошо. Использование цикла while означает, что ваш код всегда выполняется; вызов Thread.Sleep() может быть оптимизирован довольно хорошо, поскольку он выполняется не через указатель на функцию. Учитывая, что подход Timerтакже может привести к снижению читабельности кода, я настоятельно рекомендую вам продолжать использовать цикл while.)

1 голос
/ 16 августа 2011

Ваш цикл while - хороший выбор. Игровой цикл - самый распространенный способ создания игры.

Вы можете проверить в этой статье , чтобы контролировать различные типы игровых циклов.

Вы также можете использовать xna в качестве основы для своих игр, если вы учитесь. Игровой цикл уже реализован для вас.

В любом случае это не должно быть причиной проблем с памятью.

1 голос
/ 16 августа 2011

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

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

1 голос
/ 16 августа 2011

Да, вы должны использовать цикл while для основного игрового цикла, но вы не должны спать. Вместо этого вам следует ставить отметку времени в последний раз, когда вы рисовали кадр, и каждый раз, когда вы проходите цикл, проверяйте, прошла ли 1/30 секунды или что-то еще. Если нет, то петля занята снова и снова, пока не пройдет.

Каждую секунду «мертвый человек» (даже если это плохой пример IMO) можно просто сделать с другой отметкой времени, защищенной проверкой, чтобы увидеть, прошла ли 1 секунда с тех пор, как «мертвый человек» код был последний запуск. Если у вас нет веских причин для выполнения этой обработки в потоке таймера, лучше всего делать это синхронно.

Ваши проблемы с памятью в основном не связаны с использованием цикла while. Убедитесь, что вы не добавляете элементы в список или что-то еще, и убедитесь, что инициализация любого ресурса выполняется с помощью конструкции using:

using (StreamReader sr = File.OpenText(path))
{
        // blah blah using sr
}

// The streamreader has been automatically disposed by this point.
1 голос
/ 16 августа 2011

Я думаю, что цикл while - лучший подход для такой задачи (возможно, в сочетании с потоком). Таймер в основном для более длинных и точных периодов времени.

1 голос
/ 16 августа 2011

Изменение этого параметра на таймер против сна не окажет (эффективно) никакого влияния на использование памяти.Основное различие будет заключаться в логике работы вашего приложения - с таймером у вас не будет последовательного процесса в цикле while, а будет серия «событий», которые происходят через регулярный интервал.

...