Mipmap踩过的坑

Mipmap和drawable不同之处在于
使用了 纹理技术 显示launcher_icon ,所以建议图标专门放在mipmap中,另外修改了launcher icon 还是出现旧图标 可能是debug文件夹导致的,

mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术。android 中的 mipmap 技术主要为了应对图片大小缩放的处理,在android 中我们提供一个 bitmap 图片,由于应用的需要(比如缩放动画),可能对这个 bitmap 进行各种比例的缩小,为了提高缩小的速度和图片的质量,android 通过 mipmap 技术提前对按缩小层级生成图片预先存储在内存中,这样就提高了图片渲染的速度和质量。

api 中通过 Bitmap 的 public final void setHasMipMap (boolean hasMipMap) 方法可以让系统渲染器尝试开启 Bitmap 的 mipmap 技术。但是这个方法只能建议系统开启这个功能,至于是否正真开启,还是由系统决定。

res 目录下面 mipmap 和 drawable 的区别也就是上面这个设置是否开启的区别。mipmap 目录下的图片默认 setHasMipMap 为 true,drawable 默认 setHasMipMap 为 false。

google 建议大家只把 app 的启动图标放在 mipmap 目录中,其他图片资源仍然放在 drawable 下面。

下面是引用自 google 官方的描述

Mipmapping for drawables
Using a mipmap as the source for your bitmap or drawable is a simple way to provide a quality image and various image scales, which can be particularly useful if you expect your image to be scaled during an animation.
Android 4.2 (API level 17) added support for mipmaps in the Bitmap class—Android swaps the mip images in your Bitmap when you’ve supplied a mipmap source and have enabled setHasMipMap(). Now in Android 4.3, you can enable mipmaps for a BitmapDrawable object as well, by providing a mipmap asset and setting the android:mipMap attribute in a bitmap resource file or by calling hasMipMap().

### Mipmap 的概念及其在计算机图形学中的用途 Mipmap 是一种用于优化纹理渲染的技术,在计算机图形学中广泛应用于减少因纹理缩放引起的视觉伪影以及提升性能。以下是关于 mipmap 的详细介绍: #### 1. 定义与基本原理 Mipmap 是一组预计算的低分辨率版本的原始纹理图像,每层被称为一个 **mip level** 或者 **level-of-detail (LOD)**[^2]。每一级 mip level 都是从前一级通过降采样得到的更小尺寸的纹理图。例如,假设原始纹理分辨率为 \(N \times N\) 像素,则其对应的 mipmaps 可能依次为 \(N/2 \times N/2\), \(N/4 \times N/4\), ..., 直至达到最小尺寸 \(1 \times 1\)。 这种技术的核心在于动态选择合适的 mip level 来匹配当前屏幕上的像素密度,从而避免直接使用高分辨率纹理带来的不必要的计算开销和内存带宽消耗。 #### 2. 解决的问题 - **Minification(缩小)问题**: 当纹理相对于目标几何体较大时,多个 texels 被映射到单个像素上。如果没有适当处理,容易造成锯齿效应或其他形式的失真[^3]。 - 使用 mipmapping 后,可以选取较低分辨率的 mip level 进行绘制,有效缓解上述现象。 - **Magnification(放大)问题**: 对于较小的纹理图案被拉伸显示的情况,虽然不常用 mipmaps 处理此场景,但仍可通过 bilinear/trilinear filtering 方法平滑过渡效果。 #### 3. 实现方式 实现过程中涉及到两种主要类型的插值方法: - **Bilinear Filtering**: 在同一 mip level 内部执行双线性插值运算,获取四个最近邻点之间的颜色权重组合结果作为最终输出值。 - **Trilinear Filtering**: 结合相邻两个不同层次间的数据完成三线性混合过程,进一步改善边界区域可能出现的阶梯状变化感。 另外还有更高阶的形式比如 Anisotropic Filtering (各向异性过滤),它能够更好地应对倾斜角度下的投影变形状况[^5]。 #### 4. 性能优势 利用预先构建好的多尺度表示结构,显著降低了实时渲染期间所需访问的数据量,进而减少了显存读取次数及相关延迟时间。这对于移动设备或者嵌入式平台尤为重要,因为它们往往受限于有限的 GPU 和 RAM 资源[^4]。 ```rust // Example pseudo-code snippet demonstrating how to load a texture and generate its mipmaps using OpenGL bindings within Rust. fn create_texture_with_mipmaps(image_data: &[u8], width: u32, height: u32) -> GLuint { let mut texture_id = 0; unsafe { gl::GenTextures(1, &mut texture_id); gl::BindTexture(gl::TEXTURE_2D, texture_id); // Load the original image into GL_TEXTURE_2D target at LOD=0 gl::TexImage2D( gl::TEXTURE_2D, 0, gl::RGBA as i32, width as i32, height as i32, 0, gl::RGBA, gl::UNSIGNED_BYTE, image_data.as_ptr() as *const _, ); // Generate subsequent levels automatically by driver/hardware support gl::GenerateMipmap(gl::TEXTURE_2D); // Set parameters controlling filter behavior during magnify/minify operations gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR_MIPMAP_LINEAR as i32); // Trilinear gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEAR as i32); // Bilinear Magnification return texture_id; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值