找回密码
 立即注册
首页 业界区 业界 【Android】基于SurfaceControlViewHost实现跨进程渲染 ...

【Android】基于SurfaceControlViewHost实现跨进程渲染

毋峻舷 4 天前
1 前言

​    本文将介绍基于 SurfaceControlViewHost 实现跨进程渲染普通 View 和 GlSurfaceView,力求用最简单的 Demo,介绍 SurfaceControlViewHost 的应用,方便读者轻松扣出核心代码应用到自己的业务中。
​    核心代码片段如下。
​    1)服务端
  1. public SurfaceControlViewHost.SurfacePackage getSurfacePackage(int displayId, IBinder hostToken, int width, int height) {
  2.     // 创建SurfaceControlViewHost
  3.     Display display = mContext.getSystemService(DisplayManager.class).getDisplay(displayId);
  4.     mSurfaceControlViewHost = new SurfaceControlViewHost(mContext, display, hostToken);
  5.     // 创建要渲染的View
  6.     mView = new CustomView(mContext);
  7.     // 将View附加到SurfaceControlViewHost
  8.     mSurfaceControlViewHost.setView(mView, width, height);
  9.     SurfacePackage surfacePackage = mSurfaceControlViewHost.getSurfacePackage();
  10.     return surfacePackage;
  11. }
复制代码
​    2)客户端
  1. IBinder hostToken = mSurfaceView.getHostToken();
  2. SurfaceControlViewHost.SurfacePackage surfacePackage = mRemoteRender.getSurfacePackage(0, hostToken, 1000, 2000);
  3. mSurfaceView.setChildSurfacePackage(surfacePackage);
复制代码
​    本文案例项目结构如下,完整资源见 → 基于SurfaceControlViewHost实现跨进程渲染。
1.png

2 AIDL 配置

​    Android 跨进程通信可以使用 AIDL 或 messenger,它们本质都是 Binder,本文使用 AIDL 实现跨进程通信。
​    1)aidl 文件
  1. // IRemoteRender.aidl
  2. package com.zhyan8.remoterender;
  3. import android.view.SurfaceControlViewHost.SurfacePackage;
  4. import android.os.IBinder;
  5. interface IRemoteRender {
  6.     SurfacePackage getSurfacePackage(int displayId, IBinder hostToken, int width, int height);
  7. }
复制代码
​    2)gradle 配置
  1. sourceSets {
  2.     main {
  3. <queries>
  4.     <package android:name="com.zhyan8.service" />
  5.     <package android:name="com.zhyan8.glservice" />
  6. </queries>aidl.srcDirs = ['src/main/aidl']
  7.     }
  8. }
  9. buildFeatures.aidl true
复制代码
​    3)manifest 配置
​    客户端配置如下。
  1. <queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries>
复制代码
​    服务端配置如下。
  1. <queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries><queries>
  5.     <package android:name="com.zhyan8.service" />
  6.     <package android:name="com.zhyan8.glservice" />
  7. </queries><queries>
  8.     <package android:name="com.zhyan8.service" />
  9.     <package android:name="com.zhyan8.glservice" />
  10. </queries><queries>
  11.     <package android:name="com.zhyan8.service" />
  12.     <package android:name="com.zhyan8.glservice" />
  13. </queries>
复制代码
3 客户端

