Да, вы должны использовать цикл 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.