作為一名程序員,到目前為止發布的兩個答案都是錯誤的。儘管有可能出現這樣一種假設情況,即按 Alt kbd> + F4 kbd>會破壞進行中的保存,而實際上這樣做會要求開發人員會故意不顧一切地破壞儲蓄系統。
從編碼的角度來看,用戶按下 Alt kbd> + F4 kbd>不會“關閉活動窗口”,也不會“中斷程序”。這樣做是因為Windows將 WM_CLOSE
消息放置到程序的事件隊列中。就是這樣。
顧名思義,事件隊列是程序要處理的事件隊列。這主要包括用戶的輸入。 事件循環基本上是由外部輸入驅動的每個程序(包括遊戲)的代碼核心,它檢查事件隊列中的輸入,進行處理,然後重複最後兩個永遠停止循環直到需要關閉為止。
這裡有兩件事要牢記。首先是事件循環是線性的:在處理完事件1之前,您不處理事件2。
第二個是 WM_CLOSE
消息未“退出程序”。這是一種特殊的輸入,僅此而已。它告訴程序用戶已請求程序關閉當前窗口。程序可以自由地以其代碼說的任何方式對此做出響應,包括完全忽略它。 (這是很不禮貌的事情,但是開發人員有時會這樣做。)最常見的回答之一是詢問用戶“您要在退出前保存嗎?” 和/或提供一個提示。取消關閉請求的方法。
那麼,如果遊戲在保存過程中用戶按下 Alt kbd> + F4 kbd>,會發生什麼情況?請記住第一點:處理是線性的。假設保存是在主線程中進行的(我將在後面進行進一步介紹),該代碼甚至無法檢查事件隊列以查看是否已向它發送了 WM_CLOSE
消息,直到之後保存完成。因此,沒有什麼可打擾的。
總是有可能讓計算機程序同時執行兩項操作。這稱為 multithreading ,可以同時運行兩個或多個線性執行代碼的“線程”。因此有人可能會問:“當 WM_CLOSE
消息進入並得到處理時,它是否保存在另一個線程中?”該問題的答案是,任何執行此操作的開發人員,即使用戶沒有在不適當的時候請求退出的情況下,他們的代碼也可能破壞保存文件的左,右和中心。這是因為保存意味著將當前遊戲狀態的副本寫到光盤上。如果您在不中斷遊戲的情況下進行此操作,則可能在開始保存和完成之間有一些變化,然後保存文件最終會包含一些引用遊戲舊狀態的數據,而某些引用了遊戲的舊狀態。到新狀態,這再沒有任何意義,現在您的保存文件已損壞。
這實際上是任何人都了解多線程的第一件事:如果其中一個(或兩個)都將要更改它們,則切勿讓兩個線程同時觸摸同一數據。
em>不遵循該原則會創建
競賽條件,在該條件下,數據將被破壞,並且事情將以奇怪的方式失敗。任何有能力的開發人員都將竭盡所能避免出現競爭情況的情況。因此,開發人員簽入在單獨的線程上執行保存操作的代碼時,其他開發團隊很可能會驚恐地看著它!
TL; DR:如果您的遊戲已經執行了自動保存而沒有損壞自身,則可以安全地假設禮貌地要求關閉遊戲沒有損壞的風險,(這是 Alt kbd> + F4 kbd>也可以),即使您在保存過程中也這樣做了。當警告屏幕告訴您在保存遊戲時不要關閉遊戲時,它指的是關閉電源或其他更為激烈的終止遊戲方式。