​    MainActivity.java
  1. package com.zhyan8.client;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import android.view.SurfaceControlViewHost.SurfacePackage;import android.view.SurfaceView;import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.zhyan8.remoterender.IRemoteRender;public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    private IRemoteRender mRemoteRender;    private IBinder mService;    private SurfaceView mSurfaceView;    @Override    protected void onCreate(Bundle savedInstanceState) {<queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries>super.onCreate(savedInstanceState);<queries>
  5.     <package android:name="com.zhyan8.service" />
  6.     <package android:name="com.zhyan8.glservice" />
  7. </queries>setContentView(R.layout.activity_main);<queries>
  8.     <package android:name="com.zhyan8.service" />
  9.     <package android:name="com.zhyan8.glservice" />
  10. </queries>mSurfaceView = findViewById(R.id.surface_view);<queries>
  11.     <package android:name="com.zhyan8.service" />
  12.     <package android:name="com.zhyan8.glservice" />
  13. </queries>startService();    }    public void onClickDraw(View view) {<queries>
  14.     <package android:name="com.zhyan8.service" />
  15.     <package android:name="com.zhyan8.glservice" />
  16. </queries>try {<queries>
  17.     <package android:name="com.zhyan8.service" />
  18.     <package android:name="com.zhyan8.glservice" />
  19. </queries>    IBinder hostToken = mSurfaceView.getHostToken();<queries>
  20.     <package android:name="com.zhyan8.service" />
  21.     <package android:name="com.zhyan8.glservice" />
  22. </queries>    SurfacePackage surfacePackage = mRemoteRender.getSurfacePackage(0, hostToken, 1000, 2000);<queries>
  23.     <package android:name="com.zhyan8.service" />
  24.     <package android:name="com.zhyan8.glservice" />
  25. </queries>    mSurfaceView.setChildSurfacePackage(surfacePackage);<queries>
  26.     <package android:name="com.zhyan8.service" />
  27.     <package android:name="com.zhyan8.glservice" />
  28. </queries>} catch (RemoteException e) {<queries>
  29.     <package android:name="com.zhyan8.service" />
  30.     <package android:name="com.zhyan8.glservice" />
  31. </queries>    e.printStackTrace();<queries>
  32.     <package android:name="com.zhyan8.service" />
  33.     <package android:name="com.zhyan8.glservice" />
  34. </queries>}    }    @Override    protected void onDestroy() {<queries>
  35.     <package android:name="com.zhyan8.service" />
  36.     <package android:name="com.zhyan8.glservice" />
  37. </queries>super.onDestroy();<queries>
  38.     <package android:name="com.zhyan8.service" />
  39.     <package android:name="com.zhyan8.glservice" />
  40. </queries>unbindService(mConnection);    }    private void startService() {<queries>
  41.     <package android:name="com.zhyan8.service" />
  42.     <package android:name="com.zhyan8.glservice" />
  43. </queries>Log.d(TAG, "startService");<queries>
  44.     <package android:name="com.zhyan8.service" />
  45.     <package android:name="com.zhyan8.glservice" />
  46. </queries>Intent intent = new Intent("com.zhyan8.remoterender.IRemoteRender");<queries>
  47.     <package android:name="com.zhyan8.service" />
  48.     <package android:name="com.zhyan8.glservice" />
  49. </queries>//intent.setPackage("com.zhyan8.service"); // 渲染普通View的服务<queries>
  50.     <package android:name="com.zhyan8.service" />
  51.     <package android:name="com.zhyan8.glservice" />
  52. </queries>intent.setPackage("com.zhyan8.glservice"); // 基于OpenGL ES渲染的服务<queries>
  53.     <package android:name="com.zhyan8.service" />
  54.     <package android:name="com.zhyan8.glservice" />
  55. </queries>bindService(intent, mConnection, Context.BIND_AUTO_CREATE);    }    private void clearBind() {<queries>
  56.     <package android:name="com.zhyan8.service" />
  57.     <package android:name="com.zhyan8.glservice" />
  58. </queries>Log.d(TAG, "clearBind");<queries>
  59.     <package android:name="com.zhyan8.service" />
  60.     <package android:name="com.zhyan8.glservice" />
  61. </queries>if (mService != null) {<queries>
  62.     <package android:name="com.zhyan8.service" />
  63.     <package android:name="com.zhyan8.glservice" />
  64. </queries>    mService.unlinkToDeath(mDeathRecipient, 0);<queries>
  65.     <package android:name="com.zhyan8.service" />
  66.     <package android:name="com.zhyan8.glservice" />
  67. </queries>}<queries>
  68.     <package android:name="com.zhyan8.service" />
  69.     <package android:name="com.zhyan8.glservice" />
  70. </queries>mRemoteRender = null;<queries>
  71.     <package android:name="com.zhyan8.service" />
  72.     <package android:name="com.zhyan8.glservice" />
  73. </queries>mService = null;    }    private ServiceConnection mConnection = new ServiceConnection() {<queries>
  74.     <package android:name="com.zhyan8.service" />
  75.     <package android:name="com.zhyan8.glservice" />
  76. </queries>@Override<queries>
  77.     <package android:name="com.zhyan8.service" />
  78.     <package android:name="com.zhyan8.glservice" />
  79. </queries>public void onServiceConnected(ComponentName name, IBinder service) {<queries>
  80.     <package android:name="com.zhyan8.service" />
  81.     <package android:name="com.zhyan8.glservice" />
  82. </queries>    Log.d(TAG, "onServiceConnected");<queries>
  83.     <package android:name="com.zhyan8.service" />
  84.     <package android:name="com.zhyan8.glservice" />
  85. </queries>    mRemoteRender = IRemoteRender.Stub.asInterface(service);<queries>
  86.     <package android:name="com.zhyan8.service" />
  87.     <package android:name="com.zhyan8.glservice" />
  88. </queries>    mService = service;<queries>
  89.     <package android:name="com.zhyan8.service" />
  90.     <package android:name="com.zhyan8.glservice" />
  91. </queries>    try {<queries>
  92.     <package android:name="com.zhyan8.service" />
  93.     <package android:name="com.zhyan8.glservice" />
  94. </queries><queries>
  95.     <package android:name="com.zhyan8.service" />
  96.     <package android:name="com.zhyan8.glservice" />
  97. </queries>mService.linkToDeath(mDeathRecipient, 0);<queries>
  98.     <package android:name="com.zhyan8.service" />
  99.     <package android:name="com.zhyan8.glservice" />
  100. </queries>    } catch (RemoteException e) {<queries>
  101.     <package android:name="com.zhyan8.service" />
  102.     <package android:name="com.zhyan8.glservice" />
  103. </queries><queries>
  104.     <package android:name="com.zhyan8.service" />
  105.     <package android:name="com.zhyan8.glservice" />
  106. </queries>Log.e(TAG, "e=" + e.getMessage());<queries>
  107.     <package android:name="com.zhyan8.service" />
  108.     <package android:name="com.zhyan8.glservice" />
  109. </queries>    }<queries>
  110.     <package android:name="com.zhyan8.service" />
  111.     <package android:name="com.zhyan8.glservice" />
  112. </queries>}<queries>
  113.     <package android:name="com.zhyan8.service" />
  114.     <package android:name="com.zhyan8.glservice" />
  115. </queries>@Override<queries>
  116.     <package android:name="com.zhyan8.service" />
  117.     <package android:name="com.zhyan8.glservice" />
  118. </queries>public void onServiceDisconnected(ComponentName name) {<queries>
  119.     <package android:name="com.zhyan8.service" />
  120.     <package android:name="com.zhyan8.glservice" />
  121. </queries>    Log.d(TAG, "onServiceDisconnected");<queries>
  122.     <package android:name="com.zhyan8.service" />
  123.     <package android:name="com.zhyan8.glservice" />
  124. </queries>    clearBind();<queries>
  125.     <package android:name="com.zhyan8.service" />
  126.     <package android:name="com.zhyan8.glservice" />
  127. </queries>}    };    private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {<queries>
  128.     <package android:name="com.zhyan8.service" />
  129.     <package android:name="com.zhyan8.glservice" />
  130. </queries>@Override<queries>
  131.     <package android:name="com.zhyan8.service" />
  132.     <package android:name="com.zhyan8.glservice" />
  133. </queries>public void binderDied() {<queries>
  134.     <package android:name="com.zhyan8.service" />
  135.     <package android:name="com.zhyan8.glservice" />
  136. </queries>    Log.d(TAG, "binderDied");<queries>
  137.     <package android:name="com.zhyan8.service" />
  138.     <package android:name="com.zhyan8.glservice" />
  139. </queries>    clearBind();<queries>
  140.     <package android:name="com.zhyan8.service" />
  141.     <package android:name="com.zhyan8.glservice" />
  142. </queries>}    };}
复制代码
​    activity_main.xml
  1. <queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries>
复制代码
4 跨进程渲染普通 View

