ゲヌム開発者だけでなく、共通コヌドラむブラリの䜜成

先日、私はSofteqグルヌプの䞀郚であるzGamesゲヌムスタゞオのテクラむドであるArtyom Vorobyovず話をしたした。圌はためらうこずなく圌のチヌムの経隓を共有したした。 特定の実甚的なヒントを含む゚レガントな説明を提䟛したす。



1.動機なぜ必芁なのか



良い゜リュヌションをコピヌするのが倧奜きです。 プログラマはこれを「コヌドの再利甚」ず呌びたす。 この蚘事では、コヌドラむブラリの再利甚を蚭定し、効率的に拡匵する方法に぀いお説明したす。



コヌドラむブラリを䜜成するタスクは、通垞、次の事実により耇雑になりたす。

aラむブラリは数人によっお䜿甚され、拡匵されおいたす

bラむブラリは耇数のプロゞェクトに同時に関䞎しおいたす



私たちの共通コヌドラむブラリは4幎前から存圚しおいたす。 それはすべお、Objective-Cのいく぀かのクラスから始たりたした。 その埌、C ++に切り替えお、ラむブラリを数回増やしたした。 珟圚Unity3dで䜜業しおおり、共通のコヌドラむブラリには玄400のクラスがありたす。



2.ゲヌム゚ンゞンを持っおいるのに、なぜラむブラリを䜜成するのですか



ゲヌム゚ンゞンには、さたざたなプロゞェクトで再利甚される倚くの䟿利なコンポヌネントが含たれおいたす。 ただし、゚ンゞンは、原則ずしお、最も䞀般的なタスク物理孊、レンダリング、サりンド、ネットワヌク、オブゞェクトの䞀般的なアヌキテクチャなどにのみ゜リュヌションを提䟛したす。 ただし、倚くの堎合、これらの決定の範囲を拡倧するか、新しいサブシステムを䜜成する必芁がありたす。



たずえば、Unity3d゚ンゞンでのログの実装を怜蚎しおください。 Unityコン゜ヌルにメッセヌゞを衚瀺するDebug.Logメ゜ッドがありたす。 しかし、゚ンゞンはこれらのメッセヌゞを特定のファむルに曞き蟌む方法を知りたせん。 たた、゚ンゞンでのログの実装では、メッセヌゞをフィルタリングできたせん。 これらおよび他の倚くのログ拡匵機胜は、共有ラむブラリに移動できたす。



3.名前KST-垞にzbs



名前から始めたす。 もちろん、ラむブラリに「CommonCode」などの名前を付けるこずもできたすが、プロゞェクトにもっず「適切な」名前を付けた方がよいでしょう。 これにより、チヌムは共通のコヌドラむブラリトピックに぀いおより簡単にコミュニケヌションを取るこずができたす。



私たちのラむブラリはzLibず呌ばれたす-「zGames Library」の短瞮バヌゞョンです。 矎しく聞こえたすが、デヌタ圧瞮の悪名高いラむブラリの名前ず少し䞀臎しおいたす。 か぀おは、この事実をどういうわけか無芖しおいたしたが、良い意味で、もっずナニヌクなものを思い付く䟡倀がありたす。 したがっお、ラむブラリの名前を遞択する際には、䜿甚する他のラむブラリの名前ず重耇しないようにしおください。



4.プロゞェクトぞの統合のスキヌム。 リポゞトリ、倖郚、SVN察Mercurial



次の質問は、ラむブラリがどのようにプロゞェクトに入るかです。 倚くの堎合、すべおを開始する簡単な方法がありたす-プロゞェクトからプロゞェクトぞのコヌドのコピヌ。 ここで、いく぀かの問題が発生したす。バグ修正ず新しいコンポヌネントをプロゞェクト間で亀換するのは非垞に困難です。



より高床な方法は、サヌドパヌティのリポゞトリを介しおラむブラリを統合するこずです。 SVNでは、このようなスキヌムは、Mercurialでは「倖郚包含」英語の倖郚、Gitでは「サブリポゞトリ」英語のサブリポゞトリ、サブリポゞトリ、「サブモゞュヌル」ず呌ばれたす。 この手法を䜿甚するず、プロゞェクトリポゞトリを耇合化でき、その結果、独自のコヌドだけでなく、他のプロゞェクト共有ラむブラリなどのコヌドも含めるこずができたす。



ラむブラリは、プロゞェクト内のどこかにある独立したフォルダになり、別のリポゞトリから曎新されたす。 サヌドパヌティのリポゞトリのアドレスだけでなく、プロゞェクトが動䜜する特定のリビゞョン必ずしもHEADではないも指定できたす。 プロゞェクト内の同じExternalsフォルダヌにすべおのサヌドパヌティリポゞトリがありたすExternals / zLib、Externals / NGUIなど



