Android OpenGL ES 2.0 内存中仅限制 16 个纹理?

2023-11-24

基本上,当我在 Android Studio 中使用 OpenGL ES 2.0 开发应用程序时,我遇到了一个无法解决的大问题,并且它已经困扰我大约一周了。

因此,每当我在内存中加载超过 16 个、可能是 17 个任意大小的纹理,并尝试通过 Genymotion 中的模拟器或华硕平板电脑以 2D 方式显示它们时,它要么开始显示与我当时绑定的图像不同的图像特定索引,或根本不显示。但如果我通过我的三星 Galaxy S6 运行它,它运行得很好。但是,如果我加载 16 个或更少的纹理,它可以在我测试的所有设备(包括模拟器)上正常工作。

这让我尝试了一个小实验,看看它是否会显示字母图像 a-z,每个字母都是 16x16 png,所有这些都在我的可绘制文件夹中。当每个字母显示出来时,它在屏幕上的大小将为 80x80,这样我就可以看到它们。所以我尝试让它运行“a”到“z”。在模拟器以及我的平板电脑上,它只显示“a”到“o”,在“p”应该在的末尾有一个“z”,然后就停在那里。在我的三星 Galaxy 上,它实际上显示了“a”到“z”,并且执行了预期的操作。考虑到我在常量中将纹理数量设置为 27 甚至更高,这对于为什么它无法在其他设备上正确加载没有任何意义。我希望我能很好地解释我的问题。我很确定它们都能够加载超过 16 个纹理,所以我的代码一定是出了问题。我不会展示整个项目,而是会向您展示问题可能存在的相关领域。感谢任何帮助并提前致谢。这是我的代码:

常数:

public class Constants
{
public static final int BYTES_PER_FLOAT = 4;
public static final int POSITION_COMPONENT_COUNT = 4;
public static final int NORMAL_COMPONENT_COUNT = 3;
public static final int COLOR_COMPONENT_COUNT = 4;
public static final int TEXTURE_COORDS_COMPONENT_COUNT = 2;

public static final String A_COLOR = "a_Color";
public static final String A_POSITION = "a_Position";
public static final String A_NORMAL = "a_Normal";
public static final String A_TEXTURECOORDS = "a_TextureCoords";
public static final String U_MVMATRIX = "u_MVMatrix";
public static final String U_MVPMATRIX = "u_MVPMatrix";
public static final String U_TEXTURE_UNIT = "u_Texture_Unit";
public static final String U_LIGHTPOS = "u_LightPos";
public static final String V_COLOR = "v_Color";
public static final String V_POSITION = "v_Position";
public static final String V_NORMAL = "v_Normal";

public static float SCREEN_WIDTH;
public static float SCREEN_HEIGHT;

public static int NUMBER_OF_TEXTURES = 27;
}

纹理.java:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;

import static android.opengl.GLES20.*;

public class Texture
{
public static int[] texture;

public static void Load(Context context, int resourceId, int index)
{
    //glGenTextures(Constants.NUMBER_OF_TEXTURES, texture, starting_index);
    //int n: specifies the number of texture names to be generated
    //int[] textures: specifies an array in which the generated texture names are stored
    //int offset: the starting index of your array!

    Bitmap bitmap;
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;

    // loading texture
    bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);

    // ...and bind it to our array
    glActiveTexture(GL_TEXTURE0 + index);
    glBindTexture(GL_TEXTURE_2D, texture[index]);

    // create nearest filtered texture
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    // Use Android GLUtils to specify a two-dimensional texture image from our bitmap
    GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);

    // Clean up
    bitmap.recycle();
}

public static void Delete(int[] texture, int starting_index)
{
    try
    {
        glDeleteTextures(1, texture, starting_index);
    }
    catch(Exception e)
    {
        return;
    }

}
}

四元组

import static android.opengl.GLES20.*;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

public class Quad
 {
public float vertices[];
public float colors[];
public float texture_coords[];

public FloatBuffer vertexBuffer;
public FloatBuffer textureBuffer;
public FloatBuffer colorBuffer;

public Quad(float x1, float y1, float z1, float w1,
            float x2, float y2, float z2, float w2,
            float x3, float y3, float z3, float w3,
            float x4, float y4, float z4, float w4,
            float red, float green, float blue, float alpha,
            float u1, float v1, float u2, float v2)
{
    vertices = new float[]{x1, y1, z1, w1,
            x2, y2, z2, w2,
            x3, y3, z3, w3,
            x4, y4, z4, w4};

    colors = new float[]{red, green, blue, alpha,
            red, green, blue, alpha,
            red, green, blue, alpha,
            red, green, blue, alpha};

    ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(vertices.length * Constants.BYTES_PER_FLOAT);
    vertexByteBuffer.order(ByteOrder.nativeOrder());
    vertexBuffer = vertexByteBuffer.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    ByteBuffer colorByteBuffer = ByteBuffer.allocateDirect(colors.length * Constants.BYTES_PER_FLOAT);
    colorByteBuffer.order(ByteOrder.nativeOrder());
    colorBuffer = colorByteBuffer.asFloatBuffer();
    colorBuffer.put(colors);
    colorBuffer.position(0);

    texture_coords = new float[]{u1, v1,
            u2, v1,
            u1, v2,
            u2, v2};
    ByteBuffer textureByteBuffer = ByteBuffer.allocateDirect(texture_coords.length * Constants.BYTES_PER_FLOAT);
    textureByteBuffer.order(ByteOrder.nativeOrder());
    textureBuffer = textureByteBuffer.asFloatBuffer();
    textureBuffer.put(texture_coords);
    textureBuffer.position(0);
}

public void Draw_Polygon(int index, int program, float[] modelview_projection_matrix, float[] modelview_matrix)
{
    int aPositionHandle = glGetAttribLocation(program, Constants.A_POSITION);
    glEnableVertexAttribArray(aPositionHandle);
    glVertexAttribPointer(aPositionHandle, Constants.POSITION_COMPONENT_COUNT, GL_FLOAT, false, 0, vertexBuffer);

    int aColorHandle = glGetAttribLocation(program, Constants.A_COLOR);
    glEnableVertexAttribArray(aColorHandle);
    glVertexAttribPointer(aColorHandle, Constants.COLOR_COMPONENT_COUNT, GL_FLOAT, false, 0, colorBuffer);

    int aTextureCoordsHandle = glGetAttribLocation(program, Constants.A_TEXTURECOORDS);
    glEnableVertexAttribArray(aTextureCoordsHandle);
    glVertexAttribPointer(aTextureCoordsHandle, Constants.TEXTURE_COORDS_COMPONENT_COUNT, GL_FLOAT, false, 0, textureBuffer);

    int uModelViewProjectionMatrixHandle = glGetUniformLocation(program, Constants.U_MVPMATRIX);
    glUniformMatrix4fv(uModelViewProjectionMatrixHandle, 1, false, modelview_projection_matrix, 0);

    int uModelViewMatrixHandle = glGetUniformLocation(program, Constants.U_MVMATRIX);
    glUniformMatrix4fv(uModelViewMatrixHandle, 1, false, modelview_matrix, 0);

    int uTextureUnit = glGetUniformLocation(program, Constants.U_TEXTURE_UNIT);
    glUniform1i(uTextureUnit, index);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glDisableVertexAttribArray(aPositionHandle);
    glDisableVertexAttribArray(aColorHandle);
    glDisableVertexAttribArray(aTextureCoordsHandle);
}
}

文本.java:

import android.opengl.Matrix;

import static android.opengl.GLES20.*;

public class Text
{
public Quad[] poly = new Quad[1];
public String string;
public int char_width;
public int char_height;

void Draw()
{
    int texture_num = 0;
    int x_pos = 0;
    int y_pos = 0;
    for (int i = 0; i < string.length(); i++)
    {
        char character = string.charAt(i);

        switch(character)
        {
            case ' ':
            {
                texture_num = 0;
                break;
            }
            case 'a':
            {
                texture_num = 1;
                break;
            }
            case 'b':
            {
                texture_num = 2;
                break;
            }
            case 'c':
            {
                texture_num = 3;
                break;
            }
            case 'd':
            {
                texture_num = 4;
                break;
            }
            case 'e':
            {
                texture_num = 5;
                break;
            }
            case 'f':
            {
                texture_num = 6;
                break;
            }
            case 'g':
            {
                texture_num = 7;
                break;
            }
            case 'h':
            {
                texture_num = 8;
                break;
            }
            case 'i':
            {
                texture_num = 9;
                break;
            }
            case 'j':
            {
                texture_num = 10;
                break;
            }
            case 'k':
            {
                texture_num = 11;
                break;
            }
            case 'l':
            {
                texture_num = 12;
                break;
            }
            case 'm':
            {
                texture_num = 13;
                break;
            }
            case 'n':
            {
                texture_num = 14;
                break;
            }
            case 'o':
            {
                texture_num = 15;
                break;
            }
            case 'p':
            {
                texture_num = 16;
                break;
            }
            case 'q':
            {
                texture_num = 17;
                break;
            }
            case 'r':
            {
                texture_num = 18;
                break;
            }
            case 's':
            {
                texture_num = 19;
                break;
            }
            case 't':
            {
                texture_num = 20;
                break;
            }
            case 'u':
            {
                texture_num = 21;
                break;
            }
            case 'v':
            {
                texture_num = 22;
                break;
            }
            case 'w':
            {
                texture_num = 23;
                break;
            }
            case 'x':
            {
                texture_num = 24;
                break;
            }
            case 'y':
            {
                texture_num = 25;
                break;
            }
            case 'z':
            {
                texture_num = 26;
                break;
            }
        }

        Matrix.setIdentityM(OpenGL.model_matrix, 0);
        Matrix.translateM(OpenGL.model_matrix, 0, OpenGL.model_matrix, 0, 0.0f, 0.0f, 0.0f);
        Matrix.multiplyMM(OpenGL.matrix_ortho_projection_and_view, 0, OpenGL.matrix_ortho_projection, 0, OpenGL.model_matrix, 0);

        glUseProgram(Shader.textured_colored_shader_program);

        poly[0] = new Quad(x_pos + 0.0f, y_pos + 0.0f, 0.0f, 1.0f,
                x_pos + char_width, y_pos + 0.0f, 0.0f, 1.0f,
                x_pos + 0.0f, y_pos + char_height, 0.0f, 1.0f,
                x_pos + char_width, y_pos + char_height, 0.0f, 1.0f,
                1.0f, 1.0f, 1.0f, 1.0f,
                0.0f, 0.0f, 1.0f, 1.0f);

        poly[0].Draw_Polygon(texture_num, Shader.textured_colored_shader_program, OpenGL.matrix_ortho_projection_and_view, OpenGL.model_matrix);

        x_pos += char_width;

        if (x_pos >= Constants.SCREEN_WIDTH)
        {
            x_pos = 0;
            y_pos += char_height;
        }
    }
}
}

OpenGL.java:

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

import android.content.Context;
import android.opengl.GLSurfaceView.Renderer;
import static android.opengl.GLES20.*;

import android.util.Log;
import android.opengl.Matrix;

public class OpenGL implements Renderer
{
public static Context context;

public static final float[] matrix_ortho_projection = new float[16];
public static float[] model_matrix = new float[16];
private final float[] matrix_view = new float[16];
public static final float[] matrix_ortho_projection_and_view = new float[16];
public int get_width, get_height;
public static boolean texture_loading_enabled = true;
Text text = new Text();

public OpenGL(Context context)
{
    this.context = context;
}

public static void Load_Textures()
{
    switch(State.game_state)
    {
        case State.LOGO:
        {
            Texture.Delete(Texture.texture, 0);

            glFlush();

            Texture.texture = new int[Constants.NUMBER_OF_TEXTURES];

            glGenTextures(Constants.NUMBER_OF_TEXTURES, Texture.texture, 0);

            Texture.Load(context, R.drawable.c64_space, 0);
            Texture.Load(context, R.drawable.c64_a, 1);
            Texture.Load(context, R.drawable.c64_b, 2);
            Texture.Load(context, R.drawable.c64_c, 3);
            Texture.Load(context, R.drawable.c64_d, 4);
            Texture.Load(context, R.drawable.c64_e, 5);
            Texture.Load(context, R.drawable.c64_f, 6);
            Texture.Load(context, R.drawable.c64_g, 7);
            Texture.Load(context, R.drawable.c64_h, 8);
            Texture.Load(context, R.drawable.c64_i, 9);
            Texture.Load(context, R.drawable.c64_j, 10);
            Texture.Load(context, R.drawable.c64_k, 11);
            Texture.Load(context, R.drawable.c64_l, 12);
            Texture.Load(context, R.drawable.c64_m, 13);
            Texture.Load(context, R.drawable.c64_n, 14);
            Texture.Load(context, R.drawable.c64_o, 15);
            Texture.Load(context, R.drawable.c64_p, 16);
            Texture.Load(context, R.drawable.c64_q, 17);
            Texture.Load(context, R.drawable.c64_r, 18);
            Texture.Load(context, R.drawable.c64_s, 19);
            Texture.Load(context, R.drawable.c64_t, 20);
            Texture.Load(context, R.drawable.c64_u, 21);
            Texture.Load(context, R.drawable.c64_v, 22);
            Texture.Load(context, R.drawable.c64_w, 23);
            Texture.Load(context, R.drawable.c64_x, 24);
            Texture.Load(context, R.drawable.c64_y, 25);
            Texture.Load(context, R.drawable.c64_z, 26);

            break;
        }

        case State.TITLE:
        {
            break;
        }

        case State.GAME:
        {
            break;
        }
    }

    texture_loading_enabled = false;
}

private void Controls()
{

    switch(State.game_state)
    {
        case State.LOGO:
        {
            break;
        }

        case State.TITLE:
        {
            break;
        }

        case State.GAME:
        {
            break;
        }
    }

}

@Override
public void onDrawFrame(GL10 glUnused)
{
    Controls();

    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    switch(State.game_state)
    {
        case State.LOGO:
        {
            text.Draw();
            break;
        }

        case State.TITLE:
        {
            break;
        }

        case State.GAME:
        {
            break;
        }
    }
}

@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height)
{
    // Set the OpenGL viewport to the same size as the surface.
    Log.d("TAG", "onSurfaceChanged()");

    get_width = width;
    get_height = height;

    glViewport(0, 0, width, height);

    for(int i = 0; i < 16; i++)
    {
        matrix_ortho_projection[i] = 0.0f;
        matrix_view[i] = 0.0f;
        model_matrix[i] = 0.0f;
        matrix_ortho_projection_and_view[i] = 0.0f;
    }

    Matrix.orthoM(matrix_ortho_projection, 0, 0.0f, (float) get_width, (float) get_height, 0.0f, 0.0f, 1.0f);
}

@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
{
    Log.d("TAG", "onSurfaceCreated()");

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

    Shader.Create_Texture_Colored_Shader(context);
    Shader.Create_Colored_Shader(context);

    text.char_width = 80;
    text.char_height = 80;
    text.string = "abcdefghijklmnopqrstuvwxyz";

    switch(State.game_state)
    {
        case State.LOGO:
        {
            if (texture_loading_enabled == true)
                Load_Textures();
            break;
        }

        case State.TITLE:
        {
            break;
        }

        case State.GAME:
        {
            break;
        }
    }
}
}

着色器.java:

import android.content.Context;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import static android.opengl.GLES20.*;

public class Shader
{
public static int textured_colored_shader_program;
public static int colored_shader_program;

public static String readTextFileFromRawResource(final Context context, final int resourceId)
{
    final InputStream inputStream = context.getResources().openRawResource(resourceId);
    final InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

    String nextLine;
    final StringBuilder body = new StringBuilder();

    try
    {
        while ((nextLine = bufferedReader.readLine()) != null)
        {
            body.append(nextLine);
            body.append('\n');
        }
    }
    catch (IOException e)
    {
        return null;
    }

    return body.toString();
}

public static int loadShader(int type, String shaderCode)
{
    int shader = glCreateShader(type);
    glShaderSource(shader, shaderCode);
    glCompileShader(shader);
    return shader;
}

public static void Create_Texture_Colored_Shader(Context context)
{
    int vertexShader = loadShader(GL_VERTEX_SHADER, readTextFileFromRawResource(context, R.raw.vertex_shader));
    int fragmentShader = loadShader(GL_FRAGMENT_SHADER, readTextFileFromRawResource(context, R.raw.fragment_shader));
    textured_colored_shader_program = glCreateProgram();
    glAttachShader(textured_colored_shader_program, vertexShader);
    glAttachShader(textured_colored_shader_program, fragmentShader);
    glLinkProgram(textured_colored_shader_program);
}

public static void Create_Colored_Shader(Context context)
{
    int vertexShader = loadShader(GL_VERTEX_SHADER, readTextFileFromRawResource(context, R.raw.vertex_shader_no_texture));
    int fragmentShader = loadShader(GL_FRAGMENT_SHADER, readTextFileFromRawResource(context, R.raw.fragment_shader_no_texture));
    colored_shader_program = glCreateProgram();
    glAttachShader(colored_shader_program, vertexShader);
    glAttachShader(colored_shader_program, fragmentShader);
    glLinkProgram(colored_shader_program);
}
}

纹理总数objects通常不受限制。至少不在任何合理的范围内,理论上您将运行可以由GLuint在某一点。但在那之前你就会耗尽内存。因此,唯一的实际限制通常是由用于纹理数据的内存量给出。

然而,纹理的数量units是非常有限的。快速查看您的代码,这就是您遇到的情况。从您的纹理加载代码:

glActiveTexture(GL_TEXTURE0 + index);
glBindTexture(GL_TEXTURE_2D, texture[index]);

您要做的就是保持所有纹理的绑定,为每个纹理使用不同的纹理单元。然后,当您绘制时,您可以选择着色器采样的纹理单元:

glUniform1i(uTextureUnit, index);

这是一个完全有效的方法......直到你用完纹理单元。这正是发生的情况。

纹理单元的最大数量取决于实现,可以通过以下方式查询:

GLint maxUnits = 0;
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxUnits);

该值的最小值为 8。因此,除非您检查该值并找到更多值,否则您只能依赖 8 个纹理单元。

如果您需要超过 8 个纹理,并且希望您的代码能够跨设备可靠地运行,那么保持所有纹理绑定的有点非常规的方法将不起作用。

最简单的方法是按照大多数人的做法:在绘制之前绑定要使用的纹理。为此,您始终可以使用纹理单元 0。因此您可以删除对glActiveTexture(),然后简单地在Draw_Polygon()方法,而不是glUniform1i() call:

glBindTexture(GL_TEXTURE_2D, texture[index]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android OpenGL ES 2.0 内存中仅限制 16 个纹理? 的相关文章

  • Android Studio 2.0 AVD 管理器中缺少 API 14 和 15

    在Android Studio中创建AVD时 列表中缺少API 14和15的系统映像 尽管我实际上在SDK管理器中安装了相应的SDK版本 我认为这个问题是在升级到Android Studio 2 0后出现的 如何为这些 API 版本创建 A
  • 如何获取另一个应用程序的版本名称

    我想获取 Minecraft Pocket Edition 的版本名称 示例 0 13 0 b5 这是MCPE 我的世界袖珍版 的包 com mojang minecraftpe 我想要版本为String 我怎样才能做到这一点 我的获取包名
  • Java SSO 与 Wildfly 8、Java 1.8.0_45 和 Active Directory

    我对这个主题进行了很多搜索 但找不到解决方案 要求的简短描述 Wildfly 8 2 下 Web 应用程序上的 SSO 在 Active Directory 中验证 Windows 用户的身份 当 SSO 失败时回退到登录表单 在 Wild
  • 在同一个容器但不同的耳朵中使用本地EJB

    我正在尝试在同一个 Glassfish 但不同的耳朵中使用本地 EJB 但是Glassfish找不到本地EJB或者无法消费 我读到了这个 根据 JavaEE 教程 Local bean 的客户端 必须在与其访问的企业 bean 相同的 JV
  • 无法安装 JDK 9,因为“另一个 Java 安装正在进行中”

    我已经在 Windows 10 x64 上使用 JDK 9 一段时间了 但是当我去安装最新的早期版本 b174 时 我首先卸载了以前的版本 像往常一样 然后运行新的安装程序 它失败并显示一个消息框 显示 另一个 Java 安装正在进行中 您
  • 如何在连接到远程系统的设备上部署和执行应用程序?

    我需要部署测试应用程序并在连接到同一网络中另一台计算机的设备上发出命令 我通读了http developer android com tools help adb html directingcommands http developer
  • Android 设备中未显示背景图片?

    我将以下代码添加到main xml将图像设置为我的应用程序的背景图像 android background drawable bg So main xml看起来像这样
  • Jlist 自定义渲染器

    我正在尝试添加一个我猜你会称其为列表中每个项目的子列表 我构建了一个自定义渲染器 它提供以下输出 正如你所看到的 有些东西不对劲 我没能找到问题的答案 我猜我需要更改面板布局中的某些内容才能获得正确的结果 但不知道是什么 https i s
  • JSch:如何使用 ssh 密钥 ssh 到服务器

    我想从另一个 ssh 服务器后面 ssh 进入服务器 网关服务器需要用户名 密码 我可以做到这一点 我正在使用隧道进入下一台服务器 但这需要only一个 ssh 密钥 我已经通过 PuTTY 生成了密钥 因此它存在于我的用户名中 但我不确定
  • Android 浏览器缩放?

    我正在尝试为 Android 创建一个移动网站 当我将主体宽度设置为 480px 屏幕宽度 时 结果比我预期的大 50 左右 看来 android 正在缩放它所绘制的内容并弄乱了我所有的布局 有谁知道如何禁用它或解决它 我已经在使用这个 您
  • 无法使用 Jsoup HTML 解析器 Java 实现某些功能

    我无法使用 Jsoup Java 库解析以下场景的一些文本 1 This is b My Text b some other b b text as well b b b non empty tag1 b other text 预期输出 s
  • Flamingo 更新后无法在 Android Studio 中构建 Java 或 Kotlin 项目 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 火烈鸟更新后无法创建项目 它显示一些错误 未找到 com android tools build gradle 8 0 0 的匹配变体 消费
  • Eclipse java 断点 - 目的是什么?

    我正在学习 Android 教程 刚刚进入调试部分 我想知道断点的用途是什么 我还不能告诉 它实际上停止了应用程序 以便我可以确定它运行到该点 或者我可以设置多个断点并将它们用作标记来从断点到断点检查 停止和运行 我的代码 断点是执行停止的
  • 从 Apache Kafka 中的主题删除消息

    所以我是 Apache Kafka 的新手 我正在尝试创建一个简单的应用程序 以便我可以更好地理解 API 我知道这个问题在这里被问了很多 但是如何清除存储在主题上的消息 记录 我看到的大多数答案都说要更改消息保留时间或删除并重新创建主题
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • onKeyDown 和 onKeyLongPress

    我希望我的应用程序对音量按钮的正常按键事件和长按按键事件做出不同的反应 我已经看过了this https stackoverflow com questions 7493531 trying to catch the volume onke
  • Android:需要记录麦克风输入

    有没有办法在实时播放 预览过程中记录 Android 中的麦克风输入 我尝试使用AudioRecord and AudioTrack这样做 但问题是我的设备无法播放录制的音频文件 实际上 任何Android播放器应用程序都无法播放录制的音频
  • onLocationChanged 回调是在哪个线程上进行的?主 UI 线程?

    当在我的应用程序中进行此回调时 我有相当多的工作要做 通过 ORM 库和一些基于距离的计算读取和写入 SQL 数据库 当然 我担心不会阻塞主 UI 线程 因此我一直在尝试 未成功 找出这是否是进行回调的线程 如果是 我打算在回调发生时触发的
  • Java 需要一个 FileSet 包/类

    任何人都可以建议 Java 中的 FileSet 包 类吗 我所说的 FileSet 是指文件和目录的集合以及正则表达式支持的包含和排除规则 类似于 Apache Ant 谢谢 Apache 公共 IO文件工具 http commons a
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di

随机推荐

  • 如何在 Visual Studio 中静态链接 VCPKG 生成的 .lib 文件

    我使用 VCPKG 构建第三方库 例如 libcurl 我有动态和静态构建 显然 导入 lib和对象 lib文件分别包含在两个不同的文件夹中 x64 windows和x64 windows static 我想将对象 libcurl lib
  • 在 D3.js 中重新排序 SVG ( z-index ) 元素

    我意识到这个问题以前已经被问过 但我无法深入了解 这是我的图表 http www gogeye com financialnews piechart index3 html 我想做的就是将硬币渲染在图表后面 我知道 D3 渲染是按照附加顺序
  • 如何查询pandas中的MultiIndex索引列值

    代码示例 In 171 A np array 1 1 1 1 3 3 3 3 5 5 6 6 In 172 B np array 111 222 222 333 333 777 In 173 C randint 10 99 6 In 174
  • 将图像转换为 Base64,反之亦然

    我想将图像转换为 Base64 然后再次转换回图像 这是我到目前为止尝试过的代码以及错误 请问有什么建议吗 public void Base64ToImage string coded System Drawing Image finalI
  • 在 Java 中构建 SQL 字符串的最简洁方法

    我想构建一个 SQL 字符串来执行数据库操作 更新 删除 插入 选择之类的事情 而不是使用数百万个 和引号的糟糕的字符串连接方法 这充其量是不可读的 有一定是更好的方法 我确实考虑过使用 MessageFormat 但它应该用于用户消息 尽
  • PHP:MySQL 服务器消失了

    我知道这个问题已经被问过很多次了 但我已经尝试了一切 我有一个 PHP 脚本 它会迭代数千个图像 根据需要执行调整大小 然后插入数据库 我收到此错误消息 警告 mysql query function mysql query MySQL 服
  • 后置和前置增量运算符

    当我运行以下示例时 我得到输出 0 2 1 class ZiggyTest2 static int f1 int i System out print i return 0 public static void main String ar
  • Android 中的 TTS 暂停

    我正在开发一个应用程序 它可以读出文档中的文本 我想添加暂停和恢复功能 但我在 TTS 中找不到任何暂停 方法 有什么办法可以让我暂停吗 有一个方法可以暂停 只需致电TextToSpeech playSilence 请参阅下面的代码here
  • 跨源请求被阻止 Spring REST 服务 + AJAX

    无法调用spring REST服务 我的春季服务 RequestMapping value MAS authenticate method RequestMethod POST public ResponseEntity
  • 将掩码应用于字符串

    我正在从表中读取字符串 ID 值 当用户输入 ID 时 是使用用户定义的输入掩码完成的 因此掩码可能类似于000 00 0000 AA 9999999等 掩码会因用户而异 因此必须在运行时进行评估 鉴于表中仅存储字母数字文本 那么应用该掩码
  • 如何删除 Logstash 过滤器中所有具有 NULL 值的字段

    我正在使用 Logstash 读取 csv 格式的检查点日志文件 并且某些字段具有空值 我想删除所有具有空值的字段 我无法准确预见哪些字段 键 将具有空值 因为我的 csv 文件中有 150 列 并且我不想检查其中的每一列 是否可以在log
  • 如何按特定字段对 Spark DataFrame 中的结构类型数组进行排序?

    给出以下代码 import java sql Date import org apache spark sql SparkSession import org apache spark sql functions object SortQu
  • 在 LLDB 调试器中显示变量属性的值?

    我正在使用 Log Message 操作的断点 并且我想打印 NSIndexPath 的行 所以我尝试 cell row indexPath row 但什么也没有打印出来 我还尝试使用调试器命令 expr void NSLog indexP
  • psql:无法将主机名“somePostgres”转换为地址:名称或服务未知

    我正在 docker 中构建 java spring mvc 应用程序 并且 dokefile 构建涉及与 postgres 容器交互 每当我跑步时docker compose updockerfile 中与 postrges 交互的步骤有
  • 使用 lift-json 将 Json 值提取为 Map

    lift json 的文档表明我应该能够调用 values 来获取当前的 JObject 结构作为普通的 Scala Map 这种方法对我来说不起作用 因为 值 的返回类型是 json Values 而不是示例所示的 Map 我究竟做错了什
  • 运算符“>=”不能应用于“string”和“string”类型的操作数

    我在 C 中使用实体框架 我的代码是 var result ef services Where entry gt entry tarikhservice gt textBoxX1 Text entry tarikhservice lt te
  • AWS Athena (Presto) OFFSET 支持

    我想知道 AWS Athena 是否支持 OFFSET 对于 mysql 以下查询正在运行 但在 athena 中它给了我错误 任何例子都会有帮助 从员工中选择 其中 empSal gt 3000 LIMIT 300 OFFSET 20 A
  • 如何自定义 Hibernate @Size 错误消息以指示输入字段的长度

    我想自定义文本字段的错误消息以包含输入的实际字符数 我已经能够做到这一点 但对我的解决方案不满意 所以我想知道其他人做了什么来实现这一目标 春季4 1 2 休眠4 3 10 休眠验证器 5 1 3 字段注释 出于测试目的 仅限 10 个 实
  • 应用程序在 CoreData 保存时冻结

    我有一个 iPhone 应用程序 在保存 CoreData 时有时会冻结 然后不会重新启动 我确实有第二个线程使用数据库 但我认为我已经遵循该模式为该线程创建单独的上下文 这是重新启动后的崩溃报告 有任何想法吗 我尝试将其更改为仅使用一个线
  • Android OpenGL ES 2.0 内存中仅限制 16 个纹理?

    基本上 当我在 Android Studio 中使用 OpenGL ES 2 0 开发应用程序时 我遇到了一个无法解决的大问题 并且它已经困扰我大约一周了 因此 每当我在内存中加载超过 16 个 可能是 17 个任意大小的纹理 并尝试通过