在Android上的TextView上打印GPU信息(渲染器,版本,供应商)

4

我已经在整个互联网上搜索了好几天,但是没有找到解决方案。

我想要获取 Android 设备上 GPU 的主要信息(例如 RENDERER、VENDOR 和 VERSION),并能够将其打印在一个预定义的 XML 布局的 textview 上。我尝试了很多方法,但都无法实现。每个人都说要使用以下内容:

Log.d("GL", "GL_RENDERER = " + gl.glGetString(GL10.GL_RENDERER));
Log.d("GL", "GL_VENDOR = " + gl.glGetString(GL10.GL_VENDOR));
Log.d("GL", "GL_VERSION = " + gl.glGetString(GL10.GL_VERSION));
Log.i("GL", "GL_EXTENSIONS = " + gl.glGetString(GL10.GL_EXTENSIONS));

我实现了下一个类:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mGLView = new GLSurfaceView(this);
    mGLView.setRenderer(new ClearRenderer());
    setContentView(mGLView);

}


private GLSurfaceView mGLView;
static class ClearRenderer implements GLSurfaceView.Renderer {

    public final static String renderer = null;
    Random aleatorio = new Random();

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        float r = aleatorio.nextFloat();
        float g = aleatorio.nextFloat();
        float b = aleatorio.nextFloat();
        gl.glClearColor(r, g, b, 1.0f);

        Log.d("GL", "GL_RENDERER = " + gl.glGetString(GL10.GL_RENDERER));
        Log.d("GL", "GL_VENDOR = " + gl.glGetString(GL10.GL_VENDOR));
        Log.d("GL", "GL_VERSION = " + gl.glGetString(GL10.GL_VERSION));
        Log.i("GL", "GL_EXTENSIONS = " + gl.glGetString(GL10.GL_EXTENSIONS));

    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {           
    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(gl.GL_COLOR_BUFFER_BIT);         
    }
}
}

这个功能很好,但我不知道如何将这些日志放入TextView中。我将ContentView设置为我的GLSurfaceView,但我不知道如何在其中使用TextView。

我也尝试使用:

String renderer = gl.glGetString(GL10.GL_VENDOR);
Log.d("GL", renderer);

在与之前的日志相同的位置,这也很好地工作,并且我可以在LogCat中看到供应商的正确值。
但是,我仍然不知道如何将此值传递给文本视图(例如tv.setText(renderer)),并在普通布局上使用它。
如果有人能够用一个简单的示例帮助我解决这个问题,我将非常感激。请考虑到我从未使用过OpenGL,我只想获取关于它的信息。如果可能的话,也请告诉我另一种获取该信息的方法(如果更容易的话:D)。
提前致谢。
3个回答

4
这里有点棘手,你不需要将GlSurfaceView作为根视图,否则你的布局中就没有预定义的TextView了。
解决方案:
我是这样做的,我在预定义的布局中添加了GlSurfaceView,然后在完成信息后将其删除。
你的xml文件应该像这样,其中包含预定义的TextView: gpu_info.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rlRoot"
android:layout_width="match_parent"
android:layout_height="match_parent" >


<TextView 
    android:id="@+id/tvVendor"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#FF0000"
    />

你的Activity文件将会是这样:

public class GpuInfoActivity extends Activity{

private RelativeLayout rlRoot;
private TextView tvVendor;
private String mVendor;
private GLSurfaceView mGlSurfaceView;
private GLSurfaceView.Renderer mGlRenderer = new Renderer() {

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {// TODO Auto-generated method stub
        Log.d(TAG, "gl renderer: "+gl.glGetString(GL10.GL_RENDERER));
        Log.d(TAG, "gl vendor: "+gl.glGetString(GL10.GL_VENDOR));
        Log.d(TAG, "gl version: "+gl.glGetString(GL10.GL_VERSION));
        Log.d(TAG, "gl extensions: "+gl.glGetString(GL10.GL_EXTENSIONS));

        mVendor = gl.glGetString(GL10.GL_VENDOR);
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                tvVendor.setText(mVendor);
                rlRoot.removeView(mGlSurfaceView);

            }
        });}

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // TODO Auto-generated method stub

    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gpu_info);


    rlRoot = (RelativeLayout)findViewById(R.id.rlRoot);
    tvVendor = (TextView)findViewById(R.id.tvVendor);

    mGlSurfaceView = new GLSurfaceView(this);
    mGlSurfaceView.setRenderer(mGlRenderer);

    rlRoot.addView(mGlSurfaceView);

    }
}

I hope it will be helpful !!


2

在与这个问题苦苦挣扎后,我找到了一个可能的解决方案。也许它不是最好的,但我没有其他选择,而且它能够正常工作。