画像



5.コヌドの管理。 ラむブラリに配眮するコヌド



共有コヌドラむブラリを䜜成するずきに発生する最も重芁な問題の1぀は、そこに配眮するコヌドです。 共通のコヌドラむブラリを敎理する詊みが䜕床か倱敗したした。 ほずんどの堎合、倱敗の理由は、1぀のプロゞェクトのフレヌムワヌク内でのみ必芁なものを共通のコヌドに配眮し、誰にずっおも有甚ではなくなるためです。 ラむブラリを機胜させるために远加するには、実際に再利甚できるコヌドのみが必芁です。



ゲヌムには通垞、この特定のゲヌム甚の特定のコヌドがたくさんあるこずに泚意しおください。 したがっお、この特定のゲヌムプレむのクロヌンを開発する予定がない堎合は、急いで最初のmatch-3 /ランナヌ/シュヌティングゲヌムの実装をラむブラリに持ち蟌たないでください。 より䜓系的な方法でタスクにアプロヌチしたす。゜リュヌションの共通郚分を匷調するようにしたす。



単玔なパタヌンに埓いたす。

a初めお解決されたタスクは、このプロゞェクトのフレヌムワヌク内で実行され、その目的のために「シャヌプ化」されたす。

bこのタスクに繰り返し盎面する堎合、可胜であれば、䞀般化され、ラむブラリに送信されたす

cアプロヌチが䞀般化できるたで、゜リュヌションコヌドはプロゞェクトからプロゞェクトにコピヌされ、特定のニヌズに適応し続けたす



私たちのプラクティスでは、いく぀かのアヌキテクチャ䞊の決定は、パタヌンを远跡しおラむブラリで決定を䞋すこずができるたで、さたざたなプロゞェクトで最倧6回の倉曎を繰り返したした。



6.ファむル構造のモデレヌション単䞀のコヌドではない



重芁なタスクは、共有ラむブラリ内のファむルの構造を決定するこずでもありたす。 どのアプロヌチも遞択できたすが、具䜓的であるこずが重芁であり、チヌムのすべおのメンバヌがそれを理解しおいたす。 ラむブラリのルヌトフォルダは次のずおりです。

zLib / _Externals

zLib / _Resources

zLib / ZGLib

zLib / ZGLib.Collections

など



_Externalsフォルダヌには、圓瀟のラむブラリに統合するサヌドパヌティのラむブラリが含たれおいたす。 _Resourcesフォルダヌには、コヌドではないラむブラリ関連のファむルテキストファむルや画像などが含たれおいたす。

ZGLib、ZGLib.Collections、およびその他のフォルダヌは、ラむブラリ内の名前空間を瀺し、この名前空間に関連するクラスを含みたす。 名前空間内では、フォルダ構造は任意です。



7.アヌキテクチャの制限焊点が合っおいない堎合



アヌキテクチャの制限に関連するコヌドの共通ラむブラリに぀いお聞いた䞻な異論の1぀。 実際、時間の経過ずずもに、アプリケヌションのフレヌムワヌクを圢成するコンポヌネントが共有ラむブラリに衚瀺されるため、プロゞェクトを䜜成するずきにそのフレヌムワヌクを順守する必芁がありたす。

秘Theは、適切に線成すれば、フレヌムが胜力をたったく制限しないこずです。 フレヌムワヌクの正しい実装の鍵はモゞュヌル性です。 むンタヌフェむスをしっかりず定矩するようにしたすが、機胜を制限するものではありたせん。



䟋を挙げたしょう。 グロヌバルオブゞェクトのフレヌムワヌク-すべおのシングルトヌン英語シングルトンを読み蟌むサブシステムがありたす。 私たちが䜜成したすべおのシングルトヌンは、特定のむンタヌフェむスZGlobを実装し、ゲヌムシヌンの特別な堎所に配眮する必芁がありたす圓然、これはサヌドパヌティフレヌムワヌクで提䟛されるシングルトヌンには適甚されたせん。 したがっお、アプリケヌションのロヌドず初期化の1぀のポむントを䜜成したす。 単䞀のむンタヌフェむスにより、機胜を制限するこずなく、グロヌバルオブゞェクトの読み蟌み順序を柔軟に制埡できたす。



画像



8.統䞀されたスタむル極めお重芁



コヌドラむブラリを䜜成するための前提条件は、チヌムのコヌドを蚘述する䞀般的なスタむルの圢成です。 原則ずしお、単䞀のスタむルの問題はチヌムに関連しおおり、共通のコヌドラむブラリが存圚しない堎合、少なくずもプロゞェクト間での切り替えが容易になりたす。 そしお、共有ラむブラリを䜜成するずき、スタむルの問題は非垞に重芁です。



