簡體   English   中英

我在使用雙緩沖嗎?

[英]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。 如果它正在創建一個后台緩沖區,我對創建前台緩沖區的位置以及在屏幕上繪制它的時間感到困惑。

以下是我目前對我認為這是如何工作的想法:

  1. CPaintDC object是前台緩沖區
  2. CDoubleBufferDC object 是后台緩沖區
  3. 圖形 object 是從 CDoubleBufferDC object 創建的,我在上面繪制了游戲的當前 state

如果是這種情況,前台緩沖區何時會被后台創建的新緩沖區替換? 有人可以幫助我理解,如果我還沒有使用雙緩沖嗎?

要回答您的實際問題,可能發生的情況是您的 CDoubleBufferDC() class 有一個換出 DC 的析構函數 - 這是一個常見的習語(“現代”MFC 版本中的 IIRC CMemDC 也這樣做)。 所以是的,我認為你在這里使用雙緩沖,即使是不小心。 簡單的游戲你可以用GDI(+)畫圖,如果這整個事情是一個學習練習,這種方式比使用DirectX更容易理解。

但是,您確實需要將碰撞檢測與繪圖例程分離,這樣任何丟失的幀都不會打亂您的時間(也就是說,如果您的事情太復雜以至於需要那么多時間 - 在這種情況下,您可能不應該使用 GDI...)。 換句話說,如果您的碰撞檢測假設每個 OnDraw() 調用在不到 1/framerate 秒內完成,但這並不總是發生,那么您有時會遇到問題。 網上有很多關於如何構建游戲循環的文章; 我沒有足夠的信息將您鏈接到特定的。 此外,要在 2020 年找到使用您正在使用的技術的技術並不容易……但我確實認為使用簡單的 OnPaint()/GDI 非常適合學習,因為它會隱藏很多復雜性您需要更現代的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM