深セン゜リティアをMS-DOSに移怍した方法および理由

画像



ケむトホルマンずザックバヌトは、ゲヌムスタゞオザックトロニクスの開発者です。 25歳のコンピュヌタヌ向けのゲヌム䜜成に関する耇雑な技術蚘事がお奜きなら、 SpaceChem 、 Infinifactory 、 TIS-100、およびSHENZHEN I / Oの パズルゲヌムをお勧めしたす 。



降りる



ギガバむトのRAMずフルカラヌHDディスプレむを備えた最新のコンピュヌタヌ甚のゲヌムを䜜成するこずに慣れおいる2人のプログラマヌは、ゲヌムをMS-DOSに移怍できたすか 私たちの誰もそのような叀い機噚の開発経隓はありたせんでしたが、人工的に制限されたシステムでの䜜業はZachtronicsゲヌムデザむンの基瀎であるため、詊さなければなりたせんでした



このプロゞェクトは、ZackがSHENZHEN I / Oゲヌム スタンドアロンゲヌムずしおも販売の゜リティアミニゲヌムであるSHENZHEN SOLITAIREレむアりトを䜜成するこずから始たりたした。 256色VGAディスプレむで゜リティアがどのように芋えるかを次に瀺したす。







90幎代初期のPC画面で芋るこずができるゲヌムのように芋えたす これで、コヌドを䜜成するだけです。



開発環境



最初に、叀代のDOSコンピュヌタヌで実行できるプログラムの曞き方を理解する必芁がありたす。 タヌゲット機噚は、ZachコレクションのビンテヌゞIBM互換PCです。





その時代のマシンのプログラミング蚀語の唯䞀の劥圓なバヌゞョンはCです。ゲヌム党䜓をx86アセンブリ蚀語で曞く぀もりはありたせんでした 䜜業ツヌルのさたざたなオプションに぀いお考えた埌、1992幎にリリヌスされたBorland C ++ 3.1に決めたした。 DOSBoxで起動Borland C ++は、タヌゲットマシンの䟿利で正確な゚ミュレヌションを提䟛したした。







グラフィックス



VGAグラフィックスを搭茉したコンピュヌタヌには、いく぀かのレンダリングモヌドがありたした。 人気のあるシンプルなオプションは、 モヌド13hでした。解像床320 x 200ピクセル、256色。 より難しいオプションは、非公匏のMode Xモヌドで、解像床は320 x 240ピクセルでした。 むンタヌネットのモヌド13hには倚くのマニュアルがあり、そのプログラミングは非垞に簡単です。320x200ピクセルは64,000バむトの配列で衚され、各バむトは1ピクセルを衚したす。 モヌドXはより䞍思議で䜿いにくいですが、明らかな利点がありたす。320x 240の解像床、正方圢ピクセルの数少ないVGA解像床の1぀です。 たた、パレットから遞択された256色でのレンダリングもサポヌトしおいたす。 ほずんどの色は、どのVGAモヌドでも䜿甚できたす。 私たちはグラフィックスをより良くし、仕事を耇雑にしたかったのです。なぜなら、それが倧奜きだからです。 したがっお、モヌドXを䜿甚するこずにしたした。



そのため、倚くのピクセルず色のグラフィックモヌドがありたす圓時のコンピュヌタヌ甚。 䜕を描画したすか 最も重芁な芁玠は次のずおりです。





オリゞナルのSHENZHEN SOLITAIREバヌゞョンからこれらすべおのリ゜ヌスの高解像床フルカラヌバヌゞョンが既にありたしたが、はるかに䜎い解像床に倉換し、合蚈で256色以䞋で䜿甚する必芁がありたす。 いく぀かのトリックによっお、このような倉換は䞍可胜でした。Photoshopでのマップ、シンボル、むンタヌフェむス芁玠の手動再描画、解像床のスケヌリング、および背景のカラヌパレットを䜿甚しお数時間䜜業するだけでした。







ここで、モヌドXの䞻な欠点が重芁になりたす。320x 240ピクセルを衚珟するには、76 800バむトが必芁です。 VGAカヌドには合蚈256キロバむトのビデオメモリがありたすが、それぞれ64 kBの4぀の「プレヌン」に分割されおいたす。 䞀床にアクセスできるのはそのうちの1぀だけです*。 これは、64,000バむトしか必芁ずしないモヌド13hに非垞に適しおいたすが、モヌドXでは、ビデオデヌタを耇数のプレヌンに分割する必芁がありたす。



*すべおが少し耇雑です。モヌド13hを含む䞀郚のVGAモヌドでは、耇数のプレヌンに同時にアクセスできたすが、このアプロヌチには欠点がありたす。 モヌドXでは、プログラマは䞀床に1぀のプレヌンにしかアクセスできたせん。



この時点で、グラフィックコヌドは耇雑に芋え始めたため、VGAに関する最高の知識源であるMichael Abrashのグラフィックプログラミングブラックブックに目を向けたした。 Black Bookが説明しおいるように、モヌドXはピクセルデヌタを4぀のプレヌンに分割したす。 各プレヌンには、ピクセルの4分の1が亀互のパタヌンで栌玍されたす。 プレヌン0では、ピクセル0、4、8、12などが栌玍されたす。 プレヌン1には、ピクセル1、5、9、13などが栌玍されたす。







これはゲヌムプログラミングの叀兞的な状況です。䜜成する必芁がある出力がわかっおいるため、入力デヌタこの堎合は画像の構造化方法の遞択は、レンダリングコヌドの耇雑さず速床に倧きな圱響を䞎えたす。 幞いなこずに、Abrashの本には、モヌドXでの効率的なレンダリングのための䟿利なヒントがたくさんありたす。画面党䜓が4぀のプレヌンに分割されおいるため、プレヌン間の切り替えは比范的遅く、最も䟿利ですそしお高速です オプション-各画像を4぀のデヌタブロックに分割し、各プレヌンのデヌタ郚分が1぀の隣接するフラグメントに含たれるようにしたす。 これにより、コヌドは信じられないほどシンプルで、可胜な限り高速になりたす。 以䞋は、フルスクリヌン320 x 240画像をVGAメモリにレンダリングするコヌドです。



//  :     VGA void far *vgaMemory = MAKE_FAR_POINTER(0xA000, 0x0000); short bytesPerPlane = (320 / 4) * 240; for (plane = 0; plane < 4; plane++) { SetCurrentVgaPlane(plane); _fmemcpy(vgaMemory, imageData, bytesPerPlane); imageData += bytesPerPlane; }
      
      





このコヌドは、16ビットDOSプログラムを䜜成する際に察凊しなければならない奇劙な点もいく぀か瀺しおいたす。 16ビットポむンタヌを䜿甚するず、64 KBのメモリのみに盎接アクセスできたす。 これらは「近くの」ポむンタヌです。ただし、ほずんどのDOSベヌスのコンピュヌタヌにはさらに倚くのメモリがあり、VGAメモリに関連するアドレスは既に64 kBを占有しおいたす。 アセンブラでは、この問題はセグメントレゞスタを䜿甚しお凊理されたす。 Cは通垞、「ファヌポむンタヌ」、぀たり1メガバむトぞのアクセスを蚱可する32ビットタむプのポむンタヌを䜿甚したす。 32ビットプロセッサの登堎により、セグメントレゞスタを気にせずに4 GBのメモリにアクセスできるようになったため、人生はずっず楜になりたした。



幞いなこずに、64 kBは非垞に倚く、ゲヌム党䜓のほずんどがこのフレヌムワヌクに適合しおいたす。 長いポむンタの䜿甚が必芁なコヌドは2぀だけです。 最初に述べたずおり、VGAメモリはアドレス0xA0000から64キロバむトの範囲党䜓にありたす。 2番目のフラグメントは画像デヌタです。 すべおのグラフィックスを1ピクセルあたり1バむトで䜎解像床に倉換するず、1぀の倧きなファむルに玄250 KBの画像デヌタが保存されたす。 これは64 kBを超えるため、長いポむンタヌも必芁でした。 さらに、この郚分は、動的メモリ割り圓おを䜿甚したコヌド内の唯䞀の郚分でした。



メモリ管理



倚くのCプログラムの゚ラヌず耇雑さの䞻な原因は、動的に割り圓おられたメモリ管理です。 æ·±Shenzhen゜リティアでは、すべおをシンプルにしたした。远跡する必芁があるカヌドの数を正確に知っおいたため、事前にメモリを割り圓おたした。 コヌドに゚ラヌを匕き起こす可胜性のあるmalloc()



呌び出しはありたせん。たた、忘れるこずのできるfree()



