Я создаю приложение Windows MFC. Во время некоторых анимаций, когда объекты сталкиваются на высоких скоростях, мой физический движок ведет себя непредсказуемо. Я считаю, что это как-то связано с тем, что я пропускаю кадры. Мне сказали, что я не использую двойную буферизацию. Я думал, что был, но я все еще довольно новичок в этом. Вот как я рисую на экране в OnPaint:
#include "pch.h"
#include "framework.h"
#include "ChildView.h"
#include "DoubleBufferDC.h"
void CChildView::OnPaint()
{
CPaintDC paintDC(this); // device context for painting
CDoubleBufferDC dc(&paintDC); // device context for painting
Graphics graphics(dc.m_hDC); // Create GDI+ graphics context
mGame.OnDraw(&graphics);
if (mFirstDraw)
{
mFirstDraw = false;
SetTimer(1, FrameDuration, nullptr);
/*
* Initialize the elapsed time system
*/
LARGE_INTEGER time, freq;
QueryPerformanceCounter(&time);
QueryPerformanceFrequency(&freq);
mLastTime = time.QuadPart;
mTimeFreq = double(freq.QuadPart);
}
/*
* Compute the elapsed time since the last draw
*/
LARGE_INTEGER time;
QueryPerformanceCounter(&time);
long long diff = time.QuadPart - mLastTime;
double elapsed = double(diff) / mTimeFreq;
mLastTime = time.QuadPart;
mGame.Update(elapsed);
}
void CChildView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
RedrawWindow(NULL, NULL, RDW_UPDATENOW);
Invalidate();
CWnd::OnTimer(nIDEvent);
}
Когда я создаю объект Graphics из объекта CDoubleBufferDC, разве это не создает задний буфер? Затем я передаю этот объект Graphics в OnDraw, где он рисуется. Если он создает задний буфер, я не понимаю, где создается передний буфер и когда он отображается на экране.
Вот мои текущие мысли о том, как я думаю, что это работает:
- Объект CPaintDC является передним буфером.
- Объект CDoubleBufferDC является задним буфером.
- Графический объект создается из объекта CDoubleBufferDC, на котором я рисую текущее состояние игры.
Если это так, то когда передний буфер заменяется новым буфером, созданным сзади? Может ли кто-нибудь помочь мне понять и использовать двойную буферизацию, если я этого еще не сделал?
CDoubleBufferDC
не является стандартным классом MFC, и неясно, как, когда и даже передается ли отрендеренное изображение в классpaintDC
. Но, как отмечалось выше, ответ на заданный вопрос не поможет вам продвинуться вперед. В любом случае, если вы хотите перейти на систему рендеринга с потенциально лучшими характеристиками производительности, ознакомьтесь с Direct2D. - person IInspectable   schedule 16.05.2020