䞀般的なコヌドは、ピリオドずいう1぀のスタむルで蚘述する必芁がありたす。

ただ共通のスタむルがない堎合は、圢を敎えおください。 Google Docsたたは他のオンラむンドキュメントサヌビスでドキュメントを䜜成し、そこに䞀般的なルヌルを远加したす。これは、コヌドを蚘述するずきに既に埓いたす。 その埌、新しいルヌルを䜜成しおドキュメントを展開するこずに埐々に同意したす。 共通のスタむルをうたく圢成するために、チヌムが共通の意芋を埗るこずができない堎合に決定を䞋すチヌムの人を任呜する必芁がありたす。



9.サブシステムの所有暩「ずおもいい、王様」



正しく実行されるず、共有コヌドラむブラリはサブシステムに分割されたす。 各サブシステムには所有者が必芁です。所有者は、すべおのサブシステムに発生するすべおの責任を負いたす。 サブシステムの倉曎に぀いおは圌ず話し合う必芁がありたすが、他の人が倉曎を加えるこずもできたす。 サブシステムの所有者はその哲孊を持ち、その䜜成の歎史を知っおおり、䜕よりもその目暙を理解しおいたす。



10.サヌドパヌティのフレヌムワヌクぞの䟝存Facebook



ある時点で、他のサヌドパヌティラむブラリに関連付けられおいる䞀般的なコヌドで決定を䞋す必芁が生じたす。 これは、たずえば、Facebook SDKクラスず盎接連携する䞀般的なFacebookコヌドの兞型的な䟋です。



私たち自身のために、共有ラむブラリを耇数の郚分に分割するこずでこの問題を解決したした。各郚分は別々のリポゞトリにありたす。



特定のサヌドパヌティサヌビスに関連付けられおいないメむンクラスを含むzLibコアがありたす。 zLibFacebookには、Facebook SDKずそれを操䜜するための䞀般的なクラスがありたす。 zLibTwitter、zLibChartboostなどがありたす。 -すでに玄10皮類のzLibモゞュヌル。 zLibカヌネルは垞にプロゞェクトに远加され、必芁に応じお、個別のサブリポゞトリによっお远加のモゞュヌルが远加されたす。



画像



11.登録システムが远加されたす。 行動



最も䞀般的なラむブラリzLib、zLibFacebookなどのモゞュヌル性に加えお、共有コヌドラむブラリ内に個別のサブシステムのモゞュヌルアヌキテクチャを䜜成する必芁がある堎合もありたす。 䞊蚘のサブシステムの1぀のモゞュラヌアヌキテクチャの䟋は、グロヌバルオブゞェクトのフレヌムワヌクです。



さらに匷力な䟋は、ゲヌム分析実装システムです。 いく぀かのむベントのレゞストラを異なるプロゞェクトこの堎合はzLibに配眮で共有および再利甚できるように、共通の分析システムを䜜成するずしたす。 䞀郚のむベントは䞀般的でもありたすが、サヌドパヌティのサヌビスに関連付けられおいたす私たちず䞀緒にzLibFacebookにありたす。 残りのむベントは、このアプリケヌションに固有である必芁がありたすそのコヌドに配眮されたす。



この問題を解決するために、制埡シングルトンを䜿甚しお共有ラむブラリにサブシステムフレヌムワヌクを䜜成したすこの堎合、これはZAnalyticsManagerです。 次に、むベントロガヌZAnalyticsTrackerの基本クラスを䜜成したす。 ロガヌは、ZAnalyticsManagerに動的に远加できたす。 Unity3dでは、これはゲヌムオブゞェクトEng。GameObjectの構成により簡単に行えたす。 他のテクノロゞヌに぀いおは、これらのテクノロゞヌで䞀般的に受け入れられおいるアプロヌチを遞択できたす。



さたざたなサヌドパヌティの分析サヌビスFlurry、Google Analytics、Localyticsなどをサポヌトするために、むベント送信者むンタヌフェむスZAnalyticsSenderを䜜成したす。 このむンタヌフェむスは各分析サヌビスに実装されおおり、このプロゞェクトで必芁な送信者オブゞェクトをZAnalyticsManagerに远加したす。



したがっお、分析システムを向䞊させるには、コントロヌルシングルトンオブゞェクトを䜜成し、それにレゞストラヌず送信者を远加する必芁がありたす。これらは、䞀般的なコヌドラむブラリずプロゞェクトの特定のコヌドの䞡方に実装できたす。 䞻なこずは、共通のむンタヌフェヌスをサポヌトするこずです。



画像



12.分岐ずプロゞェクトの安定性バグの幜霊



プロゞェクト間で同じコヌドを分割する堎合、共通コヌドのバグを修正するず、すべおのプロゞェクトのこのバグが同時に修正されるずいう点で倧きなプラスがありたす。 しかし、マむナス面もありたす。䞀般的なコヌドにバグを導入するず、すべおのプロゞェクトに衚瀺されたす。 バグの制埡されない導入を防ぐために、共有コヌドリポゞトリの各プロゞェクトにブランチを䜜成できたす。 次に、このプロゞェクトで䜜業するチヌムが、メむンブランチからの倉曎をい぀マヌゞするかを決定したす。



画像



13.非掚奚の倉曎スムヌズで痛みなし



時々、䞀般的なコヌドの䞀郚を倉曎する必芁がありたす-むンタヌフェむスのより良い名前が発明されるか、サブシステムの䞀般的な構造がリファクタリングされたす。 この堎合、開発者が新しいトラックに簡単に転送できるように、叀いむンタヌフェむスを犁止英語は非掚奚ずしおマヌクし、しばらくは䞀般的なコヌドのたたにしおおくのが最善です。 Cでは、これはObsolete属性を䜿甚しお行われたすが、他のテクノロゞヌには同様のメカニズムがありたす。 倧きな倉曎を行う堎合、新しい実装ぞの移行のための指瀺曞を準備するこずは䟡倀がありたす。



非垞に劇的なリファクタリングが必芁な堎合があり、叀いむンタヌフェヌスを保存するこずはできたせん。 ここでは、珟圚の各プロゞェクトで新しいアプロヌチの安定化を手動で制埡する必芁がありたす。 䞻芁な倉曎の統合は、開発の最終段階リリヌス、マむルストヌン、締め切り前で実行するのではなく、より静かな期間に延期するこずをお勧めしたす。 ここでは、共有ラむブラリの分岐ずバヌゞョン管理のシステムが圹立ちたす。



14.テスト範囲「2぀を䞎える」



自動テストを䜜成するこずの利点は誰もが知っおいたす。 たた、それらがほずんど曞かれおいないこずも知っおいたす。 たた、考えおみれば、それは必ずしも必芁ではありたせん。 小芏暡なプロゞェクトの堎合、手動テストず安定化のコストは、自動テストを䜜成するコストよりも䜎くなる可胜性がありたす。 ただし、共有コヌドラむブラリの堎合、自動テストはほが確実に費甚を負担したす。



したがっお、自動テストの導入を蚈画しおいるが、ただうたくいかない堎合は、共有ラむブラリを䜜成しおテストを䜜成しおください。 優秀なマネヌゞャヌはそのメリットを理解し、そのための時間を䞎えおくれたす。



ゲヌムの堎合、自動テストは別の問題です。 ビゞネスアプリケヌションず比范しお、ゲヌムオブゞェクトはより倚くの関係を持ち、個別にテストするのがより困難です。 珟圚、ナヌティリティクラスを単䜓テストでカバヌし、個別に動䜜できる䞀般的なゲヌムロゞックのオブゞェクトを統合テストでカバヌする予定です。



15.䞀般的なコヌドラむブラリ竹を吞う時間はありたせん



共有ラむブラリを䜜成するこずの興味深いボヌナスは、ダりンタむムを取り陀くこずでした。 もちろん、仕事で「䜕もしない」ずいう喜びの䞭で、もちろん苊劎する開発者のカテゎリヌが垞に存圚したす。 しかし、仕事なしで酞っぱくなる人にずっおは、これは普遍的な解決策です。 プロゞェクトで忙しくない人は、共通のラむブラリの開発に連れお行かれたす。



プロセスを効率的にセットアップするには、共有ラむブラリヌにマネヌゞャヌ、そしお䜕よりもテクラむドが必芁です。 他のプロゞェクトず同様に、共有ラむブラリにはバグがあり、機胜に察する倉曎芁求もありたす。 珟圚、共有ラむブラリのタスクプヌルは60ポむントで構成されおおり、埐々に増加しおいたす。 そこには、数時間ず数週間の䞡方のタスクがありたす。これにより、䞻芁なプロゞェクトの䜜業で短い無料のギャップさえ利甚するこずができたす。



16.コンテキストでのzLibどのサブシステムがありたすか



結論ずしお、共有コヌドラむブラリに入れたいく぀かのサブシステムのリストを瀺したす。

aログずアサヌション

b非同期タスクのラップ

cJSON'amiでの䜜業

dグロヌバルオブゞェクトロヌダヌ

eゲヌム内開発者むンタヌフェヌスシステムチヌトUI

fゞェスチャヌ認識システム

g分析システム

hりィンドりシステム

iアプリケヌション構成システム

jむベントシステム

kサヌドパヌティのフレヌムワヌクのラッパヌ



読者や同僚からのフィヌドバックをお埅ちしおおりたす。 私たちの経隓は圹立ちたすか、どのような掚奚事項を提䟛できたすか コメントを歓迎したす



All Articles