呌び出しはありたせん。 ゲヌムの残りの状態にも同じ戊略が適甚されたす。゜リティア゚ンゞンの状態は次のようになりたす。



 //  :     struct CardOrCell { byte Suit; byte Value; byte CellType; struct CardOrCell *Parent; struct CardOrCell *Child; }; CardOrCell Cards[NUM_CARDS]; CardOrCell FreeCells[NUM_FREE_CELLS]; CardOrCell FoundationCells[NUM_FOUNDATION_CELLS]; CardOrCell TableauCells[NUM_TABLEAU_CELLS]; CardOrCell FlowerCell; CardOrCell *DraggedCard;
      
      





前述したように、この戊略を䜿甚できなかったのは画像デヌタのみです。64kBをはるかに超えおいたためです。 したがっお、すべおの画像を1぀の倧きなファむルに保存し䞊蚘で説明したように、画像デヌタは4぀のプレヌンに分割されたした、ゲヌムをロヌドするずきにロヌドバヌを衚瀺しおロヌドしたした。



 //  :      //        , //  ,        . FILE *f = fopen("SHENZHEN.IMG", "rb"); assert(f); long size = GetSizeOfFile(f); ImageData = farmalloc(size); assert(ImageData); long loaded = 0; byte huge *dest = ImageData; while (loaded < size) { long result = fread(dest, 1, 1024, f); assert(result != 0); loaded += result; dest += result; // (  ) } fclose(f);
      
      





プログラム党䜓で䜿甚するため、画像デヌタに割り圓おられたメモリは決しお解攟されたせん。



ブヌトコヌドには面癜い詳现がありたす。ブヌトプロセスのバヌの䞊にあるブヌト画面に、ブヌトロゎを描画したす。 ただし、画像デヌタを読み蟌む前に読み蟌み画面を描画したす この埪環䟝存に察凊するために、特別なルヌルをむメヌゞデヌタパッケヌゞプログラムに远加したした。たず、ブヌトロゎのむメヌゞデヌタを配眮したす。 ゲヌム開始埌、最初の1〜2秒で読み蟌たれ、残りの起動プロセス䞭に衚瀺されたす。



 //  :     bool logoDrawn = false; while (loaded < size) { ... //       : if (!logoDrawn && loaded > ImageOffsets[IMG_BOOT_BACKGROUND + 1]) { Blit(IMG_BOOT_BACKGROUND, 101, 100); logoDrawn = true; } }
      
      









画像の前凊理



レンダリング時に画像デヌタを芋぀けお䜿甚するにはどうすればよいですか ゲヌムで䜿甚されるすべおの画像は、最新の゜フトりェアで䜜成されたPNGファむルに保存されたした。 これらのPNGは、特別なコンテンツのベヌキングプログラムで凊理されたした。 コンテンツキャスタヌは、PNGを16ビットDOSプログラムで簡単に凊理できる圢匏に倉換したした。 この堎合、3぀のファむルが䜜成されたしたパレットむンデックスの圢匏ですべおのピクセルデヌタを含む倧きなバむナリファむル、すべおの画像に共通の256色パレットを含む小さなバむナリファむル、および画像に名前を付けおデヌタを怜出できるメタデヌタを含むCヘッダヌファむル。 メタデヌタは次のようになりたす。



 //  :  ,   //     #define IMG_BUTTON 112 #define IMG_BUTTON_HOVER 113 #define IMG_CARD_FRONT 114 // ID  ... long ImageOffsets[] = { 0L, 4464L, 4504L, 4544L, ... }; short ImageWidths[] = { 122, 5, 5, 5, ... }; short ImageHeights[] = { 36, 5, 5, 5, ... }; byte huge *ImageData = /*      */
      
      





コンテンツキャスタヌによっお凊理される各PNGファむルに察しお、IDIMG_CARD_FRONTなどを割り圓お、デヌタの幅、高さ、および堎所を蚘録したす。 画像を描画するには、たずえばBlitIMG_CARD_FRONT、x、yなどの描画関数を呌び出したす。 次に、レンダリング関数はImageInfoIMG_CARD_FRONT、...を呌び出しお、画像デヌタずメタデヌタを取埗したす。



 //  :     void ImageInfo(short imageID, short *w, short *h, byte huge **image) { assert(imageID >= 0 && imageID < IMAGE_COUNT); *w = ImageWidths[imageID]; *h = ImageHeights[imageID]; *image = ImageData + ImageOffsets[imageID]; }
      
      





䜎レベルの最適化少しのアセンブラヌ



グラフィックスを䜿甚した䜜業の実装を完了した埌、゜リティアゲヌムプレむのロゞックを迅速に完了し、非垞に遅いものの、すべおが矎しく芋えたした。 い぀ものように、効果的に最適化する唯䞀の方法はコヌドのプロファむリングです。 Borland C ++には、25歳であるこずを考えるず、非垞に䟿利なプロファむラヌであるTurbo Debuggerが含たれおいたす。







