2013-03-04 6 views
0

Я недавно начал использовать Direct2D, обнаружил какое-то странное поведение при изменении размера окна: использование памяти skyrocket, а в конце я получаю некоторую ошибку «из памяти». Вот схема моего кода:Распространение памяти Direct2D при изменении размеров окон

// Nothing special in there 
int wWinMain(...) 
{ 
    // Window creation, ressource allocation, message loop. 
} 

Тогда WindowProc

// Nothing special in there either 
case WM_PAINT : 
    if(myObject->paint()) { 
     ValidateRect(myObject->rect()); 
     return 0; 
    } 
    else return DefWindowProc(...); 
default : 
    return DefWindowProc(...); 

Для метода краски я просто использовать

// Check the ressources 
checkRessources(); 

mRenderTarget->BeginDraw(); 

mRenderTarget->EndDraw(); 

// Check for errors 
checkForError(); 

Там нет ничего другого, чем это. Все прекрасно компилируется, окно перемещается. Затем я беру ручку изменения размера и начинаю трясти ее, что заставляет меня постоянно изменять размер и перекрашивать мое окно. После того, как в 20-е годы он встряхнул его, начнется злоупотребление памятью (некоторые 200Mo используются каждую секунду), пока он не достигнет полной емкости моего компьютерного ОЗУ ...

Я искал происхождение такого поведения и выяснил, что он была вызвана исключительно

BeginDraw(); 
EndDraw(); 

часть. Я удалил всю сделанную картину, остановил обработку всех сообщений, но WM_PAINT. Еще ... (И я тоже отлаживал).

Затем я проверил другой код, а именно Direct2D Hello World Example. Встряхнул ручку изменения размера окна. И получить точно такое же злоупотребление памятью ....

So. Я не знаю, какие причины. Это ошибка Direct2D? Мой драйвер графической карты? Кто-нибудь испытывает одни и те же явления?

ответ

0

Я не понимаю этого поведения. Использование памяти увеличивается, но только до 2 мб, а затем перестает увеличиваться.

Там одна часть о вашем вопросе, который, кажется, как противоречие:

Я искал происхождение такого поведения и обнаружили, что это было причиной исключительно

BeginDraw();

EndDraw();

часть. Я удалил всю сделанную картину, остановил обработку всех сообщений, но WM_PAINT. Еще ... (И я тоже отлаживал).

Это вызвано вызовами BeginDraw/EndDraw, но затем вы удаляете их, и проблема сохраняется?

EDIT: чтобы увидеть описание исключения _com_error, обернуть весь код в wWinMain в Try/поймать блок, как это:

int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) 
{ 
    try 
    { 
     ... 
    } 
    catch (const _com_error& e) 
    { // <-- Put a breakpoint at this line and then inspect the "e" variable in the Locals window in the debugger 

     // Or use this: 
     ::MessageBoxW(nullptr, e.ErrorMessage(), L"Error", MB_ICONSTOP); 
    } 
} 
+0

Нет, когда я удалить их я не получаю эту проблему больше. – Fred

+0

OK. Ну, в любом случае, я не получаю эту проблему на своем ПК, поэтому вы можете попробовать ее на другом ПК, чтобы убедиться, что это что-то с вашим кодом или что-то странное с ПК, на котором вы сейчас тестируете его. – user1610015

+0

Я попробую. Но во всяком случае, у меня нет ни малейшей причины, почему это происходит. Мой код ничего не делает (т. Е. Не выделяет ресурсы, не выполняет никакой покраски и не обрабатывает никаких оконных сообщений в «WindowProc»). Может ли источник CreateHwndRenderTarget быть источником этого? (Я использую значения по умолчанию). – Fred