Java.Lang.IllegalArgumentException: 无效的位图格式在启动时间歇性出现
Java.Lang.IllegalArgumentException: invalid Bitmap format Intermittently on startup
我正在使用 Firebase Testlab 在各种 android 设备上进行压力测试,并且(在某些云测试设备上)发生异常异常,导致在启动时加载纹理时出现黑屏.我们有主要的 activity onCreate() 生成 MainPage,然后 运行s Init() 加载纹理。它还会在暂停时转储纹理并通过再次调用 Init() 重新加载 onResume。这是错误:
Java.Lang.IllegalArgumentException: invalid Bitmap format
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at offset 12
at Java.Interop.JniEnvironment.StaticMethods.CallStaticVoidMethod(Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) at offset 110
at Java.Interop.JniPeerMembers.JniStaticMethods.InvokeVoidMethod(System.String encodedMember, Java.Interop.JniArgumentValue* parameters) at offset 24
at Android.Opengl.GLUtils.TexImage2D(System.Int32 target, System.Int32 level, Android.Graphics.Bitmap bitmap, System.Int32 border) at offset 112
at DoodleSmash.Droid.MainActivity.LoadTexture(System.String name) at offset 65
at DoodleSmash.MainPage.Init() at offset 689
似乎认为位图的格式不对,但我从未在其他设备上看到过这个问题,我在本地有 运行 个模拟器和几个物理设备。这是加载纹理代码:
public int LoadTexture(string name)
{
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(MainActivity)).Assembly;
System.IO.Stream stream = assembly.GetManifestResourceStream("DoodleSmash.Droid." + name);
Android.Graphics.Bitmap bm = Android.Graphics.BitmapFactory.DecodeStream(stream);
int tex;
GL.GenTextures(1, out tex);
GL.BindTexture(TextureTarget.Texture2D, tex);
GLUtils.TexImage2D((int)TextureTarget.Texture2D, 0, bm, 0);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
return tex;
}
TexImage2D 是似乎失败的功能,我真的不知道为什么。有任何想法吗?它是间歇性的,并且在启动时不一致地发生。图片都是PNG。也许我需要先在 onCreate 函数中清除所有纹理内存?任何帮助将不胜感激。
我明白了,对于旧的 API 和旧手机,位图格式需要 ARGB_8888,可以通过以下方式更改不可变位图来实现:
Bitmap bmp_Copy = bmp_Base.copy(Bitmap.Config.ARGB_8888,true);
那就回收旧的吧。
答案来自:
我正在使用 Firebase Testlab 在各种 android 设备上进行压力测试,并且(在某些云测试设备上)发生异常异常,导致在启动时加载纹理时出现黑屏.我们有主要的 activity onCreate() 生成 MainPage,然后 运行s Init() 加载纹理。它还会在暂停时转储纹理并通过再次调用 Init() 重新加载 onResume。这是错误:
Java.Lang.IllegalArgumentException: invalid Bitmap format
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at offset 12
at Java.Interop.JniEnvironment.StaticMethods.CallStaticVoidMethod(Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) at offset 110
at Java.Interop.JniPeerMembers.JniStaticMethods.InvokeVoidMethod(System.String encodedMember, Java.Interop.JniArgumentValue* parameters) at offset 24
at Android.Opengl.GLUtils.TexImage2D(System.Int32 target, System.Int32 level, Android.Graphics.Bitmap bitmap, System.Int32 border) at offset 112
at DoodleSmash.Droid.MainActivity.LoadTexture(System.String name) at offset 65
at DoodleSmash.MainPage.Init() at offset 689
似乎认为位图的格式不对,但我从未在其他设备上看到过这个问题,我在本地有 运行 个模拟器和几个物理设备。这是加载纹理代码:
public int LoadTexture(string name)
{
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(MainActivity)).Assembly;
System.IO.Stream stream = assembly.GetManifestResourceStream("DoodleSmash.Droid." + name);
Android.Graphics.Bitmap bm = Android.Graphics.BitmapFactory.DecodeStream(stream);
int tex;
GL.GenTextures(1, out tex);
GL.BindTexture(TextureTarget.Texture2D, tex);
GLUtils.TexImage2D((int)TextureTarget.Texture2D, 0, bm, 0);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
return tex;
}
TexImage2D 是似乎失败的功能,我真的不知道为什么。有任何想法吗?它是间歇性的,并且在启动时不一致地发生。图片都是PNG。也许我需要先在 onCreate 函数中清除所有纹理内存?任何帮助将不胜感激。
我明白了,对于旧的 API 和旧手机,位图格式需要 ARGB_8888,可以通过以下方式更改不可变位图来实现:
Bitmap bmp_Copy = bmp_Base.copy(Bitmap.Config.ARGB_8888,true);
那就回收旧的吧。
答案来自: