Недавно я тоже наткнулся на это; Я не думаю, что это проблема с переключением буферов. Это должно быть то же самое в 3.1 и 4.0. Я посмотрел на GraphicsDevice с ILSpy и обнаружил это:
Что изменилось, так это то, что в 4.0 текущая цель рендеринга сначала очищается в GraphicsDevice.Present (), если установлен частный флаг. По умолчанию этот флаг будет установлен изначально (цель рендеринга чистая). Рисование в цель рендеринга снимает этот флаг (цель рендеринга теперь грязная). После выполнения своих обязанностей GraphicsDevice.Present () снова устанавливает флаг (цель рендеринга была «очищена» от вашего окна и теперь снова считается чистой).
Чтобы получить результаты от GraphicsDevice.Present (), вам необходимо вызывать Draw () и EndDraw () в строгой последовательности.
Если вы вызываете EndDraw () без предварительного вызова Draw (), вы не получите содержимое цели рендеринга (которая очищается), а только фиолетовый экран.
К сожалению, флаг является частным, и нет чистого способа получить его. Вы можете использовать отражение, чтобы очистить флаг следующим образом, заставляя цель рендеринга грязной, не рисуя ничего в нее:
graphicsDevice.GetType (). GetField ("lazyClearFlags", BindingFlags.NonPublic | BindingFlags.Instance) .SetValue (graphicsDevice, 0);
(graphicsDevice - ваш текущий экземпляр GraphicsDevice)
Поместите вышеуказанную строку перед вызовом EndDraw (), и поведение вернется к тому, что было в 3.1