​    RemoteRenderService.java
  1. package com.zhyan8.service;import android.app.Service;import android.content.Context;import android.content.Intent;import android.hardware.display.DisplayManager;import android.os.Handler;import android.os.IBinder;import android.os.Looper;import android.util.Log;import android.view.Display;import android.view.SurfaceControlViewHost;import android.view.SurfaceControlViewHost.SurfacePackage;import android.view.ViewGroup;import android.widget.ImageView;import com.zhyan8.remoterender.IRemoteRender;import java.util.concurrent.CountDownLatch;public class RemoteRenderService extends Service {    private static final String TAG = "RemoteRenderService";    private SurfaceControlViewHost mSurfaceControlViewHost;    private ImageView mImageView;    private Handler mHandler = new Handler(Looper.getMainLooper());    @Override    public void onCreate() {<queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries>super.onCreate();<queries>
  5.     <package android:name="com.zhyan8.service" />
  6.     <package android:name="com.zhyan8.glservice" />
  7. </queries>Log.i(TAG, "onCreate");    }    @Override    public IBinder onBind(Intent intent) {<queries>
  8.     <package android:name="com.zhyan8.service" />
  9.     <package android:name="com.zhyan8.glservice" />
  10. </queries>Log.i(TAG, "onBind");<queries>
  11.     <package android:name="com.zhyan8.service" />
  12.     <package android:name="com.zhyan8.glservice" />
  13. </queries>return mBinder;    }    @Override    public void onDestroy() {<queries>
  14.     <package android:name="com.zhyan8.service" />
  15.     <package android:name="com.zhyan8.glservice" />
  16. </queries>super.onDestroy();<queries>
  17.     <package android:name="com.zhyan8.service" />
  18.     <package android:name="com.zhyan8.glservice" />
  19. </queries>Log.i(TAG, "onDestroy");<queries>
  20.     <package android:name="com.zhyan8.service" />
  21.     <package android:name="com.zhyan8.glservice" />
  22. </queries>if (mSurfaceControlViewHost != null) {<queries>
  23.     <package android:name="com.zhyan8.service" />
  24.     <package android:name="com.zhyan8.glservice" />
  25. </queries>    mSurfaceControlViewHost.release();<queries>
  26.     <package android:name="com.zhyan8.service" />
  27.     <package android:name="com.zhyan8.glservice" />
  28. </queries>}    }    private final IRemoteRender.Stub mBinder = new IRemoteRender.Stub() {<queries>
  29.     <package android:name="com.zhyan8.service" />
  30.     <package android:name="com.zhyan8.glservice" />
  31. </queries>@Override<queries>
  32.     <package android:name="com.zhyan8.service" />
  33.     <package android:name="com.zhyan8.glservice" />
  34. </queries>public SurfacePackage getSurfacePackage(int displayId, IBinder hostToken, int width, int height) {<queries>
  35.     <package android:name="com.zhyan8.service" />
  36.     <package android:name="com.zhyan8.glservice" />
  37. </queries>    Log.i(TAG, "getSurfacePackage, displayId=" + displayId + ", hostToken=" + hostToken + ", width=" + width + ", height=" + height);<queries>
  38.     <package android:name="com.zhyan8.service" />
  39.     <package android:name="com.zhyan8.glservice" />
  40. </queries>    final SurfacePackage[] result = new SurfaceControlViewHost.SurfacePackage[1];<queries>
  41.     <package android:name="com.zhyan8.service" />
  42.     <package android:name="com.zhyan8.glservice" />
  43. </queries>    final CountDownLatch latch = new CountDownLatch(1);<queries>
  44.     <package android:name="com.zhyan8.service" />
  45.     <package android:name="com.zhyan8.glservice" />
  46. </queries>    mHandler.post( () -> {<queries>
  47.     <package android:name="com.zhyan8.service" />
  48.     <package android:name="com.zhyan8.glservice" />
  49. </queries><queries>
  50.     <package android:name="com.zhyan8.service" />
  51.     <package android:name="com.zhyan8.glservice" />
  52. </queries>// 创建SurfaceControlViewHost<queries>
  53.     <package android:name="com.zhyan8.service" />
  54.     <package android:name="com.zhyan8.glservice" />
  55. </queries><queries>
  56.     <package android:name="com.zhyan8.service" />
  57.     <package android:name="com.zhyan8.glservice" />
  58. </queries>Context context = getBaseContext();<queries>
  59.     <package android:name="com.zhyan8.service" />
  60.     <package android:name="com.zhyan8.glservice" />
  61. </queries><queries>
  62.     <package android:name="com.zhyan8.service" />
  63.     <package android:name="com.zhyan8.glservice" />
  64. </queries>Display display = context.getSystemService(DisplayManager.class).getDisplay(displayId);<queries>
  65.     <package android:name="com.zhyan8.service" />
  66.     <package android:name="com.zhyan8.glservice" />
  67. </queries><queries>
  68.     <package android:name="com.zhyan8.service" />
  69.     <package android:name="com.zhyan8.glservice" />
  70. </queries>mSurfaceControlViewHost = new SurfaceControlViewHost(context, display, hostToken);<queries>
  71.     <package android:name="com.zhyan8.service" />
  72.     <package android:name="com.zhyan8.glservice" />
  73. </queries><queries>
  74.     <package android:name="com.zhyan8.service" />
  75.     <package android:name="com.zhyan8.glservice" />
  76. </queries>// 创建要渲染的内容<queries>
  77.     <package android:name="com.zhyan8.service" />
  78.     <package android:name="com.zhyan8.glservice" />
  79. </queries><queries>
  80.     <package android:name="com.zhyan8.service" />
  81.     <package android:name="com.zhyan8.glservice" />
  82. </queries>mImageView = new ImageView(RemoteRenderService.this);<queries>
  83.     <package android:name="com.zhyan8.service" />
  84.     <package android:name="com.zhyan8.glservice" />
  85. </queries><queries>
  86.     <package android:name="com.zhyan8.service" />
  87.     <package android:name="com.zhyan8.glservice" />
  88. </queries>mImageView.setLayoutParams(new ViewGroup.LayoutParams(width, height));<queries>
  89.     <package android:name="com.zhyan8.service" />
  90.     <package android:name="com.zhyan8.glservice" />
  91. </queries><queries>
  92.     <package android:name="com.zhyan8.service" />
  93.     <package android:name="com.zhyan8.glservice" />
  94. </queries>mImageView.setScaleType(ImageView.ScaleType.FIT_XY);<queries>
  95.     <package android:name="com.zhyan8.service" />
  96.     <package android:name="com.zhyan8.glservice" />
  97. </queries><queries>
  98.     <package android:name="com.zhyan8.service" />
  99.     <package android:name="com.zhyan8.glservice" />
  100. </queries>mImageView.setImageResource(R.drawable.girl);<queries>
  101.     <package android:name="com.zhyan8.service" />
  102.     <package android:name="com.zhyan8.glservice" />
  103. </queries><queries>
  104.     <package android:name="com.zhyan8.service" />
  105.     <package android:name="com.zhyan8.glservice" />
  106. </queries>// 将视图附加到SurfaceControlViewHost<queries>
  107.     <package android:name="com.zhyan8.service" />
  108.     <package android:name="com.zhyan8.glservice" />
  109. </queries><queries>
  110.     <package android:name="com.zhyan8.service" />
  111.     <package android:name="com.zhyan8.glservice" />
  112. </queries>mSurfaceControlViewHost.setView(mImageView, width, height);<queries>
  113.     <package android:name="com.zhyan8.service" />
  114.     <package android:name="com.zhyan8.glservice" />
  115. </queries><queries>
  116.     <package android:name="com.zhyan8.service" />
  117.     <package android:name="com.zhyan8.glservice" />
  118. </queries>result[0] = mSurfaceControlViewHost.getSurfacePackage();<queries>
  119.     <package android:name="com.zhyan8.service" />
  120.     <package android:name="com.zhyan8.glservice" />
  121. </queries><queries>
  122.     <package android:name="com.zhyan8.service" />
  123.     <package android:name="com.zhyan8.glservice" />
  124. </queries>latch.countDown();<queries>
  125.     <package android:name="com.zhyan8.service" />
  126.     <package android:name="com.zhyan8.glservice" />
  127. </queries>    });<queries>
  128.     <package android:name="com.zhyan8.service" />
  129.     <package android:name="com.zhyan8.glservice" />
  130. </queries>    try {<queries>
  131.     <package android:name="com.zhyan8.service" />
  132.     <package android:name="com.zhyan8.glservice" />
  133. </queries><queries>
  134.     <package android:name="com.zhyan8.service" />
  135.     <package android:name="com.zhyan8.glservice" />
  136. </queries>latch.await(); // 等待主线程完成操作<queries>
  137.     <package android:name="com.zhyan8.service" />
  138.     <package android:name="com.zhyan8.glservice" />
  139. </queries><queries>
  140.     <package android:name="com.zhyan8.service" />
  141.     <package android:name="com.zhyan8.glservice" />
  142. </queries>return result[0];<queries>
  143.     <package android:name="com.zhyan8.service" />
  144.     <package android:name="com.zhyan8.glservice" />
  145. </queries>    } catch (InterruptedException e) {<queries>
  146.     <package android:name="com.zhyan8.service" />
  147.     <package android:name="com.zhyan8.glservice" />
  148. </queries><queries>
  149.     <package android:name="com.zhyan8.service" />
  150.     <package android:name="com.zhyan8.glservice" />
  151. </queries>Log.i(TAG, "getSurfacePackage, e=" + e.getMessage());<queries>
  152.     <package android:name="com.zhyan8.service" />
  153.     <package android:name="com.zhyan8.glservice" />
  154. </queries>    }<queries>
  155.     <package android:name="com.zhyan8.service" />
  156.     <package android:name="com.zhyan8.glservice" />
  157. </queries>    return null;<queries>
  158.     <package android:name="com.zhyan8.service" />
  159.     <package android:name="com.zhyan8.glservice" />
  160. </queries>}    };}