我使用了共享偏好来存储信息。我创建了一个启动器活动,实现了GLSurfaceView,并延迟3秒钟(足够长的时间来存储所有字符串),在此延迟之后,我需要的活动开始运行。

启动器活动如下所示:

package system.info.to.txt;

import java.util.Random;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;

public class RendererLoader extends Activity {

private static SharedPreferences prefs;
private static SharedPreferences.Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    prefs = this.getSharedPreferences("GPUinfo", Context.MODE_PRIVATE);
    mGLView = new GLSurfaceView(this);
    mGLView.setRenderer(new ClearRenderer());
    setContentView(mGLView);    

    final Intent intent = new Intent(this, Info.class);
    new CountDownTimer(3000, 9999)
         {
           public void onTick(long millisUntilFinished) {
                     // Not used
           }
           public void onFinish() {             
           startActivity(intent);
           finish();
           }
        }.start();  
}


private GLSurfaceView mGLView;
class ClearRenderer implements GLSurfaceView.Renderer {

    Random aleatorio = new Random();

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        float r = aleatorio.nextFloat();
        float g = aleatorio.nextFloat();
        float b = aleatorio.nextFloat();
        gl.glClearColor(r, g, b, 1.0f);

        editor = prefs.edit();
        editor.putString("RENDERER", gl.glGetString(GL10.GL_RENDERER));
        editor.putString("VENDOR", gl.glGetString(GL10.GL_VENDOR));
        editor.putString("VERSION", gl.glGetString(GL10.GL_VERSION));
        editor.putString("EXTENSIONS", gl.glGetString(GL10.GL_EXTENSIONS));
        editor.commit();

    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {

    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    }
  }
}

在此之后,您可以使用以下代码在应用程序中的任何位置检索存储的字符串:

    SharedPreferences prefs =getSharedPreferences("GPUinfo",Context.MODE_PRIVATE);
    String vendor = prefs.getString("VENDOR", null);
    String renderer = prefs.getString("RENDERER", null);
    String version = prefs.getString("VERSION", null);
    String extensions = prefs.getString("EXTENSIONS", null);

我希望这个答案能对有同样问题的人有所帮助。其他解决方案也会很有用。

1
我会这样做:

我会用这种方式:

package com.paget96.lspeed.activities;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

import java.util.Random;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class GetGpuInfo extends Activity {

    // Variables
    private static SharedPreferences sharedPreferences;
    private static SharedPreferences.Editor editor;
    private GLSurfaceView mGLView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sharedPreferences = this.getSharedPreferences("device_info", Context.MODE_PRIVATE);
        mGLView = new GLSurfaceView(this);
        mGLView.setRenderer(new ClearRenderer());
        setContentView(mGLView);

        final Intent intent = new Intent(this, MainActivity.class);
    }


    class ClearRenderer implements GLSurfaceView.Renderer {

        Random random = new Random();

        @Override
        public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
            float r = random.nextFloat();
            float g = random.nextFloat();
            float b = random.nextFloat();
            gl10.glClearColor(r, g, b, 1.0f);

            editor = sharedPreferences.edit();
            editor.putString("gpu_vendor", gl10.glGetString(GL10.GL_VENDOR));
            editor.putString("gpu_renderer", gl10.glGetString(GL10.GL_RENDERER));
            editor.putString("gpu_version", gl10.glGetString(GL10.GL_VERSION));
            //editor.putString("gpu_extensions", gl10.glGetString(GL10.GL_EXTENSIONS));
            editor.apply();

            finish();
        }

        public void onSurfaceChanged(GL10 gl, int w, int h) {

        }

        public void onDrawFrame(GL10 gl) {
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        }
    }
}

然后通过Intent调用同一活动到任何其他地方(这个活动将在传递所有内容到onSurfaceCreated(...)后立即被销毁)

final Intent intent = new Intent(this, GetGpuInfo.class);
startActivity(intent);

现在GetGpuInfo活动已经将GPU数据收集到sharedPreferences中,因此您可以在任何片段或其他地方访问它们。 像这样:
vendor = sharedPreferences.getString("gpu_vendor", getActivity().getString(R.string.unknown));
        renderer = sharedPreferences.getString("gpu_renderer", getActivity().getString(R.string.unknown));
        version = sharedPreferences.getString("gpu_version", getActivity().getString(R.string.unknown));
        extensions = sharedPreferences.getString("gpu_extensions", getActivity().getString(R.string.unknown));

        gpuInfo.setText(String.format("%s\n%s\n%s",
                getString(R.string.vendor, vendor),
                getString(R.string.renderer, renderer),
                getString(R.string.version, version)
                /*,getString(R.string.extensions, extensions)*/));

将sharedPreferences的getter初始化为String,然后像我在这里所做的那样将它们放入TextView中。我使用String.format是因为它更容易使用新行而不会出现String concentration的警告。

就这些,干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接