3DOずAndroid NDKおよび関䞎しない方法...

画像



倧芏暡な゜ヌスコヌドベヌスC ++たたはパフォヌマンス芁件のために、Javaではほずんど䞍可胜なアプリケヌションがかなりあるでしょう。 そしお、これらのアプリケヌションの1぀、぀たり3DOゲヌムコン゜ヌル゚ミュレヌタヌReal3DOPlayerを開発しおいるこずがわかりたした 。 私の堎合、コヌドベヌスずパフォヌマンスの䞡方の芁件が圹割を果たしたした。 コヌドはフェニックスのデスクトッププロゞェクトに基づいおおり、組み蟌みプロセッサずは異なり、䞭芏暡のデスクトップでも速床が䜎䞋したした。 Gooogleでのろいの数を芚えおいたせんが、受けた経隓は非垞に貎重でした。ここで共有したいず思いたす。





壁に額を叩いおいる初心者が......



Gex



私は経隓豊富なプログラマヌ15幎以䞊であるにもかかわらず、NDKを取り䞊げるずすぐに、初心者のように感じたした。



最初のバンプ。 Android StudioをWindowsにむンストヌルしたので、JNI呌び出しで最も単玔な「Hello、world」の抂芁を説明するこずにしたした。 すべおが非垞に簡単です



JNIEXPORT jstring JNICALL Java_ru_arts_union_real3doplayer_NativeCore_stringFromJNI(JNIEnv* env, jclass clazz) { return env->NewStringUTF("Hello, World!"); }
      
      







コンパむル゚ラヌ。 ただコンパむル゚ラヌ。 ご芧のずおり、コヌドはコンパむルされたせん。 問題を積極的にグヌグルで調べおコヌドをコンパむルしようずしたが、1日埌にコヌドを収集できたせんでした。 翌日、Linuxを搭茉したラップトップを持ち、これら2぀のラむンを苊しめ続けるこずに決めたした。驚いたこずに、すべおがすぐに集たりたした。 フォヌラムを読み始めたしたが、Windowsでコヌドをコンパむルできないのはなぜですか それは刀明したした-1぀のC / CPPファむルはプロゞェクトを構築するのに十分ではありたせん、少なくずも2かかりたす



バンプは2番目です。 アプリケヌションを起動するずクラッシュし、stringFromJNIメ゜ッドが芋぀からなかったこずが報告されたす。 どうしお芋぀かりたせんか ここにあり、ここず逆アセンブラヌに衚瀺されおいたす パニックにならないでください。私はコヌド党䜓を芋お行きたす。神に感謝したす。それほど倚くはありたせん。 関数ru_arts_union_real3doplayerの名前のプレフィックスを芋るず、䜕かがここで間違っおいるこずがわかりたす...結局、私のパッケヌゞの名前は次のようになりたした。 、および環境自䜓がパッケヌゞにそのような名前を蚱可しおいるのは奇劙です。 ダッシュを削陀しお、パッケヌゞずメ゜ッドの名前を倉曎したす。 やった メ゜ッドが衚瀺され、2日埌に「Hello、world」



バンプは3番目です。 問題はありたせん。倚くのファむルが存圚し、名前が修正されたした。最悪の事態が遅れおいるず考えお先に進みたす。 Linux / WindowsでさたざたなプロセッサARMを含むでテストされた゜ヌスを远加したす。 すべおが完党にコンパむルされ、゚ラヌは1぀もありたせん。 譊告なしで起動時にアプリケヌションがクラッシュしたす。 コヌドの瞑想を続け、長い二重の通過線を芳察し、NEONが最倧の倍を保持しおいるこずを思い出したすが、このコヌドは呌び出されず、ただ存圚し、タむプヘッダヌにreal80を削陀したした。 そしお、コヌドぱラヌなしでコンパむルされたした うヌん..タンバリンをノックするよりも、私はこのコヌドを飲みたいです...起動しお、ビンゎ ワむルドブレヌキがかかっおいおも、コヌドは機胜し、ゲヌムが始たりたす



たた、䞀芋圓たり前のように芋えるもの-暙準Cラむブラリ、泚意しおください。あるバヌゞョンに存圚する䞀郚のメ゜ッドが別のバヌゞョンに存圚せず、目的のメ゜ッドをロヌドできないためにアプリケヌションがクラッシュするこずがよくありたす。 ここで圹立぀のは、静的リンクを䜿甚したSTLを支持する広範なテストたたは拒吊のみです。 そのため、たずえば、数倀を文字列に、たたはその逆に倉換する機胜がないため、かなり倚数のデバむスでTinyXMLがクラッシュしたす。



経隓が少ないほど、より倚くのコヌンが埗られたす-粟神的に準備しおください、おそらくすべおを芚えおいたせんでした...



パフォヌマンスを远求する、たたは䞀床急萜した...



BCレヌサヌ



゚ミュレヌタのパフォヌマンスを向䞊させる方法は、䞀郚の堎所ではi7にも負担をかけたしたか 非垞に簡単で、自分をコンピュヌティングリ゜ヌスに制限する必芁がありたす。これは、Androidに移怍しようずしたずきに発生したした。



このような困難な状況では、コン゜ヌルのグラフィックプロセッサによっお事前たたは郚分的に凊理されたピクセルでテクスチャキャッシングを実装する必芁がありたした。 正方圢ポリゎンの䞉角圢分割3DOには非線圢テクスチャマッピングがありたす; 静的コヌドの再コンパむル、頻繁に䜿甚されるコン゜ヌルOSのラむブラリ。 コン゜ヌルのサブシステムの゚ミュレヌションの䞊列化。 これにより、ハヌドりェア芁件を3倍以䞊削枛できたした。 叀兞的なテクニック、アセンブリの最適化、プロファむラヌに長時間座っおいるこずを考慮せずに、他にどこで時蚈を節玄できたすか 明らかに、ほずんどのナヌザヌは違いに気付かないでしょう。 そのため、たずえば、フレヌムを塗り぀ぶすずきに、24ビットではなく16ビットラスタで倚くを保存したした。



最適化プロセス自䜓は非垞に面癜く、別の蚘事に基づいおいたすが、䞊蚘のすべおはAndroid自䜓には適甚されたせん。 しかし、プラットフォヌム自䜓ずその機胜から䜕が埗られたすか ほずんどのデバむスがモバむルプラットフォヌムのCPUずGPUを共有しおいるため、明らかにテクスチャメモリに盎接蚘録したす。 しかし、残念ながら、GraphicBufferずしお知られるこのメカニズムは、䞀般的な䜿甚を目的ずしおいたせん 䜕も、dlopenを介しお取埗するこずはできたせん。 ただし、このハックはどこでも機胜しない可胜性があるため、これはオプションで行う必芁がありたす。 ここで実装を芋るこずができたす怜玢で芋぀けるのはかなり困難です android.googlesource.com/platform/external/deqp / + / deqp-dev / framework / platform / android / tcuAndroidInternals.cpp



そしお、Androidは本圓に私たちに䜕を提䟛したいのですが、本圓に必芁ですか もちろん、アプリケヌションサむクルを制埡しおください しかし、本圓に必芁な堎合は、NativeActivityが圹立ちたす。たたは、シンプルで䟿利なこの小さな䟋 github.com/tsaarni/android-native-egl-exampleが圹立ちたす。 通垞のアクティビティからの操䜜方法が䞍明なNativeActivityずは異なり、このアプロヌチでは、Javaが決定したずきではなく、必芁なずきにりィンドりコンテキストをキャプチャしお別のストリヌムに描画できたす。 そしお、ここで私は自分でそれを知らずに混乱しおいた。



実際、このメカニズムはすべおのバヌゞョンのAndroidで機胜するわけではありたせん少なくずも私のテストでは、バヌゞョン4.1-4.3はサポヌトしおいたせん。これは、Googleの統蚈によるず、アプリケヌションのタヌゲットデバむスの玄40です。 40の利益。 そしお、これに぀いおは非垞に遅いこずがわかりたす。通垞、ナヌザヌはアプリケヌションを眮いお、それが機胜しないこずを確認し、すぐに取り壊し、レビュヌを曞かないためです。 アプリケヌションの間違ったサむクルを修正するのは楜しいこずではありたせん。動䜜するデバむスず動䜜しないデバむスを刀断するこずは䞍可胜であるため、デフォルトでより遅い゜リュヌションを蚭定できたすが、より互換性のあるものを蚭定できたすが、カルマを台無しにするこずはできたせん蚭定を確認したす。「䜕かを締めお、以前のように遅くなりたせんか」すぐにオヌクバヌゞョンを䜜成しおからオプションを远加する方が良いですが、私の堎合は遅すぎたす。



゚ンティティの切断たたは2぀の呚りの混乱...



バストアムヌノ



Javaには膚倧なラむブラリがあるため、倚くの堎合、SDKには、たずえば、フォントや画像の操䜜など、ネむティブコヌドで耇補したくない機胜が既にありたす。 そしお、C ++からJavaメ゜ッドを呌び出したいずいう自然な欲求がありたす。 私はそのような欲求を抱いおいたので、ネむティブコヌドからの芁求に応じおフォントをテクスチャにレンダリングし、すべおのデバむスず倚数の仮想デバむスをテストしたした。 すべおが正垞に動䜜し、再び混乱に陥りたした-リリヌスを行いたした...ナヌザヌの玄1すでにアプリケヌションを賌入したに察しお、プログラムはクラッシュし始めたした。 控えめに蚀っおも、非垞に悪い、ネガティブなレビュヌ、そしお状況そのもの-人は支払いをし、それからバム-それは圌にずっおはうたくいきたせん。 理由が䜕であるかを蚀うのは難しいです、私はいく぀かのメヌカヌが倉曎された軞たたは他のものを䜿甚しおいるず思いたす。 もちろん、自分から間違いを排陀するわけではありたせんが、そのようなレポヌトを芋お、私はそれを匷く疑いたすもちろん、この方法は癜黒でした



 java.lang.NoSuchMethodError: no method with name='loadConfig' signature='(Ljava/lang/String;)Ljava/lang/String;' in class Lru/vastness/altmer/real3doplayer/MainActivity; at dalvik.system.NativeStart.run(Native Method)
      
      







この゜リュヌションを非垞に迅速に切り取り、別の゜リュヌションに眮き換える必芁がありたした。 少し血がかかりたした。 ゜リュヌション自䜓は非垞に優れおいたす1の非互換性は蚱容できたすが、通過するだけで賌入したせんが、アプリケヌションが起動するたでは、倚くのコピヌが既に販売されおいる堎合にのみ、それに察しお匷くアドバむスしたす。



歊噚庫を曎新するか、トラブルに巻き蟌たれる3 ...



ポ゚ド



システムを再配眮し、SDKを䞋䜍にむンストヌルしたため、targetSdkVersionも倉曎されたした。 迷惑がありたした。 SDドラむブが衚瀺されなくなりたした。これは、アクセス暩を䜿甚したGoogleの奇劙な詐欺が原因です。 同時に、叀いバヌゞョンのSDKでAPKをダりンロヌドするこずもできたした 無理です しかし、私はわずかな恐怖で降りたした、問題は蚱可を芁求するこずで解決したした。 そしお、問題がそれほど簡単に解決されない堎合はどうなりたすか 次に䜕をしたすか 質問はずおも興味深いです...



曎新に䌎う最も䞍快なこずは、今日たで取り陀けたせんが、ネむティブラむブラリの倉曎でAPKを曎新する環境の䞍本意です。LinuxおよびWindowsで問題が発生したす。 これは面倒なので、新しく収集された最新のAPKのデバッグ䞭のデバむスで、次の操䜜を行う必芁がありたすAndroid Studio 2.1.1



1.プロゞェクトを再構築したす。

2.プロゞェクトを実行したす同時に、最初の手順をスキップするず再アセンブルされず、再構築されたす。

3.アプリケヌションを停止したす。

4. APKをビルドしたす。

5.アプリケヌションを実行したす。



たた、再構築を行った堎合、アプリケヌションを起動するず、デバむス䞊で新しく収集されたAPKを受け取るず思いたしたか そこにはありたせんでした。確認しおください。代わりに、ポップアップりィンドりたたはログのメッセヌゞに倉曎のバヌゞョンを蚘茉しおください。 そうしないず、䜜業コヌドをチェックするのに倚くの時間を倱う危険がありたす。 そしお、2回目たたは3回目の打ち䞊げからうたくいくこずを期埅しないでください。



同様の問題を抱えおいる人のために、時間を補うために、もしそうしおいなければ、ネむティブコヌドの䞊列アセンブリのためにゞョブNを指定するこずをお勧めしたす。



䞀番䞋の行...



ロビン゜ンのレクむ゚ム



䞀般に、私はこのプラットフォヌムの開発ツヌルに没頭しおおり、このような湟曲は10幎間芋おいたせんが、比范するものがありたす。 もちろん、Javaが優先事項であるこずは理解しおいたすが、それでも...倉数でれロにシフトするずきに、むンテルコンパむラで䜕幎も前に芋぀けたバグだけが、これに遭遇する可胜性がありたす。



  if(shift)return x>>shift; return x;
      
      







それでも、Googleに敬意を衚する䟡倀はありたす。Androidのネむティブ開発者の絊䞎が高くなるように、圌らはすべおを行いたした。



私にずっお、C ++開発者ずしお、Android甚のアプリケヌションの状況は逆説的に芋えたすが、䞀方で必芁なメカニズムがありたすが、プラットフォヌムの問題の合蚈量は、改善を詊みるずき、評刀を倱うか開発するかを遞択する必芁があるずいうこずですアプリケヌション。 そのような遞択の前に私を眮いたプラットフォヌムは䞀぀もありたせん。



意図せずに、このプラットフォヌムで䜕も改善しない方が良いかもしれないず考えおいる自分をキャッチしたす。そうでなければ、䜕が起こるかは関係ありたせん...



PS。 考えないでください-゚ミュレヌタヌは開発を続けたす、それはちょうど沞隰したす。



All Articles