复制代码
​    运行效果如下。
2.png

5 跨进程渲染 GLSurfaceView

​    RemoteGLRenderService.java
  1. package com.zhyan8.glservice;import android.app.Service;import android.content.Context;import android.content.Intent;import android.hardware.display.DisplayManager;import android.opengl.GLSurfaceView;import android.os.Handler;import android.os.IBinder;import android.os.Looper;import android.util.Log;import android.view.Display;import android.view.SurfaceControlViewHost;import android.view.SurfaceControlViewHost.SurfacePackage;import android.view.ViewGroup;import com.zhyan8.remoterender.IRemoteRender;import java.util.concurrent.CountDownLatch;public class RemoteGLRenderService extends Service {    private static final String TAG = "RemoteGLRenderService";    private SurfaceControlViewHost mSurfaceControlViewHost;    private GLSurfaceView mGLSurfaceView;    private Handler mHandler = new Handler(Looper.getMainLooper());    @Override    public void onCreate() {<queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries>super.onCreate();<queries>
  5.     <package android:name="com.zhyan8.service" />
  6.     <package android:name="com.zhyan8.glservice" />
  7. </queries>Log.i(TAG, "onCreate");    }    @Override    public IBinder onBind(Intent intent) {<queries>
  8.     <package android:name="com.zhyan8.service" />
  9.     <package android:name="com.zhyan8.glservice" />
  10. </queries>Log.i(TAG, "onBind");<queries>
  11.     <package android:name="com.zhyan8.service" />
  12.     <package android:name="com.zhyan8.glservice" />
  13. </queries>return mBinder;    }    @Override    public void onDestroy() {<queries>
  14.     <package android:name="com.zhyan8.service" />
  15.     <package android:name="com.zhyan8.glservice" />
  16. </queries>Log.i(TAG, "onDestroy");<queries>
  17.     <package android:name="com.zhyan8.service" />
  18.     <package android:name="com.zhyan8.glservice" />
  19. </queries>super.onDestroy();<queries>
  20.     <package android:name="com.zhyan8.service" />
  21.     <package android:name="com.zhyan8.glservice" />
  22. </queries>if (mSurfaceControlViewHost != null) {<queries>
  23.     <package android:name="com.zhyan8.service" />
  24.     <package android:name="com.zhyan8.glservice" />
  25. </queries>    mSurfaceControlViewHost.release();<queries>
  26.     <package android:name="com.zhyan8.service" />
  27.     <package android:name="com.zhyan8.glservice" />
  28. </queries>}    }    private final IRemoteRender.Stub mBinder = new IRemoteRender.Stub() {<queries>
  29.     <package android:name="com.zhyan8.service" />
  30.     <package android:name="com.zhyan8.glservice" />
  31. </queries>@Override<queries>
  32.     <package android:name="com.zhyan8.service" />
  33.     <package android:name="com.zhyan8.glservice" />
  34. </queries>public SurfacePackage getSurfacePackage(int displayId, IBinder hostToken, int width, int height) {<queries>
  35.     <package android:name="com.zhyan8.service" />
  36.     <package android:name="com.zhyan8.glservice" />
  37. </queries>    Log.i(TAG, "getSurfacePackage, displayId=" + displayId + ", hostToken=" + hostToken + ", width=" + width + ", height=" + height);<queries>
  38.     <package android:name="com.zhyan8.service" />
  39.     <package android:name="com.zhyan8.glservice" />
  40. </queries>    final SurfacePackage[] result = new SurfaceControlViewHost.SurfacePackage[1];<queries>
  41.     <package android:name="com.zhyan8.service" />
  42.     <package android:name="com.zhyan8.glservice" />
  43. </queries>    final CountDownLatch latch = new CountDownLatch(1);<queries>
  44.     <package android:name="com.zhyan8.service" />
  45.     <package android:name="com.zhyan8.glservice" />
  46. </queries>    mHandler.post( () -> {<queries>
  47.     <package android:name="com.zhyan8.service" />
  48.     <package android:name="com.zhyan8.glservice" />
  49. </queries><queries>
  50.     <package android:name="com.zhyan8.service" />
  51.     <package android:name="com.zhyan8.glservice" />
  52. </queries>// 创建SurfaceControlViewHost<queries>
  53.     <package android:name="com.zhyan8.service" />
  54.     <package android:name="com.zhyan8.glservice" />
  55. </queries><queries>
  56.     <package android:name="com.zhyan8.service" />
  57.     <package android:name="com.zhyan8.glservice" />
  58. </queries>Context context = getBaseContext();<queries>
  59.     <package android:name="com.zhyan8.service" />
  60.     <package android:name="com.zhyan8.glservice" />
  61. </queries><queries>
  62.     <package android:name="com.zhyan8.service" />
  63.     <package android:name="com.zhyan8.glservice" />
  64. </queries>Display display = context.getSystemService(DisplayManager.class).getDisplay(displayId);<queries>
  65.     <package android:name="com.zhyan8.service" />
  66.     <package android:name="com.zhyan8.glservice" />
  67. </queries><queries>
  68.     <package android:name="com.zhyan8.service" />
  69.     <package android:name="com.zhyan8.glservice" />
  70. </queries>mSurfaceControlViewHost = new SurfaceControlViewHost(context, display, hostToken);<queries>
  71.     <package android:name="com.zhyan8.service" />
  72.     <package android:name="com.zhyan8.glservice" />
  73. </queries><queries>
  74.     <package android:name="com.zhyan8.service" />
  75.     <package android:name="com.zhyan8.glservice" />
  76. </queries>// 创建要渲染的内容<queries>
  77.     <package android:name="com.zhyan8.service" />
  78.     <package android:name="com.zhyan8.glservice" />
  79. </queries><queries>
  80.     <package android:name="com.zhyan8.service" />
  81.     <package android:name="com.zhyan8.glservice" />
  82. </queries>mGLSurfaceView = new GLSurfaceView(RemoteGLRenderService.this);<queries>
  83.     <package android:name="com.zhyan8.service" />
  84.     <package android:name="com.zhyan8.glservice" />
  85. </queries><queries>
  86.     <package android:name="com.zhyan8.service" />
  87.     <package android:name="com.zhyan8.glservice" />
  88. </queries>mGLSurfaceView.setEGLContextClientVersion(3);<queries>
  89.     <package android:name="com.zhyan8.service" />
  90.     <package android:name="com.zhyan8.glservice" />
  91. </queries><queries>
  92.     <package android:name="com.zhyan8.service" />
  93.     <package android:name="com.zhyan8.glservice" />
  94. </queries>mGLSurfaceView.setLayoutParams(new ViewGroup.LayoutParams(width, height));<queries>
  95.     <package android:name="com.zhyan8.service" />
  96.     <package android:name="com.zhyan8.glservice" />
  97. </queries><queries>
  98.     <package android:name="com.zhyan8.service" />
  99.     <package android:name="com.zhyan8.glservice" />
  100. </queries>mGLSurfaceView.setRenderer(new MyGLRenderer(RemoteGLRenderService.this));<queries>
  101.     <package android:name="com.zhyan8.service" />
  102.     <package android:name="com.zhyan8.glservice" />
  103. </queries><queries>
  104.     <package android:name="com.zhyan8.service" />
  105.     <package android:name="com.zhyan8.glservice" />
  106. </queries>// 将视图附加到SurfaceControlViewHost<queries>
  107.     <package android:name="com.zhyan8.service" />
  108.     <package android:name="com.zhyan8.glservice" />
  109. </queries><queries>
  110.     <package android:name="com.zhyan8.service" />
  111.     <package android:name="com.zhyan8.glservice" />
  112. </queries>mSurfaceControlViewHost.setView(mGLSurfaceView, width, height);<queries>
  113.     <package android:name="com.zhyan8.service" />
  114.     <package android:name="com.zhyan8.glservice" />
  115. </queries><queries>
  116.     <package android:name="com.zhyan8.service" />
  117.     <package android:name="com.zhyan8.glservice" />
  118. </queries>result[0] = mSurfaceControlViewHost.getSurfacePackage();<queries>
  119.     <package android:name="com.zhyan8.service" />
  120.     <package android:name="com.zhyan8.glservice" />
  121. </queries><queries>
  122.     <package android:name="com.zhyan8.service" />
  123.     <package android:name="com.zhyan8.glservice" />
  124. </queries>latch.countDown();<queries>
  125.     <package android:name="com.zhyan8.service" />
  126.     <package android:name="com.zhyan8.glservice" />
  127. </queries>    });<queries>
  128.     <package android:name="com.zhyan8.service" />
  129.     <package android:name="com.zhyan8.glservice" />
  130. </queries>    try {<queries>
  131.     <package android:name="com.zhyan8.service" />
  132.     <package android:name="com.zhyan8.glservice" />
  133. </queries><queries>
  134.     <package android:name="com.zhyan8.service" />
  135.     <package android:name="com.zhyan8.glservice" />
  136. </queries>latch.await(); // 等待主线程完成操作<queries>
  137.     <package android:name="com.zhyan8.service" />
  138.     <package android:name="com.zhyan8.glservice" />
  139. </queries><queries>
  140.     <package android:name="com.zhyan8.service" />
  141.     <package android:name="com.zhyan8.glservice" />
  142. </queries>return result[0];<queries>
  143.     <package android:name="com.zhyan8.service" />
  144.     <package android:name="com.zhyan8.glservice" />
  145. </queries>    } catch (InterruptedException e) {<queries>
  146.     <package android:name="com.zhyan8.service" />
  147.     <package android:name="com.zhyan8.glservice" />
  148. </queries><queries>
  149.     <package android:name="com.zhyan8.service" />
  150.     <package android:name="com.zhyan8.glservice" />
  151. </queries>Log.i(TAG, "getSurfacePackage, e=" + e.getMessage());<queries>
  152.     <package android:name="com.zhyan8.service" />
  153.     <package android:name="com.zhyan8.glservice" />
  154. </queries>    }<queries>
  155.     <package android:name="com.zhyan8.service" />
  156.     <package android:name="com.zhyan8.glservice" />
  157. </queries>    return null;<queries>
  158.     <package android:name="com.zhyan8.service" />
  159.     <package android:name="com.zhyan8.glservice" />
  160. </queries>}    };}
复制代码
​    MyGLRenderer.java
  1. package com.zhyan8.glservice;import android.opengl.GLES30;import android.opengl.GLSurfaceView;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.content.Context;import java.nio.FloatBuffer;public class MyGLRenderer implements GLSurfaceView.Renderer {    private FloatBuffer vertexBuffer;    private FloatBuffer textureBuffer;    private MyGLUtils mGLUtils;    private int mTextureId;    private int mTimeLocation;    private long mStartTime = 0L;    private long mRunTime = 0L;    public MyGLRenderer(Context context) {<queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries>mGLUtils = new MyGLUtils(context);<queries>
  5.     <package android:name="com.zhyan8.service" />
  6.     <package android:name="com.zhyan8.glservice" />
  7. </queries>getFloatBuffer();<queries>
  8.     <package android:name="com.zhyan8.service" />
  9.     <package android:name="com.zhyan8.glservice" />
  10. </queries>mStartTime = System.currentTimeMillis();    }    @Override    public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {<queries>
  11.     <package android:name="com.zhyan8.service" />
  12.     <package android:name="com.zhyan8.glservice" />
  13. </queries>//设置背景颜色<queries>
  14.     <package android:name="com.zhyan8.service" />
  15.     <package android:name="com.zhyan8.glservice" />
  16. </queries>GLES30.glClearColor(0.1f, 0.2f, 0.3f, 0.4f);<queries>
  17.     <package android:name="com.zhyan8.service" />
  18.     <package android:name="com.zhyan8.glservice" />
  19. </queries>//编译着色器<queries>
  20.     <package android:name="com.zhyan8.service" />
  21.     <package android:name="com.zhyan8.glservice" />
  22. </queries>final int vertexShaderId = mGLUtils.compileShader(GLES30.GL_VERTEX_SHADER, R.raw.vertex_shader);<queries>
  23.     <package android:name="com.zhyan8.service" />
  24.     <package android:name="com.zhyan8.glservice" />
  25. </queries>final int fragmentShaderId = mGLUtils.compileShader(GLES30.GL_FRAGMENT_SHADER, R.raw.fragment_shader);<queries>
  26.     <package android:name="com.zhyan8.service" />
  27.     <package android:name="com.zhyan8.glservice" />
  28. </queries>//链接程序片段<queries>
  29.     <package android:name="com.zhyan8.service" />
  30.     <package android:name="com.zhyan8.glservice" />
  31. </queries>int programId = mGLUtils.linkProgram(vertexShaderId, fragmentShaderId);<queries>
  32.     <package android:name="com.zhyan8.service" />
  33.     <package android:name="com.zhyan8.glservice" />
  34. </queries>GLES30.glUseProgram(programId);<queries>
  35.     <package android:name="com.zhyan8.service" />
  36.     <package android:name="com.zhyan8.glservice" />
  37. </queries>mTextureId = mGLUtils.loadTexture(R.drawable.girl);<queries>
  38.     <package android:name="com.zhyan8.service" />
  39.     <package android:name="com.zhyan8.glservice" />
  40. </queries>mTimeLocation = GLES30.glGetUniformLocation(programId, "u_time");    }    @Override    public void onSurfaceChanged(GL10 gl, int width, int height) {<queries>
  41.     <package android:name="com.zhyan8.service" />
  42.     <package android:name="com.zhyan8.glservice" />
  43. </queries>//设置视图窗口<queries>
  44.     <package android:name="com.zhyan8.service" />
  45.     <package android:name="com.zhyan8.glservice" />
  46. </queries>GLES30.glViewport(0, 0, width, height);    }    @Override    public void onDrawFrame(GL10 gl) {<queries>
  47.     <package android:name="com.zhyan8.service" />
  48.     <package android:name="com.zhyan8.glservice" />
  49. </queries>mRunTime = System.currentTimeMillis() - mStartTime;<queries>
  50.     <package android:name="com.zhyan8.service" />
  51.     <package android:name="com.zhyan8.glservice" />
  52. </queries>//将颜色缓冲区设置为预设的颜色<queries>
  53.     <package android:name="com.zhyan8.service" />
  54.     <package android:name="com.zhyan8.glservice" />
  55. </queries>GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);<queries>
  56.     <package android:name="com.zhyan8.service" />
  57.     <package android:name="com.zhyan8.glservice" />
  58. </queries>GLES30.glUniform1f(mTimeLocation, mRunTime / 1000f);<queries>
  59.     <package android:name="com.zhyan8.service" />
  60.     <package android:name="com.zhyan8.glservice" />
  61. </queries>//启用顶点的数组句柄<queries>
  62.     <package android:name="com.zhyan8.service" />
  63.     <package android:name="com.zhyan8.glservice" />
  64. </queries>GLES30.glEnableVertexAttribArray(0);<queries>
  65.     <package android:name="com.zhyan8.service" />
  66.     <package android:name="com.zhyan8.glservice" />
  67. </queries>GLES30.glEnableVertexAttribArray(1);<queries>
  68.     <package android:name="com.zhyan8.service" />
  69.     <package android:name="com.zhyan8.glservice" />
  70. </queries>//准备顶点坐标和纹理坐标<queries>
  71.     <package android:name="com.zhyan8.service" />
  72.     <package android:name="com.zhyan8.glservice" />
  73. </queries>GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, vertexBuffer);<queries>
  74.     <package android:name="com.zhyan8.service" />
  75.     <package android:name="com.zhyan8.glservice" />
  76. </queries>GLES30.glVertexAttribPointer(1, 2, GLES30.GL_FLOAT, false, 0, textureBuffer);<queries>
  77.     <package android:name="com.zhyan8.service" />
  78.     <package android:name="com.zhyan8.glservice" />
  79. </queries>//激活纹理<queries>
  80.     <package android:name="com.zhyan8.service" />
  81.     <package android:name="com.zhyan8.glservice" />
  82. </queries>GLES30.glActiveTexture(GLES30.GL_TEXTURE);<queries>
  83.     <package android:name="com.zhyan8.service" />
  84.     <package android:name="com.zhyan8.glservice" />
  85. </queries>//绑定纹理<queries>
  86.     <package android:name="com.zhyan8.service" />
  87.     <package android:name="com.zhyan8.glservice" />
  88. </queries>GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, mTextureId);<queries>
  89.     <package android:name="com.zhyan8.service" />
  90.     <package android:name="com.zhyan8.glservice" />
  91. </queries>//绘制贴图<queries>
  92.     <package android:name="com.zhyan8.service" />
  93.     <package android:name="com.zhyan8.glservice" />
  94. </queries>GLES30.glDrawArrays(GLES30.GL_TRIANGLE_FAN, 0, 4);<queries>
  95.     <package android:name="com.zhyan8.service" />
  96.     <package android:name="com.zhyan8.glservice" />
  97. </queries>//禁止顶点数组句柄<queries>
  98.     <package android:name="com.zhyan8.service" />
  99.     <package android:name="com.zhyan8.glservice" />
  100. </queries>GLES30.glDisableVertexAttribArray(0);<queries>
  101.     <package android:name="com.zhyan8.service" />
  102.     <package android:name="com.zhyan8.glservice" />
  103. </queries>GLES30.glDisableVertexAttribArray(1);    }    private void getFloatBuffer() {<queries>
  104.     <package android:name="com.zhyan8.service" />
  105.     <package android:name="com.zhyan8.glservice" />
  106. </queries>float[] vertex = new float[] {<queries>
  107.     <package android:name="com.zhyan8.service" />
  108.     <package android:name="com.zhyan8.glservice" />
  109. </queries><queries>
  110.     <package android:name="com.zhyan8.service" />
  111.     <package android:name="com.zhyan8.glservice" />
  112. </queries>1f, 1f, 0f,     //V0<queries>
  113.     <package android:name="com.zhyan8.service" />
  114.     <package android:name="com.zhyan8.glservice" />
  115. </queries><queries>
  116.     <package android:name="com.zhyan8.service" />
  117.     <package android:name="com.zhyan8.glservice" />
  118. </queries>-1f, 1f, 0f,    //V1<queries>
  119.     <package android:name="com.zhyan8.service" />
  120.     <package android:name="com.zhyan8.glservice" />
  121. </queries><queries>
  122.     <package android:name="com.zhyan8.service" />
  123.     <package android:name="com.zhyan8.glservice" />
  124. </queries>-1f, -1f, 0f,   //V2<queries>
  125.     <package android:name="com.zhyan8.service" />
  126.     <package android:name="com.zhyan8.glservice" />
  127. </queries><queries>
  128.     <package android:name="com.zhyan8.service" />
  129.     <package android:name="com.zhyan8.glservice" />
  130. </queries>1f, -1f, 0f     //V3<queries>
  131.     <package android:name="com.zhyan8.service" />
  132.     <package android:name="com.zhyan8.glservice" />
  133. </queries>};<queries>
  134.     <package android:name="com.zhyan8.service" />
  135.     <package android:name="com.zhyan8.glservice" />
  136. </queries>float[] texture = {<queries>
  137.     <package android:name="com.zhyan8.service" />
  138.     <package android:name="com.zhyan8.glservice" />
  139. </queries><queries>
  140.     <package android:name="com.zhyan8.service" />
  141.     <package android:name="com.zhyan8.glservice" />
  142. </queries>1f, 0f,     //V0<queries>
  143.     <package android:name="com.zhyan8.service" />
  144.     <package android:name="com.zhyan8.glservice" />
  145. </queries><queries>
  146.     <package android:name="com.zhyan8.service" />
  147.     <package android:name="com.zhyan8.glservice" />
  148. </queries>0f, 0f,     //V1<queries>
  149.     <package android:name="com.zhyan8.service" />
  150.     <package android:name="com.zhyan8.glservice" />
  151. </queries><queries>
  152.     <package android:name="com.zhyan8.service" />
  153.     <package android:name="com.zhyan8.glservice" />
  154. </queries>0f, 1.0f,   //V2<queries>
  155.     <package android:name="com.zhyan8.service" />
  156.     <package android:name="com.zhyan8.glservice" />
  157. </queries><queries>
  158.     <package android:name="com.zhyan8.service" />
  159.     <package android:name="com.zhyan8.glservice" />
  160. </queries>1f, 1.0f    //V3<queries>
  161.     <package android:name="com.zhyan8.service" />
  162.     <package android:name="com.zhyan8.glservice" />
  163. </queries>};<queries>
  164.     <package android:name="com.zhyan8.service" />
  165.     <package android:name="com.zhyan8.glservice" />
  166. </queries>vertexBuffer = mGLUtils.getFloatBuffer(vertex);<queries>
  167.     <package android:name="com.zhyan8.service" />
  168.     <package android:name="com.zhyan8.glservice" />
  169. </queries>textureBuffer = mGLUtils.getFloatBuffer(texture);    }}
