いばらを介しおクラりド3D蚭蚈およびC3DコアずWebGLに基づく斜蚭の蚭蚈のためのクラりドサヌビスの䜜成

今日、むンタヌネット䞊で圌らはただ雲に぀いお、圌らがどれほど無限で矎しいかに぀いお話したす...圌らがそこで芋たサヌバヌに぀いお...そしおあなたは そこで、オンラむン3Dおよびむンテリアデザむンサヌビスの開発における私の経隓を読者ず共有するこずにしたした。 ここでは、プロゞェクト党䜓のアヌキテクチャず実装の詳现に぀いおお話したす。







画像









3Dクラりドデザむンシステムずは䜕ですか 「クラりドコンピュヌティング」ずいう甚語は最近非垞に人気があり、むンプレヌスでもアりトオブプレヌスでも䜿甚されおいるため、定矩から始めたす。 私の理解ず実装では、クラりド3D蚭蚈は、3Dモデルに関するすべおのデヌタずその凊理手順がリモヌトサヌバヌ぀たり、クラりドに配眮され、クラむアントデバむスが特定のデヌタを芁求するような゜フトりェアアヌキテクチャですたたはむンタヌネットでの蚈算結果。 蚀い換えるず、このようなシステムは、クラむアントデバむスではなくサヌバヌで決枈操䜜の倧郚分を実行し、モデルずそのパラメヌタヌを芖芚化するためのデヌタのごく䞀郚のみをクラむアントに送信するずいう点で、埓来の蚭蚈システムずは異なりたす。 このようなシステムのアヌキテクチャは、密接に盞互䜜甚したすが、離れた堎所にあるサヌバヌずクラむアントの郚分に分かれおおり、補品のナヌザヌには盞互䜜甚が芋えないようにするための特別なアプロヌチが必芁です。







次の質問は、そのようなアヌキテクチャの利点は䜕ですか 間違いなく、クラりドアヌキテクチャは、ナヌザヌ、ナヌザヌのデヌタ、およびその凊理が1か所に配眮され、生成される埓来のクラりドアヌキテクチャよりも耇雑です。 しかし、私のプロゞェクトでは、クラりドアヌキテクチャには開発ず䜿甚の䞡方の面で倚くの吊定できない利点があり、アプリケヌションアヌキテクチャのこのような耇雑さを適切にしおいたす。 私はそれらを定匏化しようずしたす









もちろん、このアプロヌチには欠点がありたす。 これらのうち、以䞋を区別したす。









プロゞェクトのアヌキテクチャ



アヌキテクチャを遞択するずき、将来のスケヌリングの可胜性を考慮しお、最も負荷のかかったパヌツを簡単に䞊列化できるようにプロゞェクトをパヌツに分割したした。 蚈算では、CAD開発の既存の経隓に基づいお次の仮定を䜿甚し、プロトタむプを䜜成するずきに改良したした。







家具付きの平均的なアパヌトメントをダりンロヌドするには、玄25 MBの非圧瞮のゞオメトリデヌタず远加の属性5 MBの圧瞮+ 10 MBのテクスチャが必芁です。 0.2秒からのデヌタ生成時間 5秒たで 最も難しい堎合。 モデルのボリュヌムを300〜500䞇の䞉角圢に制限する予定です。







ナヌザヌによるプランの蚭蚈ずさたざたな補品の配眮の䜜業䞭、1぀の操䜜補品の挿入ず線集、プランの再生成あたり平均100〜500 Kbの発信トラフィック。 サヌバヌ䞊の各操䜜の平均実行時間は0.1〜0.5秒です。

ナヌザヌアクティビティは、1分間に1぀のモデルを開くレベル、たたは1分間に5〜10の線集操䜜を実行するレベルです。







これに基づいお、1台のサヌバヌで100人以䞊のアクティブナヌザヌを保持するこずが問題になるこずが明らかになったため、異なるサヌバヌで幟䜕孊的リク゚ストの凊理を保蚌し、䜕らかの方法でそれらの間で3Dモデルを配垃する必芁がありたす。







開発ツヌルの遞択においお、最初はいく぀かの制限に瞛られおいたした。 たず、C3Dをゞオメトリコアずしお䜿甚し、モデルを操䜜する際のゞオメトリ蚈算の速床に察する高い芁件により、サヌバヌ偎でのC ++の䜿甚が事前に決定されたした。 第二に、ブラりザでクラむアント郚分を起動するず、蚀語の遞択がJavaScriptでのコンパむルをサポヌトする蚀語に絞り蟌たれたす。







その結果、この段階では、プロゞェクトは4぀の独立した郚分で構成されたす。2぀の内郚バック゚ンドサヌビスず2぀の倖郚Webアプリケヌションです。 メむンの内郚サヌビスは、幟䜕孊的モデリングず蚈算を担圓したす。 C3DおよびQt Coreラむブラリを䜿甚しおC ++で蚘述されおいたす。 ヘルパヌサヌビスは、ファむル、ナヌザヌディレクトリ、およびテクスチャ凊理の管理を担圓したす。 ASP.NET Coreで蚘述されおいたす。 Webアプリケヌションも同様に分割されたす。 1぀はモデリングを盎接担圓し、TypeScript + WebGLで蚘述されおいたす。2぀目はプロゞェクトずナヌザヌディレクトリを管理するためのナヌザヌむンタヌフェむスを提䟛し、Angular 2 + TypeScriptず組み合わせお蚘述されおいたす。 クラむアント郚分ずサヌバヌ郚分の間の盞互䜜甚は、単玔なHTTP芁求を䜿甚しお行われたす。 ルヌムのむンタラクティブモデリングを担圓する郚分は、圧瞮されたバむナリデヌタを送信するWebSocket接続を䜿甚したす。 サヌバヌサヌビス間のコヌドの重耇を避けるために、HTTPプロトコルを介しお必芁な情報も亀換したす。







サヌバヌ偎



このプロゞェクトの䞻なハむラむトは、サヌバヌパヌツずクラむアントパヌツの組み合わせです。これにより、幟䜕孊モデリング、芖芚化、モデル線集の履歎の保存が行われたす。 プロゞェクトのこの郚分には、パフォヌマンス、RAM消費、䞊列化、およびスケヌラビリティの芳点から高い芁求が課されたす。 幟䜕孊的モデリング自䜓はかなり高䟡な蚈算タスクであり、倚くのアクティブなナヌザヌからモデルを䜜成するずいう芁求を満たすこずはさらに耇雑になりたす。 サヌバヌ䞊で幟䜕孊的モデリングタスクを実行するシステムの「心臓」ずしお、C3D LabsのC3Dコアが遞択されたした。その理由は、以前の蚘事「Nuclear Technologies in CAD」[1]で説明したした。 耇雑な3Dプロゞェクトを管理する機胜を実装するために、ゲヌム開発者に人気のある階局ECS゚ンティティコンポヌネントシステムに基づく独自の3Dモデルデヌタストレヌゞシステムを開発したした。 モデルのツリヌ構造を衚し、さたざたな芁玠゚ンティティで構成されたす。各芁玠には、幟䜕孊的パラメヌタヌ、BREPシェル、䞉角グリッド、ナヌザヌデヌタなどの異なるデヌタセットコンポヌネントがありたす。 システムが必芁な芁件を満たすために、その実装には倚くの特城的な機胜がありたす。







モデルが読み蟌たれるず、その構造のみが読み蟌たれ、そのすべおのデヌタコンポヌネントはNoSQLデヌタベヌスに栌玍され、コンポヌネントにアクセスするずきに自動的にRAMに読み蟌たれ、必芁に応じお自動的にメモリからアンロヌドされたす。 これにより、数千のモデルを同時に開いたサヌバヌ䞊で、䜎RAMコストで䜜業できたす。







他の゚ンティティのコンポヌネントずの関係は、「゚ンティティID-コンポヌネントのタむプ」のペアの圢匏でコンポヌネント内に保存されたす。 モデル芁玠をコピヌする操䜜䞭に、すべおの芁玠は叀いIDから新しいIDず察称ハッシュ関数を䜿甚したランダムな操䜜コヌドを受け取るため、゚ンティティ内のすべおの倉曎されたIDを眮き換える代わりに、叀いIDを新しいIDに倉換するコヌドが蚘憶されたす。 これにより、モデル構造の参照敎合性を倱うこずなく、シンプルで高速なバむトコピヌでコンポヌネントデヌタをコピヌできたす。 その結果、コンポヌネントの構造を読み取らずに巚倧なモデルをコピヌできたす。これにより、蚭蚈された郚屋内の倧きなアセンブリを即座にコピヌできたす。







前のメカニズムのおかげで、特別なトランザクションコンポヌネントが実装されたす。このコンポヌネントでは、さたざたなチヌムがコンテンツを線集しおいる間、モデルの構造の倉曎の履歎が自動的に保存されたす。 ゚ンティティを比范的小さなコンポヌネントに分割するこずにより、各コンポヌネントぞの呌び出しに「リスナヌ」を配眮し、その倉曎を自動的に远跡するこずができたした。 これにより、モデル倉曎の履歎党䜓を保存し、䜕ヶ月も前に䜜成した時点に戻すこずができたす履歎党䜓は、必芁なくRAMにロヌドされないコンポヌネントにも保存されるため。 開発者の芳点から芋るず、これは、幟䜕モデルにDBMSに存圚するトランザクションに類䌌したトランザクションの類䌌性があるこずを意味したす。







モデルの各芁玠ずコンポヌネントのバヌゞョン管理により、サヌバヌ䞊のバヌゞョンず同期させるためにクラむアントモデルで調敎する必芁がある゚ンティティずコンポヌネントに関する情報を含む特別なパッチファむルが迅速に䜜成されたす。 これにより、WebSocketプロトコルのバむナリバヌゞョンを䜿甚しお、接続されおいるすべおのクラむアント䞊のモデルデヌタをリアルタむムで効果的に同期できたす。







実際には、このようなシステムは非垞に迅速に動䜜し、モデルぞのほずんどのク゚リの凊理時間を5〜50ミリ秒以内に提䟛したす。 ただし、システムにはボトルネックがありたすモデルを開くには、すべおのデヌタを転送しお芖芚化する必芁がありたす。倧芏暡なモデルの堎合、これらのコンポヌネントを抜出するためにデヌタベヌスを頻繁に呌び出す必芁があり、数䞇芁玠のモデルで数秒に達する倧きな遅延に぀ながりたす。 Redisでのパッチファむルのキャッシュにより、この問題を克服できたした。 パッチは関連性を倱わないためバヌゞョン0からバヌゞョン100のパッチ+バヌゞョン100からバヌゞョン200のパッチは、バヌゞョン0からバヌゞョン200の単䞀のパッチず同等です、キャッシュの無効化の問題を簡単に解決したす心配するこずなくバックグラりンドで曎新できたすデヌタの関連性の損倱。







クラむアント郚



クラむアント郚分の蚭蚈は、芖芚化のための゚ンゞンの遞択から始たりたした。 ほがすべおの人気のあるWebGL゚ンゞンが詊されたしたが、次の理由により、それらのどれにもこだわるこずはできたせんでした。









分析の結果、「自転車」を曞く方がより速く、より良く、はるかに簡単にサポヌトできるずいう理解が埗られたした。 壮倧なラむブラリhttps://twgljs.orgが基瀎ずしお遞ばれたした







次に、WebGLでフロアプランず3Dビュヌを描画する䟋を瀺したす。







画像







画像







次の質問は、プログラミング蚀語ずプラットフォヌム党䜓の遞択です。 私はすでに、玄1䞇行のサむズのJavaScriptアプリケヌションを開発した経隓がありたす。 この経隓に基づいお、JavaScriptで䜕かをより個人的に開発するずいうアむデアは、a敬の念を抱かせおくれたした。 次のTypeScriptリリヌスず、Anders Halesbergがその背埌にあるずいう事実により、蚀語の遞択が事前に決定されたした。 Web甚のプラットフォヌムの遞択は、Angular 2珟圚は4にかかっおいたした私はかなりの数の倚様なラむブラリからプロゞェクトを組み立おる必芁があり、Webアプリケヌション甚に独自のコンバむンハヌベスタヌを構築するこずを少しも望みたせんでした。 「包括的」なフレヌムワヌクがたさに必芁でした。 システムモゞュヌルの遅延ロヌド、効率的なコヌド生成AOT、および囜際化機胜の開発された機胜は、私の遞択を匷化しただけです。 珟時点でただ私を混乱させおいる唯䞀のこずは、゜ヌスファむル内のメッセヌゞのロヌカラむズの欠劂ですが、第4バヌゞョンたでにこの機胜を実装するこずを心から願っおいたす







アむデアの実装



このプロゞェクトは、OpenGLでの将来のモデルの構造ず実隓的な芖芚化のプロトタむプのC ++での実装から始たりたした。 数か月のデバッグの埌、アプリケヌションをクラむアントサヌバヌモデルに倉換し始めたした。 最初に、次のようにこれを行いたした。CでRESTずWebSocketを組み合わせたサヌバヌを䜜成し、ゞオメトリックサヌビスを、ゞオメトリックリク゚ストに察しお呌び出されるモデルを操䜜するためのCむンタヌフェむスを持぀ダむナミックラむブラリずしお接続したした。 C ++からCにデヌタをコピヌし、次にCにデヌタをコピヌする際に、このようなハむブリッドアプリケヌションず䞍芁なオヌバヌレむをデバッグするずいう非垞に䞍䟿なため、代替゜リュヌションを探す必芁がありたした。 最終的に、C ++パヌツ内のWebSocketサヌバヌをオンにし、すべおのリク゚ストをプロキシサヌバヌ経由でルヌティングしたした。 同時に、クラむアントを認蚌するために、ゞオメトリックサヌビスはメむンRESTサヌビスに察しお内郚リク゚ストを行いたす。







次のステップは、モデルの同期アルゎリズムの実装でした。これは、サヌバヌ䞊で倉曎され、クラむアント䞊にモデルが衚瀺されたす。 サヌバヌによっおサヌバヌの状態を監芖したり、同期の前にクラむアントに珟圚の状態をサヌバヌに送信したりする最初のアむデアは、信頌性が䜎く、実装が困難であるずしお华䞋する必芁がありたした。 次の実装に焊点を圓おたした。各コンポヌネントは、コンポヌネントの敎数バヌゞョンを栌玍したす。 したがっお、モデル党䜓のバヌゞョンは、そのすべおのコンポヌネントず子゚ンティティのコンポヌネントの最倧バヌゞョンによっお決定されたす。 同期䞭、クラむアントはモデルのバヌゞョンを含む芁求をサヌバヌに送信し、それに応答しお、サヌバヌはクラむアントバヌゞョンより叀いバヌゞョンのすべおのコンポヌネントのデヌタを送信したす。 これにより、最小限のトラフィックでクラむアントずサヌバヌ間のツリヌモデルの同期が保蚌されたした同期芁求は1぀の番号であり、応答には倉曎されたコンポヌネントのみが含たれたす。







クラむアントずサヌバヌのパヌツのプロトタむプを䜜成した埌、クラむアントずサヌバヌ間で幟䜕モデルを転送するための最適なデヌタ圢匏の怜玢を開始したした。 この圢匏では、次の機胜が必芁でした。









実隓で䜿甚したJSONはすぐに削陀する必芁があり、その埌、MessagePack、Google Protocol Buffers、Apache Thrift、BSON、および同様のラむブラリから遞択する必芁がありたした。 パフォヌマンスの向䞊、圧瞮率の向䞊、䟿利なコヌドゞェネレヌタヌのため、Google Protocol Buffersを遞択したした。 重芁な芁因は、図曞通の普及ず、長期的に芋捚おられないずいう垌望でした。 その結果、私はC ++でネむティブprotobufを䜿甚し、クラむアントで読み曞きするprotobufjs、proto2typescript-C ++ずTypeScriptの間で単䞀のスキヌムを䜿甚したす。 さらに、WebSocketsを介しお送信される堎合、デヌタはzlibによっおさらに圧瞮されたす。 このスキヌムにより、モデルに埓っお必芁なすべおのデヌタを非垞に快適か぀迅速に転送できたした。







PS最近、同じ開発者のFlatBuffersラむブラリを芋぀けたした。このオプションの方がもっず良いず思っおいたしたが、このラむブラリを詊しおみる十分な時間がありたせんでした。さらに、メむンブランチではTypeScriptサポヌトがただ利甚できたせん。







デヌタ圢匏を萜ち着かせ、システムの各郚分で最初の実隓を行った埌、サヌビス党䜓がどのように機胜するかがほが明らかになりたした。 さらに、ボトルネックが評䟡され、将来のスケヌリングオプションがスケッチされたした。 次に、プログラムの最初のバヌゞョンが䜜成され、「ナヌザヌアクション-シミュレヌションサヌバヌぞの芁求-ナヌザヌアクションの芖芚化」リンクの操䜜が瀺されたした。 この段階で、最初の倱望が蚪れたした。このような䜜業スキヌムは、「マヌカヌを匕っ匵り、マりスを攟し、オブゞェクトが再構築された」スタむルでデヌタを曎新するこずを提䟛したす。 カヌ゜ルを移動するずきに、ナヌザヌのアクションをむンタラクティブに衚瀺するには遅すぎたした。







この結果は、サヌバヌずクラむアント郚分の境界を再考し、クラむアントをより倧芏暡にするこず、およびクラむアントがむンタラクティブなポリゎン芖芚化の予備蚈算を実行し、サヌバヌがBREPモデルで最終アクションを実行し、すべおのクラむアントを同期するように、サヌバヌずクラむアント間の機胜を耇補するこずを必芁ずしたした自分で。 これにより、WebAssemblyプロゞェクトに぀いお深く考えるようになりたした。理論的には、クラむアントずサヌバヌの郚分に単䞀のコヌドベヌスを持ち、クラむアントずサヌバヌ間の蚈算の実行を迅速に管理し、必芁に応じお負荷を分散できたす。 しかし、今のずころ、それはすべお倢です...







次のステップは、完党なWebGLレンダリングの実装でした。 ただし、その機胜はかなり控えめですが、かなり汗をかかなければなりたせんでした。 実装の䞻なポむントをリストしたす。







珟圚の段階では、埓来のフォワヌドレンダリングずレンダリングにいく぀かのパスを䜿甚しおいたす。 将来的には、Screen Space Ambient OcclusionたたはScalable Ambient Obscuranceに基づいおシェヌディングを実装する予定です。







蚱容できるパフォヌマンスを達成するために、グロヌバルオブゞェクト座暙系の小さな頂点バッファヌに小さなオブゞェクトを接着し、ビデオカヌドに送信したす。 オブゞェクトを倉曎するず、必芁なすべおのバッファが再びプロセッサ䞊で再カりントされたす。 ワむルドに芋えるかもしれたせんが、远加の属性でオブゞェクトマトリックスを送信するこずはさらに耇雑です。







1ピクセル以倖の倪さの3Dラむンでの描画は、WebGLでは非垞に重芁です。 すべおの頂点が同じ線䞊にあり、厚さが属性-接線ベクトルに栌玍されおいる2぀の䞉角圢の描画を通じお実装したした。 䞉角圢の最終的な頂点は、ポむントを画面の座暙系に倉換し画面の幅ず高さの比率を考慮するため、必芁な線の倪さを远加し、正芏化された座暙に倉換するこずにより、頂点シェヌダヌで蚈算されたす。 ラむンスムヌゞングは​​、フラグメントシェヌダヌのアルファチャネルを通じお実装されたす。

テキストレンダリングは、Valveが公開したSDF技術を䜿甚しお行われたした。 フォントを準備するために、libgdxのHieroナヌティリティが䜿甚されたした。 私が埗た結果は満足のいくものです。フォントサむズが14〜16ピクセルの堎合、テキストはきれいに芋えたすが、サむズが小さく、テキストが画面の平面に察しお鋭角である堎合、ほずんど刀読できたせん。 自衛隊の準備方法がわからないだけかもしれたせんが、倚くの時間を倱い、結果を根本的に改善するこずはできたせんでした。 将来的には、 この手法を詊す予定です。







たた、最新のブラりザヌでのWebGLサポヌトは、OpenGL for Windowsず比范しお優れおいるこずにも泚意しおください。 これは明らかに、DirectXを介しおWebGL呌び出しを゚ミュレヌトするAngleプロゞェクトによるものです。 IE 11でも束葉杖のないコヌドは問題なく動䜜したす。䞀方、耇雑な構造を持぀倧量のデヌタで動䜜するアプリケヌションでは、察凊が非垞に難しいメモリリヌクずいう深刻な問題がありたす。







゚ピロヌグ



開発の次のステップは、プログラムの䞻題領域の実装でした-建物のモデリング、郚屋ずさたざたな構造芁玠のレむアりト、むンテリアアむテムの配眮、ナヌザヌカタログの䜜成。 もちろん、認蚌ず認蚌、バックアップ、さたざたな郚分のスケヌリング、開発プロセス党䜓の継続的な統合ずいう圢で、Webサヌビスに関連する倚くのこずは泚意ず時間を必芁ずしたす。 これらの分野では、プロゞェクトが䞀般に公開される前に、かなりの䜜業が行われおいたす。 それにもかかわらず、実行された䜜業により、私は膚倧な経隓を積むこずができたした。 私の考えが読者の䞀郚に圹立぀こずを願っおいたす。 誰かが経隓があり、Webサヌビスを実装するためのヒントを共有する準備ができおいる堎合、私はそれらを聞くこずに非垞に興味がありたす。 個人で曞くか、ここにコメントを残しおください。








All Articles