libgdx thinking之资源生死有命

2024-05-15 10:58

本文主要是介绍libgdx thinking之资源生死有命,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果你对游戏资源管理这方面有经验,可以只看API了解Libgdx在这方面的策略和实现。

Disposable

AssetsManager

Poolable,Pool,Pools

/***************************************************************************************************************************************************************************************/

处理好内存释放是编程的任务之一,这对于占用内存不少而又要求运行流畅的游戏更是重要。虽然使用像java这样有良好垃圾回收机制的语言会省了很多功夫,但让垃圾回收器自动回收像图片音乐这样大的资源是不明智的,事实上它们由更底层的驱动来管理,释放这些资源还是需要开发者手动执行。而要做到细粒度地控制资源的生命周期在libgdx中并不是难事,开发者只需知道哪些资源需要释放(实现了Disposable接口),什么时候释放以及重载。如果这个工作有差错的话,你的游戏可能会出现内存泄漏或图片诡异地无法显示。

在libgdx中下面这些类实现了Disposable接口:

  • AssetManager
  • Bitmap
  • BitmapFont
  • BitmapFontCache
  • CameraGroupStrategy
  • DecalBatch
  • ETC1Data
  • FrameBuffer
  • Mesh
  • Model
  • ModelBatch
  • ParticleEffect
  • Pixmap
  • PixmapPacker
  • Shader
  • ShaderProgram
  • Shape
  • Skin
  • SpriteBatch
  • SpriteCache
  • Stage
  • Texture
  • TextureAtlas
  • TileAtlas
  • TileMapRenderer
  • com.badlogic.gdx.physics.box2d.World
  • all bullet classes
如果你创建了这些资源记得释放它们,你也不必强记这些类名,凡是有dispose接口的都需要在不再使用的时候释放,而释放它们的操作很简单:

treeTexture.dispose();
treeTexture=null
访问释放了的资源会出现无法捕捉的错误,所以在释放了之后需要对其引用赋空指针以便在开发调试时发现此类错误,当然这并不是必需的。还有libgdx中有个接口Gdx.app.getJavaHeap()和Gdx.app.getNativeHeap()可以获得虚拟机堆栈和底层堆栈的占用大小,打印它们帮助开发者在调试时了解内存使用情况。

下面讨论何时释放资源,假如你的游戏只是个用了几张图片一个背景音乐这样的小游戏,你大可以在游戏生命周期结束时释放它们,就是在重写ApplicationListener中的dispose方法中释放。如果再复杂点,你的游戏不只一个场景,有开始菜单场景和游戏场景,你使用了libgdx的Game-Screen来管理,而你也想要由开始菜单进入游戏后释放掉开始菜单用的资源,那你可以在重写Screen的hide方法中释放,hide方法会在该场景不再显示时调用。你也许发现了Screen还有个dispose接口但这个接口,但它并不参与场景的生命周期,它是框架作者开放出来的接口,如果开发者没有手动调用它,它将不会执行。至于你想在游戏结束时一次性释放所有资源还是分场景这样按需创建和释放,取决于你的游戏规模。

你有时会不会发现你的游戏在android上重启时图片诡异地无法显示,这是由于android应用的生命周期pause中openGL会自动销毁Texture这样的资源,而pause会在应用切入后台和退出前调用,你的游戏在切入后台后纹理会销毁但恢复时会自动重载(前提是你没做这样的设置Texture.setAssetManager(manager))但如果是退出后重启就不会自动重载纹理需要你再创建一遍,一般这不会有什么问题除非在资源的引用访问上没处理好就会出现诡异现象,例如你将资源声明为静态,这个问题你可以看看这篇博文慎用static。

看到这里你已经对资源的释放和重载有些新的认识,但苛刻的你仍觉得要管理资源需要更简洁安全的方案,Libgdx的AssetsManager可以很好满足你的要求(但如果你的游戏使用的资源很少就不必使用它了)。它可以异步加载大部分类型的资源而不一直占用渲染主线程所有可以做一个加载界面;它采用引用计数,资源可以共享即使加载了多次但实际只占用一处内存;持有所有资源的引用;允许透明地实现文件缓存。对于它的学习你可以查看这篇译文AssetsManager资源管理器。

对资源的良好管理并不局限于对创建释放的控制,重用池也是很有效的方法,对于子弹,怪物的重复生成更适合,libgdx的Action和particle就用使用到池。对于池的使用可以查看这篇来自宋大的转载对象池。


这篇关于libgdx thinking之资源生死有命的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991641

相关文章

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

caffe训练openpose相关资源

CPMTransformationParameter参数解析: https://www.jianshu.com/p/063a2159f0f2 genLMDB.py: https://www.jianshu.com/p/1cae32cbd36d OpenPose 参数说明: https://blog.csdn.net/zziahgf/article/details/84668319 openp

ubuntu内存资源使用情况监视

此处分享一个可以查看ubuntu系统中资源使用情况的指令,只需要在终端中输入一下这条指令即可: gnome-system-monitor

一个C++程序运行,从点击运行到控制台打印文本,电脑硬件的资源是如何调动的

当点击运行一个 C++ 程序并看到控制台输出文本时,计算机硬件和操作系统之间协同工作,完成了多个步骤。这些步骤涉及 CPU、内存、存储设备、操作系统和输入输出设备的共同作用。下面是一个详细的过程描述: 1. 程序加载 启动:当你点击运行一个可执行文件时,操作系统(通常是 Windows、Linux 或 macOS)的文件系统管理器识别请求,并启动加载程序。读取可执行文件:加载程序将可执行文件从

RK3288 资源汇总

用了一段时间的RK3288做开发,现汇总一下网上的学习资源: 1、九鼎创展: 源代码仓库:https://gitlab.com/9tripod/x3288_linux_new 百度云文档资料: 链接:http://pan.baidu.com/s/1qYcsAaK    密码:wmvi 更多可查看九鼎创展社区:http://bbs.9tripod.com/forum.php?mod=fo