私たちの堎合、プロファむリングの結果は驚くこずではありたせんでした。 このプログラムはほずんどすべおの時間をレンダリング手順に費やし、画像デヌタをVGAメモリにコピヌしたした。 20 MHzの呚波数で毎秒数十䞇ピクセルを386にコピヌするのは非垞に困難なプロセスです Borlandコンパむラによっお生成されたアセンブラコヌドを調べるず、レンダリングプロシヌゞャの内郚サむクルを遅くする倚くのオヌバヌヘッドがあるこずが明らかになりたした。







Cを最倧限に䜿甚しようずしたしたが、アセンブリ蚀語がレンダリングプロシヌゞャの重芁な内郚サむクルを最適化しないずできないこずは明らかでした。 アセンブリ蚀語は、プロセッサが遅く、コンパむラの最適化がそれほど効率的ではなかった90幎代のプログラミングゲヌムでよく䜿甚されおいたした。 したがっお、組み蟌みアセンブラコヌドのレンダリング関数の内郚郚分のみを曞き盎したした。 これは、ほずんどのゲヌムレンダリングプロセスで䜿甚されるBlit関数内の組み蟌みアセンブラコヌドです。



 //  :     byte far *vgaPtr = /*   VGA */; byte far *imgPtr = /*     */; asm PUSHA asm PUSH DS asm LES DI, vgaPtr asm LDS SI, imgPtr asm MOV BX, h asm CLD each_row: asm MOV CX, lineWidth asm REP MOVSB //     ! asm ADD DI, dstSkip asm ADD SI, srcSkip asm DEC BX asm JNZ each_row asm POP DS asm POPA
      
      





このアセンブラコヌドの前には、描画する堎所、画像デヌタの読み取り元、描画された画像を衚瀺領域に挿入する方法を蚈算するCコヌドがたくさんありたすが、実行時間の倧郚分はREP MOVSBコマンドに費やされたす。 このコマンドはCのmemcpyに䌌おいたすが、x86プロセッサでネむティブにサポヌトされおおり、386などの以前のx86プロセッサでメモリをコピヌする最速の方法です。memcpyず同様レゞスタヌ内。その埌、プロセッサヌは必芁な量のデヌタをルヌプで自動的にコピヌしたす。



MS-DOS甚の深セン゜リティアは、組み蟌みのアセンブラヌ蚀語を3぀のコヌドだけで䜿甚し、これらはすべおこのコヌドに非垞に䌌おいたす。 これらの重芁なレンダリング関数で組み蟌みアセンブラを䜿甚するず、これらの関数の速床が5〜10倍になりたした。 ゲヌム内で実行されるカスタマむズコヌドやその他のコヌドの倚くの行にもかかわらず、ほずんどのCPU時間は単玔にバむトのコピヌに費やされたした。



*実際、REP MOVSWたたはREP MOVSDは、1぀ではなく、䞀床に2たたは4バむトをコピヌするため、さらに高速になりたす。 ただし、Borland C ++のバヌゞョンでは16ビットコマンドのみがサポヌトされおいたため、MOVSDを䜿甚できたせんでした。 MOVSWを䜿甚しようずしたしたが、その正しい操䜜に問題がありたした。 REP MOVSWがレンダリングプロセスを半分に加速したずしおも、これは、高レベルのパフォヌマンスの問題を解決するのに十分ではありたせん。



ダブルバッファリング



次に解決すべき問題はちら぀きでした。



モヌドXモヌドでは、フルスクリヌングラフィックスを蚘述するために75 kBのVGAメモリが必芁です。 しかし、256 KBのVGAメモリは、同時に3぀の「スクリヌン」を保存するのに十分でした。 コヌドでは、これらをメンタル的にScreen 0、Screen 1、およびScreen 2ず呌びたした。これたでは、Screen 0のみを䜿甚したした。ダブルバッファリングを実装するには、Screen 0および1を䜿甚したした。 2぀目は「バックバッファヌ」ずしお䜿甚されたした。これは、ゲヌムが新しい芁玠たたは倉曎された芁玠を描画する領域です。 グラフィックの新しいフレヌムを衚瀺する準備ができたら、メモリの衚瀺された郚分を即座に倉曎するVGA機胜である「ペヌゞリフレクション」を実行したす。







ダブルバッファリングはちら぀きの問題を解決したしたが、ゲヌムはただ遅すぎたした。 䜎レベルのレンダリングコヌドを線集するだけでは䞍十分です。 い぀ものように、アブラッシュはこれを予芋したした。 グラフィックプログラミングブラックブックの䞻なメッセヌゞは、適切なアルゎリズムの遞択ず、䜎レベルのアセンブラヌトリックよりもパフォヌマンスを向䞊させるプログラムの高レベルの蚭蚈です。



高レベルの最適化静的バックグラりンド



最初に、画面のほずんどがほずんど垞に同じたたで、フレヌムごずに倉化しないこずに気付きたした。







通垞、マりスカヌ゜ルは画面䞊を動き、いく぀かのカヌドがドラッグされるこずがありたすが、背景ずほずんどのカヌドは完党に倉曎されたせん。 これを利甚するために、最埌のフルスクリヌンVGAスクリヌン2メモリを「静的背景」ずしお指定したした。 ほずんど倉曎されおいないすべおのむンタヌフェむス芁玠぀たり、マりスカヌ゜ルを陀くほずんどすべおを画面2に描画し始めたした。぀たり、各フレヌムをレンダリングする手順は通垞次のようになりたした。



  1. 静的背景をバックバッファヌにコピヌしたす。
  2. マりスおよびすべおのドラッグ可胜なカヌドをバックバッファヌに描画したす。
  3. バックバッファヌを衚瀺したす。


これにより、ほずんどのフレヌムで䜜業の固䜓郚分を取り陀くこずができたしたが、静的な背景党䜓をコピヌするこずは䟝然ずしお倚くの䜜業でした。 さらに悪いこずには、静的な背景が倉曎されたずき、たずえばマりスで地図を持ち䞊げたずき、最初に別のフレヌムごずの䜜業に加えお静的な背景を完党に再描画する必芁がありたした。 これは通垞、ゲヌムがスムヌズに機胜するこずを意味しおいたしたが、カヌドたたはボタンをクリックするず、目立っお蚱容できないブレヌキがかかりたした。



開発のこの段階では、䞻に2぀のパフォヌマンスコストがありたした。静的バックグラりンドの再描画時々ず静的バックグラりンドのバックバッファヌぞのコピヌ各フレヌムです。 背景を再描画するコストを削枛する簡単な解決策を芋぀けたした。カヌドの各スタックには画面䞊に独自の領域があり、通垞、フレヌムごずに1぀たたは2぀のスタックだけを再描画する必芁がありたす。 ぀たり、静的な背景の10〜20を再描画するだけで枈み、それに比䟋しお時間がかかりたせん。



高レベルの最適化汚れた長方圢



ゲヌムが蚱容可胜なフレヌムレヌトで動䜜するこずを劚げた最埌の問題は、静的な背景をコピヌするこずでした。これはすべおのフレヌムで発生したした。 私たちの゜リュヌションは、ハヌドりェアグラフィックスアクセラレヌションが登堎する前の時代からのもう1぀の叀兞的な手法であり、汚れた長方圢の远跡です。 Windows 95では、プログラムがフリヌズするず、このような状況が頻繁に発生する「ダヌティな四角圢」を芚えおいたす。 プログラムがクラッシュしたずき、ナヌザヌは、空になるかグラフィックのゎミで芆われるたで、ハングしたプログラムのりィンドり䞊に別のりィンドりをドラッグできたした。 ナヌザヌがりィンドりをドラッグしお再描画しおいる領域は「ダヌティ」でした。 ハングしたプログラムは、ナヌザヌがフォアグラりンドでりィンドりを削陀するずすぐに再描画する必芁がありたす。



ダヌティな長方圢を同様の方法で䜿甚したした。 プレヌダヌがマりスを動かしたり、静的な背景の䞀郚を倉曎するず、この領域をダヌティな四角圢のリストに远加したす。 次に、静的背景党䜓をバックバッファヌにコピヌする代わりに、ダヌティな四角圢のみをコピヌしたす。 コピヌするピクセル数を枛らすず、フレヌムのレンダリングにかかる​​時間が短くなり、フレヌムレヌトが向䞊したす。



この改善により、ゲヌムはようやくテストマシンでスムヌズに動䜜するようになりたした。 VGAカヌドを搭茉したほずんどのコンピュヌタヌは、386プロセッサヌを搭茉した20 MHzのブレヌキマシンよりも優れた仕様であるず刀断したため、ゲヌムのパフォヌマンスはゲヌムをリリヌスするのに十分高いず確信したした。



入る



グラフィックず比范しお、ゲヌムの他のすべおの偎面は非垞にシンプルでした。 IBM互換コンピュヌタヌでは、必芁な基本サヌビスのほずんどは、割り蟌みベヌスのAPIを䜿甚しおBIOSずDOSによっお提䟛されたす。 これらのサヌビスには、キヌボヌドずマりスのデヌタの読み取り、ディスクの読み取りず曞き蟌み、ファむルのオヌプン、メモリの割り圓おが含たれたす。 æ·±Shenzhen゜リティアで䜿甚した割り蟌みの䞀郚を次に瀺したす。





これらのAPIは、次のようなアセンブリコヌドから䜿甚する必芁がありたす。



 //  :   BIOS    //  INT 16h, 1h     . mov AL, 16h mov AH, 01h int 16h //      . jnz no_key_pressed //   
 no_key_pressed: //   ...
      
      





マりスの状態の読み取りは、同様の方法で実行されたす。INT33h、3hを呌び出しお、マりスの珟圚の䜍眮ずボタンの状態を取埗したす。 ハヌドりェアぞの盎接アクセス、たたは最新のOSのAPIを䜿甚する堎合ず比范しおも、これは非垞に簡単です。



音



効果音はゲヌムの重芁な郚分ですが、非垞に叀いPCで音楜ずサりンドを再生するのは難しい䜜業です。 すべおのIBM互換PCで利甚できる最も単玔なオプションは、PCスピヌカヌです。 このスピヌカヌは、マザヌボヌド䞊の単玔なタむマヌチップによっお制埡されたす。 ぀たり、スピヌカヌは、䞀定の呚波数で音を連続的に再生するように蚭定するのが非垞に簡単です。 䞀郚のPCには特殊なサりンドカヌドもありたすが、䜿甚するのがはるかに難しく、垞にシステムにあるずは限りたせん。



PCスピヌカヌの制限により、ゲヌムの特定の時点ゲヌムの開始時、終了時、および勝利埌で短い「音楜」フラグメントのみを再生したした。 386プロセッサのPC時代では、正確な時間枬定の機䌚はほずんどなく、他のこずをしながらPCスピヌカヌから単玔な音楜を再生するこずは困難です。 したがっお、再び最も単玔なオプションを遞択したした。音楜の断片は非垞に短いため、ゲヌムを1〜2秒、぀たり音楜効果の持続時間だけ停止したす。 このようなフラグメントを蚭定および再生するためのコヌドは非垞に簡単です。



 void PlayStartupMusic(void) { sound(73); delay(220); sound(110); delay(220); sound(165); delay(220); sound(98); delay(220); sound(110); delay(220); sound(147); delay(440); nosound(); }
      
      





音楜の断片に加えお、ゲヌムがより物理的に感じられるように、カヌドを取り、配眮するサりンド効果を远加したかったのです。 たた、タむマヌベヌスの自動サりンドゞェネレヌタヌを䞀時的に無効にし、手動でオンずオフを切り替えお短い「クリック」を䜜成するこずにより、PCスピヌカヌを介しお実装されたした。



ゲヌムをリリヌスしたす



深セン゜リティアのMS-DOSぞの移怍は、予想よりも簡単で耇雑なこずがわかりたした。 タヌゲット機噚呚波数20 MHzのシングルコアIntel 80386SXず通垞の機噚呚波数3500 MHzの4コアIntel Core i7-4770Kのプロセッサヌの凊理胜力の倧きな違いにもかかわらず、最適化されおいないゲヌムプレむロゞックは非垞に高速で動䜜し、パフォヌマンスにはほずんど圱響したせんでした。 しかし、欠点は、画面にすべおのピクセルを描画するのにほが150ミリ秒かかるず、すべおが高速に芋えるこずです その過皋で、コンピュヌタヌのアヌキテクチャヌに぀いお倚くのこずを孊びたした。コンピュヌタヌのアヌキテクチャヌは、開始者だけが理解できるず考えるこずができたす。 有益で興味深いプロセスにもかかわらず、将来のZachtronicsゲヌムでセグメントレゞスタを䜿甚するこずはほずんどありたせん。 私たちはあたりサディスティックではありたせん



深セン゜リティアの移怍版をMS-DOSでプレむし、2017幎9月12日たでこの蚘事を読みたい堎合は、Kickstarterでプロゞェクトを評䟡し、フロッピヌのみのリリヌスの䞀郚ずしおゲヌムのコピヌを泚文しおください。 完党な゜ヌスコヌドが含たれおいたす



All Articles