[英]Am I using double buffering?
我正在構建一個 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);
}
當我從 CDoubleBufferDC object 創建圖形 object 時,這不是在創建后台緩沖區嗎? 然后我將此圖形 object 傳遞給繪制它的 OnDraw。 如果它正在創建一個后台緩沖區,我對創建前台緩沖區的位置以及在屏幕上繪制它的時間感到困惑。
以下是我目前對我認為這是如何工作的想法:
如果是這種情況,前台緩沖區何時會被后台創建的新緩沖區替換? 有人可以幫助我理解,如果我還沒有使用雙緩沖嗎?
要回答您的實際問題,可能發生的情況是您的 CDoubleBufferDC() class 有一個換出 DC 的析構函數 - 這是一個常見的習語(“現代”MFC 版本中的 IIRC CMemDC 也這樣做)。 所以是的,我認為你在這里使用雙緩沖,即使是不小心。 簡單的游戲你可以用GDI(+)畫圖,如果這整個事情是一個學習練習,這種方式比使用DirectX更容易理解。
但是,您確實需要將碰撞檢測與繪圖例程分離,這樣任何丟失的幀都不會打亂您的時間(也就是說,如果您的事情太復雜以至於需要那么多時間 - 在這種情況下,您可能不應該使用 GDI...)。 換句話說,如果您的碰撞檢測假設每個 OnDraw() 調用在不到 1/framerate 秒內完成,但這並不總是發生,那么您有時會遇到問題。 網上有很多關於如何構建游戲循環的文章; 我沒有足夠的信息將您鏈接到特定的。 此外,要在 2020 年找到使用您正在使用的技術的技術並不容易……但我確實認為使用簡單的 OnPaint()/GDI 非常適合學習,因為它會隱藏很多復雜性您需要更現代的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.