« OpenSL ES と XAudio2 | メイン

2017年04月07日

吉里吉里Z 開発:: AndroidでのCPU-GPU画像(メモリ)転送速度はロック時間を考えないと大差ない?

    

Android で CPU/GPU でメモリが分離しているのかどうかはわからないが、画面描画するのに必要なメモリ転送の時間の話。

1. SurfaceView の Surface を ANativeWindow_fromSurface で ANativeWindow 取得、ANativeWindow_lock - ANativeWindow_unlockAndPost で転送する。
2. glTexImage2D で転送する。
3. OpenGL ES 3.0 の PBO に転送する ( PBO-Tex は DMA と言うことでここでは気にしない)。

これらの方法を Nexus5 で計ってみたが、2と3は初回遅いものの2回目以降は早く、1は v-sink 待ちのためか lock 含むと 16ms くらいになるものの、lock 時間除くと他と大差ない。
当たり前と言えば当たり前かもしれないが、どの方法でも有意な速度差がないようだ。

他に、OpenGL の Texture から、SurfaceTexture -> Surface として、1と同様に転送する方法もあるはずだがそれほど差が出ないだろうと感じたので計っていない。

毎フレーム転送が発生する場合は、Optimizing Texture Transfers(pdf) にあるように、PBO をダブルバッファリングして転送待ちを減らすのが効果的なようだ。1フレーム遅れてしまうが。
また、PBO の場合、FrameBuffer へ直接転送することで、1番と同じようにダイレクトに描画することも可能なようだ。

結局 lock(busy) されている状態を回避して転送するのが速いようなので、PBO を使うのが良さそう。


投稿者 Takenori : 2017年04月07日 22:58




comments powered by Disqus
Total : Today : Yesterday : なかのひと