2017-04-17 2 views
0

私はスクリーンショットをキャプチャするためにOpenGLレンダリング方法を使用しています。しかし、NEXUS 7でピクセル情報を読み取るには7〜8秒かかります。私はこのコードを使用してピクセル情報を読み取り、ビットマップとして保存しています。OpenGLのスクリーンショットはAndroidであまりにも多くの時間を取っていますか?

public Bitmap grabPixels(GL10 mGL) { 

     final int mWidth = mViewWidth; 
     final int mHeight = mViewHeight; 

     IntBuffer ib = IntBuffer.allocate(mWidth * mHeight); 
     IntBuffer ibt = IntBuffer.allocate(mWidth * mHeight); 
     mGL.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); 

     for (int i = 0; i < mHeight; i++) { 
      for (int j = 0; j < mWidth; j++) { 
       ibt.put((mHeight - i - 1) * mWidth + j, ib.get(i * mWidth + j)); 
      } 
     } 

     Bitmap mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
     mBitmap.copyPixelsFromBuffer(ibt); 
     return mBitmap; 

} 

ピクセル情報の読み取り速度を上げてビットマップに変換するにはどうすればよいですか?あなたが別のスレッドにglReadPixels()を呼び出すことはできません

+0

時間のかかるコマンドを測定しましたか?ピクセルを読み込むか、ビットマップを保存しますか? – BDL

+0

@BDLビットマップの保存に時間がかかりすぎる 次のコードの実行に時間がかかり過ぎる - for(int i = 0; i

+0

私は「なぜアンドロイドに画像を保存するのに時間がかかるのですか?」という質問を編集し、OpenGL-esのすべてのものを無関係なものとして編集します。人々はすぐにOpenGLの知識が必要でないことをすぐに理解しているため、より高い関心を引くことができます。 (これは単なる推薦です) – BDL

答えて

0

I wrote another answer about saving GIFs on gamedev, which might be useful.

。しかし、大半の時間を費やすイメージを保存するプロセスは、(あなたが言ったように)最も可能性があります。そのような解決策は、別のスレッドで保存を行うことです。

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     ... save screenshot ... 
    } 
}).start(); 

誰もが私にピンホークで来ます。はいはい別のスレッドでglReadPixels()と呼ぶことができます。ただし、共有コンテキストが必要です。これは、eglCreateContext()を呼び出すときに指定できます。

EGLContext shared = ... 
EGLDisplay display = ... 
EGLConfig eglConfig = ... 

int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; 
EGLContext context = egl.eglCreateContext(display, eglConfig, shared, attrib_list); 

しかし、あなたは(自分自身の痛みすることができます)共有コンテキストに掘り始める前に、あなたのボトルネックは、それが最も可能性が高い画像を、保存されていないことを確認してください。

関連する問題