Galaxy Tab 出现奇怪的性能问题

2024-03-14

我正在编写 2d 教程,并且能够在 Samsung Galaxy Tab 上测试我当前的教程部分。

本教程只是在屏幕上随机移动默认图标。通过点击,我创建了一个新的移动图标。只要屏幕上有 25 个或更少的元素,Galaxy 上的一切都可以正常运行(始终为 60 fps)。

第 26 个元素的帧速率降至 25fps。

当我将图像的大小/尺寸更改为更大的图像时,在第 26 个元素之前我达到了不到 25fps。没关系。但在某些无法真正重现的元素数量处,帧从(大部分超过)10fps 下降到 1fps。

在我的 Nexus One 上,我可以添加 150 个元素,并且仍然具有 50fps。

我所做的:我将位图变量更改为静态变量,因此并非每个元素都有自己的图像,但都使用相同的图像。这消除了这种行为,但我怀疑这个解决方案是不是一个好的解决方案。神奇的数字 25 表明我只能以这种方式使用 25 个不同的图像。

有人知道什么会导致这种行为吗?难道是三星修改后的android版本的bug?

My 示例 Eclipse 项目可用 http://www.droidnova.com/blog/wp-content/uploads/2011/03/2d-tutorial-part5.zip。如果一些三星用户能用样品检查他们的性能,我将不胜感激。

edit

一位同事找到了解决方案。他改变了位图的加载方式

mBitmap = BitmapFactory.decodeResource(res, R.drawable.icon);

to

mBitmap = BitmapFactory.decodeStream(new BufferedInputStream(res.openRawResource(R.drawable.icon)));

但我们仍然不明白为什么它会这样工作......


好吧,我一直在查看您的项目,一切似乎都很好,但我对导致帧速率下降的原因有一个想法。

您在运行时分配对象。如果你不这样做,它会让你在开始时创建所有对象,因此你应该直接注意到显着的下降(如果我的解决方案不能解决你的问题)。

也就是说;我不知道对象池是否可以解决您的问题,但您可以尝试。在构造函数中初始化对象,而不是在onTouchEvent():

new Element(getResources(), (int) event.getX(), (int) event.getY())

你应该有类似的东西mElement.add(objectPool.allocate()),其中对象池在池中找到未使用的对象。此外,我们应该在该对象池中拥有指定数量的对象,从那里您可以检查是否是分配导致了此错误,或者是否是其他原因。

第 26 个元素的帧速率降至 25fps。

当(或者如果)你实现这个时,你应该直接看到帧速率下降(如果这不能解决你的问题),因为对象池会让你在开始时分配固定数量(例如可能100个元素?)(但你并没有在视觉上使用它们)。

另外,我在 Android 示例应用程序之一中使用了内存池模式(对象池)。在该样本中;我添加一行Canvas on an onTouchEvent()使用对象池(在运行时不分配)。在该源代码中,您可以轻松更改对象的总量并亲自检查并尝试。如果您想查看我的示例应用程序(和源代码),请写评论,我很乐意分享它,因为它尚未公开。我的评论在Swedish,但我想你应该能够理解,因为变量和方法都在English. :)

边注:您写道,您已经尝试(甚至成功)通过使您的Bitmap static。就像现在一样,您的元素具有不同的实例Bitmap,这会让你分配一个新的Bitmap每次你构建一个新对象时。这意味着每个对象都指向不同的Bitmap当他们使用相同的资源时。static是一个完全有效的解决方案(尽管神奇的数字 25 看起来很奇怪)。

This Bitmap案例可以比作OpenGL系统。如果您有 20 个对象,它们都应使用相同的资源,则有两种可能的解决方案:它们可以指向相同的 VRAM 纹理,或者它们可以指向不同的 VRAM 纹理(就像您不使用时的情况一样)static),但资源仍然相同。

EDIT:

这是我的 Android 示例应用程序 http://code.google.com/p/viktor-lanner/downloads/detail?name=Memory_Pool_pattern_PART_THREE_SOURCE.zip演示了内存池。

关于您的解决方案BitmapFactory,这可能取决于该类的工作方式。我不确定,但我认为其中之一decode...()方法生成一个新的Bitmap即使是同一个资源。可能的情况是new BufferedInputStream(res.openRawResource(R.drawable.icon))正在重用BufferedInputStream不过,从记忆来看,这是一个很大的猜测。

您应该做的(在这种情况下)是解码资源并将其引用存储在 Panel 类中,然后将该引用传递到new Element(bitmapReference, ...)反而。这样,您只需分配一次,并且每个元素都指向同一个Bitmap在记忆中。

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

Galaxy Tab 出现奇怪的性能问题 的相关文章

  • Android中将JSON数据存储到本地数据库

    好的 我创建了一个应用程序 它使用 JSON 从我的服务器检索数据 现在我想将检索到的数据存储在手机的本地存储 数据库中 我该怎么做 我是android编程新手 这是我从服务器收到的 JSON messages id 44 issender
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • 我无法再在后台应用程序中接收任何 FCM 消息

    当应用程序处于后台时 我无法再在应用程序中接收任何数据消息 请注意 直到最近它在我的应用程序中都运行良好 也许在我的开发环境最近更新后它停止工作了 我不能说 所以我尝试用快速入门 android 项目 https github com fi
  • 嵌套 XML 布局文件

    android 有没有办法从另一个布局文件引用 xml 布局文件 为了更好地解释 我有一个名为layout1 xml 和layout2 xml 的布局文件 我可以从layout1 xml引用layout2 xml吗 用这个
  • 当我单击“完成”键时,Android OnEditorActionListener() actionId 给出 0

    我创建了一个键盘 当用户输入数字时 它会输入特定的 EditText 但是当用户单击Done关键 它没有去setOnEditorActionListener但它关闭了键盘 这是我的代码 final EditText txtQty new E
  • 自动删除 Firebase 通知

    我有一个问题 我都读过让通知在 5 分钟后消失 https stackoverflow com questions 15648699 make notification disappear after 5 minutes and 几秒钟后清
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • 模拟器无法加载

    我正在使用 hello android 教程并通过 eclipse 创建 avd 启动模拟器时不使用图像 它只是显示一个黑色的后屏 中间有 ANDROID 字样 并且在 ANDROID 字样的末尾有一个闪烁的光标 我已按照 T 的步骤安装
  • Jetpack Compose:制作全屏(绝对定位)组件

    我怎样才能在全屏渲染树的深处制作一个可组合的 类似于Dialog可组合作品 例如 当用户单击图像时 它会显示该图像的全屏预览 而无需更改当前路线 我可以用 CSS 来做到这一点position absolute or position fi
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • 我在 android studio 中使用 kotlin 时出现错误

    为什么会出现这个错误 09 12 16 36 31 502 1886 1886 com getloction nourmedhat smartgate getlocation E AndroidRuntime 致命异常 main 进程 co
  • TextView.setMaxLines 不起作用?

    在我的应用程序中 我有一个屏幕 其中显示一些文本 然后显示一张照片 文本的长度是可变的 有时根本没有 有时很多 所以我想对其进行设置 以便文本永远不会占用超过几行 但可以滚动 为下面的图像留下足够的空间 我这部分的视图组件是以编程方式创建的
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 使 Recyclerview 固定高度并可滚动

    已解决以下检查答案 所以我试图为我的 Android 应用程序创建评论功能 我想在 recyclerview 中显示评论 然后在 recyclerview 下方有一个按钮和文本视图来添加评论 我想让 recyclerview 具有一定的高度
  • 如何知道我的应用程序的活动计数?

    我的应用程序中有多项活动 请考虑以下案例 Activity A 调用 Activity B B 调用 C 当用户按后退键时 C 生成通知并转到 B 现在再次按后退 因此将显示 A 再次按后退键也会终止 A 并显示通知 现在 当用户按下通知图
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 在数组列表中过滤 Filterable 不取消之前的过滤

    我看过过滤器方法文档 其中显示调用过滤器会取消所有先前未执行的过滤请求 并发布一个稍后将执行的新过滤请求 但我收到的实际回调有些不同 在我的实现中 它不会取消先前的过滤器请求并调用publishResults 最近一次搜索条件后的上一次搜索
  • 如何从DataSource.Factory获取数据

    我必须调用此方法才能获取所有人员 我根本无法修改这个方法 Query SELECT FROM PERSON TABLE ORDER BY NAME DESC abstract fun getElements DataSource Facto
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯

随机推荐