Multi-threaded OpenGL sharing context under Android (i)
Last Update:2017-05-23
Source: Internet
Author: User
<span id="Label3"></p><p><p>recently, using Java plugin for texture updates in research Unity3d development, The idea is simple to update the texture data in a Java thread, and then the textures in the unity scene will be updated automatically.</p></p><p><p>first, Create a Java class, define an interface to create textures and get texture parameters, and create OpenGL operations such as a single-thread pool for loading bitmap and binding texture Data. Java Code example:</p></p><pre><span style="color: #008080"><span style="color: #008080">1</span></span> <span style="color: #0000ff"><span style="color: #0000ff"></span> package</span><span style="color: #000000"><span style="color: #000000">com.thornbirds.unity;</span></span><span style="color: #008080"><span style="color: #008080">2</span></span> <span style="color: #008080"><span style="color: #008080">3</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">android.graphics.Bitmap;</span></span><span style="color: #008080"><span style="color: #008080">4</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">android.graphics.BitmapFactory;</span></span><span style="color: #008080"><span style="color: #008080">5</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">android.opengl.GLES11Ext;</span></span><span style="color: #008080"><span style="color: #008080">6</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">android.opengl.GLES20;</span></span><span style="color: #008080"><span style="color: #008080">7</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">android.opengl.GLUtils;</span></span><span style="color: #008080"><span style="color: #008080">8</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">android.util.Log;</span></span><span style="color: #008080"><span style="color: #008080">9</span></span> <span style="color: #008080"><span style="color: #008080">Ten</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">java.util.concurrent.ExecutorService;</span></span><span style="color: #008080"><span style="color: #008080"></span> one</span> <span style="color: #0000ff"><span style="color: #0000ff">Import</span></span><span style="color: #000000"><span style="color: #000000">java.util.concurrent.Executors;</span></span><span style="color: #008080"><span style="color: #008080"></span> a</span> <span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">class</span></span><span style="color: #000000"><span style="color: #000000">Plugintexture {</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Static</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Final</span></span>String TAG = "plugintexture"<span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span>Mtextureid = 0<span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span>Mtexturewidth = 0<span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span>Mtextureheight = 0<span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #008080"><span style="color: #008080"></span> +</span> <span style="color: #008000"><span style="color: #008000">//</span></span><span style="color: #008000"><span style="color: #008000">Create a single thread pool for processing OpenGL textures</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Final</span></span>Executorservice Mrenderthread =<span style="color: #000000"><span style="color: #000000">Executors.newsinglethreadexecutor ();</span></span><span style="color: #008080"><span style="color: #008080"></span> +</span> <span style="color: #008080"><span style="color: #008080"></span> a</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span><span style="color: #000000"><span style="color: #000000">getstreamtexturewidth () {</span></span><span style="color: #008080"><span style="color: #008080"></span> at</span> <span style="color: #0000ff"><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="color: #000000">mtexturewidth;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span><span style="color: #000000"><span style="color: #000000">getstreamtextureheight () {</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="color: #000000">mtextureheight;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> in</span> <span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span><span style="color: #000000"><span style="color: #000000">Getstreamtextureid () {</span></span><span style="color: #008080"><span style="color: #008080"></span> to</span> <span style="color: #0000ff"><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="color: #000000">mtextureid;</span></span><span style="color: #008080"><span style="color: #008080"></span> +</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span><span style="color: #000000"><span style="color: #000000">plugintexture () {</span></span><span style="color: #008080"><span style="color: #008080"></span> *</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> $</span> <span style="color: #008080"><span style="color: #008080">Panax Notoginseng</span></span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">void</span></span><span style="color: #000000"><span style="color: #000000">Setupopengl () {</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>Mrenderthread.execute (<span style="color: #0000ff"><span style="color: #0000ff">New</span></span><span style="color: #000000"><span style="color: #000000">Runnable () {</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #000000"><span style="color: #000000">@Override</span></span><span style="color: #008080"><span style="color: #008080"></span> +</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">void</span></span><span style="color: #000000"><span style="color: #000000">Run () {</span></span><span style="color: #008080"><span style="color: #008080"></span> a</span> <span style="color: #008000"><span style="color: #008000">//</span></span><span style="color: #008000"><span style="color: #008000">generate OpenGL Texture ID</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span>textures[] =<span style="color: #0000ff"><span style="color: #0000ff">New</span></span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span>[1<span style="color: #000000"><span style="color: #000000">];</span></span><span style="color: #008080"><span style="color: #008080"></span> +</span>Gles20.glgentextures (1, textures, 0<span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">if</span></span>(textures[0] = = 0<span style="color: #000000"><span style="color: #000000">) {</span></span><span style="color: #008080"><span style="color: #008080"></span> $</span>LOG.E (TAG, "glgentextures failed"<span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> $</span> <span style="color: #0000ff"><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>Mtextureid = Textures[0<span style="color: #000000"><span style="color: #000000">];</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span>Mtexturewidth = 640<span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>Mtextureheight = 360<span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080">Wuyi</span></span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #000000"><span style="color: #000000"> });</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> wu</span> <span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">void</span></span><span style="color: #000000"><span style="color: #000000">updatetexture () {</span></span><span style="color: #008080"><span style="color: #008080"></span> about</span>Mrenderthread.execute (<span style="color: #0000ff"><span style="color: #0000ff">New</span></span><span style="color: #000000"><span style="color: #000000">Runnable () {</span></span><span style="color: #008080"><span style="color: #008080"></span> $</span> <span style="color: #000000"><span style="color: #000000">@Override</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">void</span></span><span style="color: #000000"><span style="color: #000000">Run () {</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>String Imagefilepath = "/sdcard/test/image.png"<span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">Final</span></span>Bitmap Bitmap =<span style="color: #000000"><span style="color: #000000">bitmapfactory.decodefile (imagefilepath);</span></span><span style="color: #008080"><span style="color: #008080"></span> a</span> <span style="color: #008080"><span style="color: #008080"></span> +</span> <span style="color: #000000"><span style="color: #000000">gles20.glbindtexture (gles20.gl_texture_2d, mtextureid);</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #000000"><span style="color: #000000">gles20.gltexparameteri (gles11ext.gl_texture_external_oes, gles20.gl_texture_min_filter, GLES20.GL_NEAR EST);</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000">gles20.gltexparameteri (gles11ext.gl_texture_external_oes, gles20.gl_texture_mag_filter, GLES20.GL_NEAR EST);</span></span><span style="color: #008080"><span style="color: #008080"></span> $</span>Glutils.teximage2d (gles20.gl_texture_2d, 0, bitmap, 0<span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span>Gles20.glbindtexture (gles20.gl_texture_2d, 0<span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #000000"><span style="color: #000000">bitmap.recycle ();</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000"> });</span></span><span style="color: #008080"><span style="color: #008080"></span> in</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">void</span></span><span style="color: #000000"><span style="color: #000000">Destroy () {</span></span><span style="color: #008080"><span style="color: #008080"></span> about</span> <span style="color: #000000"><span style="color: #000000">Mrenderthread.shutdownnow ();</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span>}</pre><p><p>then, Create a C # script, Instantiate the Java object in the script, and invoke the Java method to initialize opengl; to show the updated texture, you need to get the texture ID generated by Java and bind it to the current gameobject of the Script. C # code Example:</p></p><pre><span style="color: #008080"><span style="color: #008080">1</span></span> <span style="color: #0000ff"><span style="color: #0000ff"></span> public</span> <span style="color: #0000ff"><span style="color: #0000ff">class</span></span><span style="color: #000000"><span style="color: #000000">Plugintesturedemo:monobehaviour {</span></span><span style="color: #008080"><span style="color: #008080">2</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span><span style="color: #000000"><span style="color: #000000">Androidjavaobject mplugintexture;</span></span><span style="color: #008080"><span style="color: #008080">3</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span><span style="color: #000000"><span style="color: #000000">mtextureid;</span></span><span style="color: #008080"><span style="color: #008080">4</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span><span style="color: #000000"><span style="color: #000000">mwidth;</span></span><span style="color: #008080"><span style="color: #008080">5</span></span> <span style="color: #0000ff"><span style="color: #0000ff">Private</span></span> <span style="color: #0000ff"><span style="color: #0000ff">int</span></span><span style="color: #000000"><span style="color: #000000">mheight;</span></span><span style="color: #008080"><span style="color: #008080">6</span></span> <span style="color: #008080"><span style="color: #008080">7</span></span> <span style="color: #0000ff"><span style="color: #0000ff">void</span></span><span style="color: #000000"><span style="color: #000000">Start () {</span></span><span style="color: #008080"><span style="color: #008080">8</span></span> <span style="color: #008000"><span style="color: #008000">//</span></span><span style="color: #008000"><span style="color: #008000">instantiating an object of the Com.thornbirds.unity.PluginTexture class</span></span><span style="color: #008080"><span style="color: #008080">9</span></span>Mplugintexture =<span style="color: #0000ff"><span style="color: #0000ff">New</span></span>Androidjavaobject (<span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #800000"><span style="color: #800000">com.thornbirds.unity.PluginTexture</span></span><span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080">Ten</span></span> <span style="color: #008000"><span style="color: #008000">//</span></span><span style="color: #008000"><span style="color: #008000">initializing OpenGL</span></span><span style="color: #008080"><span style="color: #008080"></span> one</span>Mplugintexture.call (<span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #800000"><span style="color: #800000">Setupopengl</span></span><span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> a</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">void</span></span><span style="color: #000000"><span style="color: #000000">bindtexture () {</span></span><span style="color: #008080"><span style="color: #008080"></span> the</span> <span style="color: #008000"><span style="color: #008000">//</span></span><span style="color: #008000"><span style="color: #008000">gets the javaplugin generated texture ID</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>Mtextureid = mplugintexture.call<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>> (<span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #800000"><span style="color: #800000">Getplugintextureid</span></span><span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #0000ff"><span style="color: #0000ff">if</span></span>(mtextureid = =<span style="color: #800080"><span style="color: #800080">0</span></span><span style="color: #000000"><span style="color: #000000">) {</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>Debug.logerror (<span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #800000"><span style="color: #800000">Getplugintextureid failed</span></span><span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> +</span> <span style="color: #0000ff"><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="color: #000000">;</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> +</span>Mwidth = mplugintexture.call<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>> (<span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #800000"><span style="color: #800000">Getplugintexturewidth</span></span><span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> a</span>Mheight = mplugintexture.call<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>> (<span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #800000"><span style="color: #800000">Getplugintextureheight</span></span><span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> at</span> <span style="color: #008000"><span style="color: #008000">//</span></span><span style="color: #008000"><span style="color: #008000">binds the texture ID to the current gameobject</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>getcomponent<meshrenderer> (). material.maintexture =<span style="color: #000000"><span style="color: #000000">texture2d.createexternaltexture</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>(mwidth, mheight, textureformat.argb32,<span style="color: #0000ff"><span style="color: #0000ff">false</span></span>,<span style="color: #0000ff"><span style="color: #0000ff">false</span></span><span style="color: #000000"><span style="color: #000000">, (IntPtr) mtextureid);</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #008000"><span style="color: #008000">//</span></span><span style="color: #008000"><span style="color: #008000">Update texture Data</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span>Mplugintexture.call (<span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #800000"><span style="color: #800000">updatetexture</span></span><span style="color: #800000"><span style="color: #800000">"</span></span><span style="color: #000000"><span style="color: #000000">);</span></span><span style="color: #008080"><span style="color: #008080"></span> -</span> <span style="color: #000000"><span style="color: #000000"> }</span></span><span style="color: #008080"><span style="color: #008080"></span> in</span>}</pre><p><p>Note: the Java method is called in C # using the method name, so it is necessary to prevent the Java class and its public methods from being confused when compiling the jar Package. Add the following code to the Proguard file:</p></p><pre><pre><span style="color: #008080">1</span> <span style="color: #0000ff">class</span> <span style="color: #000000">com.thornbirds.unity.PluginTexture {</span><span style="color: #008080">2</span>public *<span style="color: #000000">;</span> <span style="color: #008080">3</span> }</pre></pre><p><p>There is a problem with this scenario, in the Java thread access to OpenGL operation, will be reported missing glcontext, need to initialize the OpenGL drawing environment for Java THREAD. Continue Next.</p></p><p><p></p></p><p><p>Multi-threaded OpenGL sharing context under Android (i)</p></p></span>