以前Cocos2d-xをビルドして(2017年6月30日の日記参照)、Linuxで動くサンプルプログラムをビルドしました。あの時は結局、ゲームは作らずじまいでした。懲りずに、今回はAndroid向けにビルドします。
その前にまずLinux向けにビルドします。簡単かと思ったら、めちゃくちゃハマりました……。
公式ドキュメント(リンク)に載っている通りの手順を試すと、下記のようなエラーが出ます。
$ git clone https://github.com/cocos2d/cocos2d-x $ cd cocos2d-x/ $ git submodule update --init Submodule path 'tests/cpp-tests/Resources/ccs-res': checked out '5d65db4c5f18c0df1305ff32b076425ab228cc4a' Submodule path 'tools/bindings-generator': checked out '2aa9b21f11bf514ca80f243b21750e8c7c28f05e' Submodule path 'tools/cocos2d-console': checked out '643f423415c62a1b610549323c4bf5499683baab' Submodule path 'web': checked out 'e79acd062363818af809c51804083a5989a9aedc' $ ./download-deps.py ======================================================= ==> Prepare to download external libraries! ==> version file doesn't exist ==> Ready to download 'v3-deps-156.zip' from 'https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/archive/v3-deps-156.zip' (...snip...) ==> Would you like to save 'v3-deps-156.zip'? So you don't have to download it later. [Yes/no]: Yes $ cd build/ $ mkdir linux-build $ cd linux-build/ $ cmake ../../ -- The C compiler identification is GNU 8.2.0 -- The CXX compiler identification is GNU 8.2.0 -- Check for working C compiler: /usr/lib/ccache/cc -- Check for working C compiler: /usr/lib/ccache/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features (...snip...) -- Found Threads: TRUE -- Configuring done -- Generating done -- Build files have been written to: /home/katsuhiro/share/projects/oss/cocos2d-x/build/linux-build $ make [ 0%] Building CXX object engine/external/unzip/CMakeFiles/ext_unzip.dir/ioapi.cpp.o [ 0%] Building CXX object engine/external/unzip/CMakeFiles/ext_unzip.dir/unzip.cpp.o [ 0%] Building CXX object engine/external/unzip/CMakeFiles/ext_unzip.dir/ioapi_mem.cpp.o [ 1%] Linking CXX static library ../../../lib/libext_unzip.a (...snip...) [ 84%] Built target jscocos2d [ 84%] Building CXX object engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/Classes/AppDelegate.cpp.o [ 84%] Building CXX object engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/Classes/HelloWorldScene.cpp.o [ 84%] Building CXX object engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/proj.linux/main.cpp.o [ 84%] Linking CXX executable ../../../bin/Debug/cpp-empty-test/cpp-empty-test /usr/bin/ld: ../../../../../external/freetype2/prebuilt/linux/64-bit/libfreetype.a(ftbase.linux64.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC (...snip...) /usr/bin/ld: ../../../../../external/freetype2/prebuilt/linux/64-bit/libfreetype.a(ftbitmap.linux64.o): relocation R_X86_64_32S against `.rodata' can not be used when making a PIE object; recompile with -fPIC /usr/bin/ld: final link failed: nonrepresentable section on output collect2: error: ld returned 1 exit status make[2]: *** [engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/build.make:153: bin/Debug/cpp-empty-test/cpp-empty-test] Error 1 make[1]: *** [CMakeFiles/Makefile2:1362: engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/all] Error 2 make: *** [Makefile:84: all] Error 2
エラーで指摘されているfreetype2/prebuilt/linux/64-bit/libfreetype.aは、download-deps.pyがダウンロードしてきたv3-deps-156.zipに含まれているスタティックライブラリです。recompile with -fPICと言われても、自分でビルドしたものではないので、何もできません。そんなこと言われても困る。
困った挙句にCocos2d-xのissue list(リンク)に辿りつきました。議論を見るとcocos2d-x-3rd-party-libs-srcリポジトリのbuild.shでライブラリが作れるみたいです。うえ〜、そんなの知らんがな。
$ git clone https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src $ cd cocos2d-x-3rd-party-libs-src/build/ $ ./build.sh -p=linux --libs=freetype --arch=x86_64 --mode=release $ cp linux/freetype/prebuilt/x86_64/libfreetype.a ../../cocos2d-x/external/freetype2/prebuilt/linux/64-bit/libfreetype.a
依存ライブラリを自前でビルドして置き換えることで、無事にCocos2d-xのコンパイルが通りました。
心配だったゲームプロジェクトの作り方は以前と同じ(2017年7月2日の日記参照)でした。こちらはハマらなくて本当に良かったです。
生成されたゲームプロジェクトの中にproj.androidという名前のディレクトリが作成されます。Android Studioでproj.androidを開けば後は勝手にGradleがビルドしてくれるはずです。
$ ls CMakeLists.txt Resources proj.android proj.linux Classes cocos2d proj.ios_mac proj.win32
Linux向けにビルドしたいときは、以前と同じ手順でOKです。同じコードでAndroidもLinuxも対応できて便利ですよね。
弱者を抹殺する。 不謹慎な質問ですが、疑問に… - Yahoo! 知恵袋を読んで。
Twitterで知りました。7年以上前の話題ですが、ベストアンサーに選ばれた回答が素晴らしかったです。
ベストアンサーの中に出てくる「人間の生存戦略は、、、、「社会性」」の一文が非常に興味深かったので、社会性についてちょっと調べてみました。まず、大前提として、生物は生きようとしますし、子孫を増やそうとします。死にたがりや増えない生物は存続不能なので自明だと思います。
生物の行動は利己的、利他的があります(他に相利的行動、いじわる行動もありますが省略)。
利他的行動は一見すると合理的には見えません。しかし、世の中には社会性を持ち、利他的行動を取る生物がいます。人間もそうです。
これらの生物が、あえて利他的行動を取るのはなぜか?言われてみると確かに不思議です。
利他的行動についてはいくつか説があり、
個人的には、人間の社会性に関して言えば、群選択より、互恵的利他の説明が一番しっくりきます。互恵的利他の考えに基づくと、Yahoo! 知恵袋の問いに対しては「将来的に自身の利益になると期待しているから」が答えですかね?
まあ、社会性の仕組みは追々明らかになっていくことでしょう。楽しみですね。
どうでも良いですが、この手の仮説は、立証が大変そうだと思いました。私には利他的行動で得る利益が何かすら定義できないし、どの個体がいくら利益を得ているか示す手段も思いつきません……。
メモ: 技術系の話はFacebookから転記しておくことにした。加筆修正した。
目次: マンガ紹介
Facebookで教えてもらったマンガ「ハコヅメ」を買ってみました。面白いです。次が楽しみです。
メモ: 趣味の話はFacebookから転記しておくことにした。
小型のHDMIディスプレイを買いました。ELECROWのLR10FHD01です。Amazonで1万円くらい。
買ったきっかけですけども、ROCK64のHDMI出力を見たかったことと、サーバのVGA出力が壊れたのか、今持っている小型VGAディスプレイが映らなくなってしまったため、代替品が欲しかったからです。
見ての通りスペックはそこそこ良く、価格もお安いです。その分、細かいところはいい加減です。
音量調整がバカでVolume 1でも近所迷惑なデカい音が鳴ります。しかも最大音量は100です。こんなバカでかい音で誰が使うんでしょう?ミュートにできることがせめてもの救いです。
OSDメニューはヘボいです。日本語が選択できますが、漢字は中国語の字体、訳が意味不明、ハングルが混ざるなど、やる気ゼロです。英語に変えた方がマシです。
HDMI入力もバグっていて、HDMI挿抜もしくは電源ON/OFFで画面表示が右にズレて、音が出なくなります。もう一度電源ON/OFFすると直ります……。
本体に型番が書いておらず、箱を捨ててしまうと型番が分からなくなります。
細かいところは手抜き感が漂いますが、映れば全て良しです。
メモ: 技術系の話はFacebookから転記しておくことにした。加筆した。
目次: マンガ紹介
お気に入りのマンガ紹介シリーズ。
最近読んだ、これからも続編が楽しみなマンガ10作品。並びは、あいうえお順です。
1〜5です。
6〜10です。
メモ: 趣味の話はFacebookから転記しておくことにした。
目次: ROCK64/ROCKPro64
先日購入したHDMIモニタのおかげで、ROCK64のI2S0つまりHDMI Audioの動作確認ができました。
しかし以前(2018年11月11日の日記参照)悩んでいた通り、単純にI2S0を有効にすることはできません。DMAチャネルが足りない問題が発生するためです。
ROCK64に搭載されているRockchip RK3328のDMACは、16のDMAチャネルを持っていますが、そのうち8chしか同時に使えない仕様になっています。
現在のlinux-nextのROCK64向けデバイスツリーでは、既に7chを使用(I2S1 2ch, SPDIF 1ch, SPI0 2ch, UART2 2ch)していますから、ここに2chを使用するI2S0を追加すると合計9chになって、オーバーしてしまいます。
仕方ないのでUART2のDMA割り当てを解除して、I2S0に割り当てるパッチを投稿しました。
私がパッチに書いた説明が悪かったのだと思いますが、メンテナーのHeikoさんから「どうしてUART2のDMAチャネルをI2S0が使えるのかわからない」という返事がきました。ですよね……私も最初意味不明でしたし。
できる限り説明を加えて返事しましたが、理解してもらえると良いな。
ややこしいことに、RK3328の仕様書を見ると、各DMAチャネルにはIDが(仕様書ではReq number)が振られていて、ぱっと見16チャネルが全て同時に使えそうに見えるんですよ。
この仕様書から「各DMAチャネルは独立しているけど、全てのチャネルが同時に使える訳ではない」という意味を読み取れる人はなかなかいないと思います。
少なくとも私はDMAのReq numberとチャネル数の関係を理解するのは無理だったので、DMACのドライバ(PL330)を追いかけました。
サウンド系からDMAチャネルの割り当てを要求するとき、次のような呼び出し関係になります。
rockchip_pcm_platform_register()
devm_snd_dmaengine_pcm_register()
snd_dmaengine_pcm_register()
dmaengine_pcm_request_chan_of()
dma_request_slave_channel_reason()
of_dma_request_slave_channel()
ofdma->of_dma_xlate() => of_dma_pl330_xlate()
dma_get_slave_channel()
dma_chan_get()
pl330_alloc_chan_resources()
pl330_request_channel()
まず、関数of_dma_pl330_xlate() にはローカル変数chan_idが登場します。これがDMAのIDに相当します。例えばUART2の送信側ならchan_id = 6になります。
元になる数字はどこから来るかというと、of_dma_match_channel() でデバイスツリーから情報を貰っています。RK3328の場合、デバイスツリーでDMAチャネルを指定する際は、Req numberを書くようです。
次に、関数pl330_request_channel() に構造体struct pl330_dmacのメンバーchannelsという配列が登場します。このchannelsの数がDMACのDMAチャネルの数と等しいです。Req numberとは無関係に、DMAチャネルを要求されると先頭から埋まっていきます。
こんな仕様が初見でわかる訳ないじゃない。むり。
メモ: 技術系の話はFacebookから転記しておくことにした。1節加筆。
目次: Linux
Linuxのクロックフレームワークで実装できるクロック分周器のドライバは2種類あります。
1つはinteger dividerで、入力されたクロック周波数の1/3や1/4など整数比の周波数で出力するハードウェアです。もう1つはfractional dividerで、周波数をx/yにするハードウェアです。
後者のfractional dividerドライバは、標準動作とカスタム動作のドライバが書けます。標準動作の場合、分子と分母に設定できる値に、何ら制約がないものとして動作します。カスタム動作のドライバは、特殊な制約のあるハードウェア向けです。
今のところカスタム動作のfractional dividerドライバを実装しているのはRockchipだけです。Rockchipの場合、分母が分子の20倍以上でなければ出力周波数が不安定になる制約があるようです。
Rockchipが変な仕様であることは間違いないと思いますが、Linuxに対応しているだけ、まだマシとも取れますね。世の中には「どうしてこうなった??」としか思えない、変な仕様のハードウェアがたくさん存在しますし……。
メモ: 技術系の話はFacebookから転記しておくことにした。
< | 2019 | > | ||||
<< | < | 01 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | - | - |
合計:
本日: