DOS時代的遊戲怎麼製作的?
剛回寢室路上想到的。想起以前玩的一些DOS遊戲,畫面和邏輯都是十分精彩的。最近寫遊戲使用的引擎和編碼的IDE都十分方便,於是我很好奇DOS時代的遊戲,特別是畫面,是不是就是調用視頻BIOS功能,然後對顯示內存進行操作?
有沒有什麼方便的工具?
在當年,DOS遊戲開發分兩種,實模式和保護模式。
在實模式下,只能使用640k內存,定址方式是「經典」(你也可以稱之為腦殘)的Segment:Offset方式,這時候圖形輸出是調用int 10h,也就是說你說的調用BIOS功能繪圖。
這種模式下,因為沒有內存保護,如果你的程序出了嚴重錯誤,比如寫入非法指針,你可以分分鐘乾死DOS系統,系統不會有任何機會從錯誤中恢復。要上保護模式的話,曾經遊戲開發中用的比較多的編譯器是WATCOM C++吧,也是一套IDE,不過功能自然不會像現在的IDE這麼強大。WATCOM C++的好處是可以直接整合DOS/4GW保護環境,直接突破640k限制,id從德軍總部開始用的。
如果你滿足於320x200x8bit的話,也可以實時切換回實模式調用一下int 10h寫個像素再回到保護模式,當然這會很慢……但是一般後期的遊戲都會用VESA VBE2.0,一般保護模式環境都會提供一些函數指針,可以直接獲取Framebuffer的地址,既然都有Framebuffer了那你隨便玩吧,往裡寫什麼就會顯示什麼,先不管速度,你寫一個軟體3D引擎都沒人能攔住你。
聲音的話比較麻煩,很多種音效卡,每種控制方式大不相同(當然也有很多所謂Sound Blaster兼容就是了),你需要根據設定攔截特定的中斷,然後或者往內存埠(你可以理解成映射在內存空間上的硬體設備寄存器)寫控制數據,如果是支持PCM回放的設備,而且你想播放一些wav音頻,則需要往特定的DMA埠寫入一段數據。然後你需要為主流音效卡都分別寫一份驅動……
所以如果你不想造輪子,買一份音頻API是很明智的選擇,當年比較出名的就是MILES SOUND SYSTEM,魔獸爭霸等著名遊戲都有用,你只要告訴這個API你要幹什麼就行了,比如播放WAV,播放MIDI,剩下的都會幫你處理掉,很方便,這可能是現在習慣了DirectX編程的人難以想像的東西吧……
輸入方面,你可以攔截鍵盤中斷,裡面會有你所需要的所有信息的,什麼鍵被按下了,什麼鍵鬆開了都會有。
等到95年之後玩法就多了,奔騰也有MMX了,FPU也是CPU標配了,VOODOO也出了,GLIDE也有一套MSDOS下的OVR驅動,VBE也到3.0了,我相信你見到這些東西之後就會很有想法了,完全可以開發秒殺PS畫面的3D遊戲了。
卧槽我發布完了發現我挖了墳,知乎給我刷到首頁的這不是我的錯orzhttp://dev.gameres.com/Program/Abstract/Thinking/youxiDos.htm
DOS下的遊戲編程主要是受內存訪問範圍的限制,實模式直接可以訪問的內存才640KB。
突破內存的技術有EMS和XMS等。發展到後期,基本上都使用DOS下32位保護模式技術。比如DPMI、DOS4GW。使用Watcom C++ DOS4GW就能輕鬆獲得平展的4G內存空間。從DOS時代有一些開源遊戲lib可以使用,比如Allegro。DOS下的遊戲開發雖然限制多,但可以直接寫framebuffer,很方便。即使到了Win的DX時代,大多數2D遊戲依然採用自己編寫blit的方法,而不使用DX提供的表面。因為DX的2D硬體加速並不普及。技術集中在內存搬運、RLE壓縮、調色板、16位色、臟矩形上。實模式下,顯存好像是0xA0000-0xB0000吧,記得上彙編課時很喜歡朝裡面亂填了……這個問題我也不了解,但是你可以看一下雲風寫的一本書《遊戲之旅:我的編程感悟》第四章,前Windows時代。
推薦閱讀: