MFC 遊戲中長按方向鍵/發射鍵導致畫面卡頓,根因是鍵盤重複觸發率過高(通常 30-50 次/秒),邏輯處理與繪圖跟不上。本文給出降頻與優化方案。
void OnTimer(UINT nID) {
if (GetKeyState(VK_SPACE) & 0x8000) { // 長按空格
FireBullet(); // 每次定時器都創建子彈、加入列表
}
// 移動鍵同理
}
DWORD m_lastFireTime = 0;
void FireBulletThrottled() {
DWORD now = GetTickCount();
if (now - m_lastFireTime >= 200) { // 最快 5 發/秒
m_lastFireTime = now;
FireBullet();
}
}
原問題中的 ismybullet 應在「子彈實際發射後」重置,而非按鍵按下時:
if (GetKeyState(VK_SPACE) & 0x8000 && !ismybullet) {
ismybullet = true;
FireBulletThrottled(); // 內部按間隔創建子彈
// ismybullet = false; // ❌ 不要這裡重置
}
// 在 FireBulletThrottled 內部按間隔允許時:
// ismybullet = false; // ✅ 實際發射後重置,允許下一次
CImageList 替換逐幀 BitBlt遊戲主循環要「固定時間步長 + 邏輯與渲染分離」,輸入處理要「節流 + 邊界裁剪」,卡頓自然消失。