You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenGL ES 2.0的Android游戏纹理质量低及资源被盗取问题求助

问题解决方案

问题1:游戏内纹理质量低于图片查看器

修复方案:

  • 替换透视投影为正交投影
    你的onSurfaceChanged中使用的frustumM是透视投影,不适合2D游戏,会导致纹理拉伸变形。改用正交投影适配屏幕分辨率:

    @Override
    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
        // 正交投影,确保纹理按真实比例显示
        float left = -width / 2f;
        float right = width / 2f;
        float bottom = -height / 2f;
        float top = height / 2f;
        Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, 1, 10);
        AssetsManager.updateLines();
    }
    
  • 优化纹理加载参数
    OpenGL ES 2.0对非2的幂次纹理支持有限,且mipmap可能导致不必要的模糊。调整加载逻辑:

    public static int loadTexture(final Context context, final int resourceId) {
        final int[] textureHandle = new int[1];
        GLES20.glGenTextures(1, textureHandle, 0);
        if (textureHandle[0] != 0) {
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inScaled = false; // 禁止系统自动缩放
            final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
            
            // 非2幂次纹理需设置边缘 clamp
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
            // 关闭mipmap,避免模糊
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
            
            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
            bitmap.recycle();
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
        }
        if (textureHandle[0] == 0) {
            throw new RuntimeException("Error loading texture.");
        }
        return textureHandle[0];
    }
    
  • 核对纹理与顶点尺寸匹配
    创建OpenGLESTexture时,确保传入的width和height是纹理的真实像素尺寸,避免因尺寸不匹配导致拉伸模糊。

问题2:纹理资源易被提取

解决方案:

  • 加密纹理文件
    对PNG/JPG纹理使用自定义算法(如XOR异或、AES)加密后放入assets目录,运行时解密为Bitmap再加载:

    private Bitmap decryptTexture(Context context, String assetPath) throws IOException {
        InputStream is = context.getAssets().open(assetPath);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte key = 0x5A; // 自定义密钥
        int b;
        while ((b = is.read()) != -1) {
            baos.write(b ^ key);
        }
        is.close();
        return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.size());
    }
    
  • 使用纹理图集
    用TexturePacker等工具将所有纹理合并成一个大图集,同时生成坐标配置文件。即使被提取,也难以直接拆分出单个可用纹理。

  • 启用代码混淆与APK加固
    开启ProGuard混淆代码,配合360加固保、腾讯乐固等第三方加固工具,提升反编译难度,辅助保护资源。

内容的提问来源于stack exchange,提问作者Nima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:30:57