java - 将大位图存储到内存中或不断解码较小的位图
问题描述
(如果您想跳过所有这些文本,您可以直接进入底部的“短问题”版本)
大家好!
我是一名初级 android 开发人员,目前正在创建一个 2D RPG 游戏。它基本上由一张地图组成,玩家在该地图上行走(在 8 个可能的方向 - 西、西北等)并与物体、生物和其他人互动。玩家的角色行走动画由每个可用行走方向的 9 个精灵组成,总共 72 个精灵。我在单独的 .png 文件和有组织的精灵表中都有这些精灵。
直到几天前,我一直在游戏中使用单个精灵。我会将它们的可绘制 ID 加载到一个int[][]
数组中,然后,当要绘制每一帧时,我会解码(使用BitmapFactory.decodeResource()
方法)必要的精灵并将其传递给我的渲染器类,然后再绘制它。
经过一番思考,我决定尝试使用精灵表,因为精灵图像的不断解码让我很困扰。为此,我使用所有需要的精灵解码包含精灵表的位图并将其存储到成员变量中。根据下一帧所需的精灵,我的程序将从精灵表中裁剪出所需的精灵(之前保存到内存中),根据播放器的设备需要调整它的大小,然后将其传递给我的渲染器以便绘制。
问题是,我不知道哪种方法更有效!虽然很容易测量解码后的精灵表位图在播放器内存(大约 4MB)中占用了多少内存(当存储在成员变量中时),但很难知道我的程序用于不断解码小的位图需要多少内存,这对应于各个精灵。有人对我如何进行这种比较有任何见解吗?或者也许可以分享与这个主题相关的以前的经验?我已经搜索了好几个小时,尽管找到了很多关于如何有效加载位图的有用信息和对库(如 Glide、Fresco 和 Picasso)的建议,但我仍然找不到答案,也找不到更好的方法。提前致谢!
简短的问题:是不断解码小位图还是只解码一次大位图然后根据需要从中裁剪更小的位图更好?
PS:我知道在我的游戏中创建动画的两种方法都可能效率低下。但是,为了我的学习(我创建这个游戏的主要目标),我不想使用像 AndEngine 和 libgdx 这样的游戏引擎。我也开始学习 OpenGL ES(我读过它提供了很好的加载和显示位图的工具),但是在我的游戏中实现它需要完全重新制作,我现在对此不感兴趣。
解决方案
推荐阅读
- angular - 如何获取查询列表
在 VIEW 中传递给服务方法 - sql - 试图为三个编号的序列返回一个 Count,
- javascript - 为什么导入 react-router-dom 会报错?找不到模块:无法解析“反应”
- javafx - 与自定义 CellFactory 节点交互将行添加到 TableView 选择列表?
- .net-core - 在没有身份的情况下使用 Azure AD 身份验证时无法更改“拒绝访问路径”
- c# - 有没有办法在我的编辑器中查看一个类的所有成员(或至少属性),包括它的基类?
- java - 使用 Java 更改计算器
- html - 3边有两个不同宽度的边框
- javascript - 如何从 Firebase 托管到 AWS Lambda 函数进行跨域请求
- pandas - 如何使用 2 列选择一行