复制代码
​    MyGLUtils.java
  1. package com.zhyan8.glservice;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.opengl.GLES30;import android.opengl.GLUtils;import android.opengl.Matrix;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;public class MyGLUtils {    private Context mContext;    private Bitmap mBitmap;    public MyGLUtils(Context context) {<queries>
  2.     <package android:name="com.zhyan8.service" />
  3.     <package android:name="com.zhyan8.glservice" />
  4. </queries>mContext = context;    }    public FloatBuffer getFloatBuffer(float[] floatArr) {<queries>
  5.     <package android:name="com.zhyan8.service" />
  6.     <package android:name="com.zhyan8.glservice" />
  7. </queries>FloatBuffer fb = ByteBuffer.allocateDirect(floatArr.length * Float.BYTES)<queries>
  8.     <package android:name="com.zhyan8.service" />
  9.     <package android:name="com.zhyan8.glservice" />
  10. </queries><queries>
  11.     <package android:name="com.zhyan8.service" />
  12.     <package android:name="com.zhyan8.glservice" />
  13. </queries>.order(ByteOrder.nativeOrder())<queries>
  14.     <package android:name="com.zhyan8.service" />
  15.     <package android:name="com.zhyan8.glservice" />
  16. </queries><queries>
  17.     <package android:name="com.zhyan8.service" />
  18.     <package android:name="com.zhyan8.glservice" />
  19. </queries>.asFloatBuffer();<queries>
  20.     <package android:name="com.zhyan8.service" />
  21.     <package android:name="com.zhyan8.glservice" />
  22. </queries>fb.put(floatArr);<queries>
  23.     <package android:name="com.zhyan8.service" />
  24.     <package android:name="com.zhyan8.glservice" />
  25. </queries>fb.position(0);<queries>
  26.     <package android:name="com.zhyan8.service" />
  27.     <package android:name="com.zhyan8.glservice" />
  28. </queries>return fb;    }    //通过代码片段编译着色器    public int compileShader(int type, String shaderCode){<queries>
  29.     <package android:name="com.zhyan8.service" />
  30.     <package android:name="com.zhyan8.glservice" />
  31. </queries>int shader = GLES30.glCreateShader(type);<queries>
  32.     <package android:name="com.zhyan8.service" />
  33.     <package android:name="com.zhyan8.glservice" />
  34. </queries>GLES30.glShaderSource(shader, shaderCode);<queries>
  35.     <package android:name="com.zhyan8.service" />
  36.     <package android:name="com.zhyan8.glservice" />
  37. </queries>GLES30.glCompileShader(shader);<queries>
  38.     <package android:name="com.zhyan8.service" />
  39.     <package android:name="com.zhyan8.glservice" />
  40. </queries>return shader;    }    //通过外部资源编译着色器    public int compileShader(int type, int shaderId){<queries>
  41.     <package android:name="com.zhyan8.service" />
  42.     <package android:name="com.zhyan8.glservice" />
  43. </queries>String shaderCode = readShaderFromResource(shaderId);<queries>
  44.     <package android:name="com.zhyan8.service" />
  45.     <package android:name="com.zhyan8.glservice" />
  46. </queries>return compileShader(type, shaderCode);    }    //链接到着色器    public int linkProgram(int vertexShaderId, int fragmentShaderId) {<queries>
  47.     <package android:name="com.zhyan8.service" />
  48.     <package android:name="com.zhyan8.glservice" />
  49. </queries>final int programId = GLES30.glCreateProgram();<queries>
  50.     <package android:name="com.zhyan8.service" />
  51.     <package android:name="com.zhyan8.glservice" />
  52. </queries>//将顶点着色器加入到程序<queries>
  53.     <package android:name="com.zhyan8.service" />
  54.     <package android:name="com.zhyan8.glservice" />
  55. </queries>GLES30.glAttachShader(programId, vertexShaderId);<queries>
  56.     <package android:name="com.zhyan8.service" />
  57.     <package android:name="com.zhyan8.glservice" />
  58. </queries>//将片元着色器加入到程序<queries>
  59.     <package android:name="com.zhyan8.service" />
  60.     <package android:name="com.zhyan8.glservice" />
  61. </queries>GLES30.glAttachShader(programId, fragmentShaderId);<queries>
  62.     <package android:name="com.zhyan8.service" />
  63.     <package android:name="com.zhyan8.glservice" />
  64. </queries>//链接着色器程序<queries>
  65.     <package android:name="com.zhyan8.service" />
  66.     <package android:name="com.zhyan8.glservice" />
  67. </queries>GLES30.glLinkProgram(programId);<queries>
  68.     <package android:name="com.zhyan8.service" />
  69.     <package android:name="com.zhyan8.glservice" />
  70. </queries>return programId;    }    //从shader文件读出字符串    private String readShaderFromResource(int shaderId) {<queries>
  71.     <package android:name="com.zhyan8.service" />
  72.     <package android:name="com.zhyan8.glservice" />
  73. </queries>InputStream is = mContext.getResources().openRawResource(shaderId);<queries>
  74.     <package android:name="com.zhyan8.service" />
  75.     <package android:name="com.zhyan8.glservice" />
  76. </queries>BufferedReader br = new BufferedReader(new InputStreamReader(is));<queries>
  77.     <package android:name="com.zhyan8.service" />
  78.     <package android:name="com.zhyan8.glservice" />
  79. </queries>String line;<queries>
  80.     <package android:name="com.zhyan8.service" />
  81.     <package android:name="com.zhyan8.glservice" />
  82. </queries>StringBuilder sb = new StringBuilder();<queries>
  83.     <package android:name="com.zhyan8.service" />
  84.     <package android:name="com.zhyan8.glservice" />
  85. </queries>try {<queries>
  86.     <package android:name="com.zhyan8.service" />
  87.     <package android:name="com.zhyan8.glservice" />
  88. </queries>    while ((line = br.readLine()) != null) {<queries>
  89.     <package android:name="com.zhyan8.service" />
  90.     <package android:name="com.zhyan8.glservice" />
  91. </queries><queries>
  92.     <package android:name="com.zhyan8.service" />
  93.     <package android:name="com.zhyan8.glservice" />
  94. </queries>sb.append(line);<queries>
  95.     <package android:name="com.zhyan8.service" />
  96.     <package android:name="com.zhyan8.glservice" />
  97. </queries><queries>
  98.     <package android:name="com.zhyan8.service" />
  99.     <package android:name="com.zhyan8.glservice" />
  100. </queries>sb.append("\n");<queries>
  101.     <package android:name="com.zhyan8.service" />
  102.     <package android:name="com.zhyan8.glservice" />
  103. </queries>    }<queries>
  104.     <package android:name="com.zhyan8.service" />
  105.     <package android:name="com.zhyan8.glservice" />
  106. </queries>    br.close();<queries>
  107.     <package android:name="com.zhyan8.service" />
  108.     <package android:name="com.zhyan8.glservice" />
  109. </queries>} catch (Exception e) {<queries>
  110.     <package android:name="com.zhyan8.service" />
  111.     <package android:name="com.zhyan8.glservice" />
  112. </queries>    e.printStackTrace();<queries>
  113.     <package android:name="com.zhyan8.service" />
  114.     <package android:name="com.zhyan8.glservice" />
  115. </queries>}<queries>
  116.     <package android:name="com.zhyan8.service" />
  117.     <package android:name="com.zhyan8.glservice" />
  118. </queries>return sb.toString();    }    //加载纹理贴图    public int loadTexture(int resourceId) {<queries>
  119.     <package android:name="com.zhyan8.service" />
  120.     <package android:name="com.zhyan8.glservice" />
  121. </queries>BitmapFactory.Options options = new BitmapFactory.Options();<queries>
  122.     <package android:name="com.zhyan8.service" />
  123.     <package android:name="com.zhyan8.glservice" />
  124. </queries>options.inScaled = false;<queries>
  125.     <package android:name="com.zhyan8.service" />
  126.     <package android:name="com.zhyan8.glservice" />
  127. </queries>mBitmap = BitmapFactory.decodeResource(mContext.getResources(), resourceId, options);<queries>
  128.     <package android:name="com.zhyan8.service" />
  129.     <package android:name="com.zhyan8.glservice" />
  130. </queries>final int[] textureIds = new int[1];<queries>
  131.     <package android:name="com.zhyan8.service" />
  132.     <package android:name="com.zhyan8.glservice" />
  133. </queries>// 生成纹理id<queries>
  134.     <package android:name="com.zhyan8.service" />
  135.     <package android:name="com.zhyan8.glservice" />
  136. </queries>GLES30.glGenTextures(1, textureIds, 0);<queries>
  137.     <package android:name="com.zhyan8.service" />
  138.     <package android:name="com.zhyan8.glservice" />
  139. </queries>// 绑定纹理到OpenGL<queries>
  140.     <package android:name="com.zhyan8.service" />
  141.     <package android:name="com.zhyan8.glservice" />
  142. </queries>GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureIds[0]);<queries>
  143.     <package android:name="com.zhyan8.service" />
  144.     <package android:name="com.zhyan8.glservice" />
  145. </queries>GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR_MIPMAP_LINEAR);<queries>
  146.     <package android:name="com.zhyan8.service" />
  147.     <package android:name="com.zhyan8.glservice" />
  148. </queries>GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);<queries>
  149.     <package android:name="com.zhyan8.service" />
  150.     <package android:name="com.zhyan8.glservice" />
  151. </queries>// 加载bitmap到纹理中<queries>
  152.     <package android:name="com.zhyan8.service" />
  153.     <package android:name="com.zhyan8.glservice" />
  154. </queries>GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, mBitmap, 0);<queries>
  155.     <package android:name="com.zhyan8.service" />
  156.     <package android:name="com.zhyan8.glservice" />
  157. </queries>// 生成MIP贴图<queries>
  158.     <package android:name="com.zhyan8.service" />
  159.     <package android:name="com.zhyan8.glservice" />
  160. </queries>GLES30.glGenerateMipmap(GLES30.GL_TEXTURE_2D);<queries>
  161.     <package android:name="com.zhyan8.service" />
  162.     <package android:name="com.zhyan8.glservice" />
  163. </queries>// 取消绑定纹理<queries>
  164.     <package android:name="com.zhyan8.service" />
  165.     <package android:name="com.zhyan8.glservice" />
  166. </queries>GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0);<queries>
  167.     <package android:name="com.zhyan8.service" />
  168.     <package android:name="com.zhyan8.glservice" />
  169. </queries>return textureIds[0];    }}
复制代码
​    vertex_shader.glsl
  1. attribute vec4 aPosition;
  2. attribute vec2 aTextureCoord;
  3. varying vec2 vTexCoord;
  4. void main() {
  5.      gl_Position = aPosition;
  6.      vTexCoord = aTextureCoord;
  7. }
复制代码
​    fragment_shader.glsl
  1. precision mediump float;
  2. uniform sampler2D uTextureUnit;
  3. varying vec2 vTexCoord;
  4. uniform float u_time;
  5. void main() {
  6.      vec3 color = texture2D(uTextureUnit, vTexCoord).rgb;
  7.      color.x += sin(u_time * 1.3 + 0.4) * 0.2;
  8.      color.y += cos(u_time * 1.7 + 7.1) * 0.2;
  9.      color.z += (sin(u_time) + cos(u_time)) * 0.2;
  10.      gl_FragColor = vec4(color, 1.0);
  11. }
复制代码
​    运行效果如下。
3.gif

​    声明:本文转自【Android】基于SurfaceControlViewHost实现跨进程渲染。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册