首页 > 代码库 > OGEngine学习笔记---资源加载

OGEngine学习笔记---资源加载

声音管理

兼容各种音频文件格式,比特率和样本率

OGEngine开源引擎兼容各种音频视频文件格式,并且引用了硬件加速技术,来对音频文件进行io读取,简化了资源的加载和读取写入的过程,大幅度减少应用卡顿、无响应的状况出现。



一个背景音乐 多个音效

OGEngine开源引擎在同一时间只能播放一首背景音乐,但是能同时播放多个音效。

首先自定义一个枚举类ConfigData,用来存放背景音乐key和音效key。

  1. public class ConfigData {

  2.         /** 背景音乐*/

  3.         public static String BG = "bg";

  4.         /** 音效key*/

  5.         public static String SELECT = "select";

  6. }

复制代码


OGEngine已默认开启声音播放和背景音

  1.         @Override

  2.         public EngineOptions onCreateEngineOptions() {

  3.                 // TODO Auto-generated method stub

  4.                 return this.mPixelPerfectEngineOptions.createEngineOptions();

  5.         }


复制代码

  1.         public EngineOptions createEngineOptions() {

  2.                 float[] screenSize = this.getScreenSize();

  3.                 float screenWidth = screenSize[0];

  4.                 float screenHeight = screenSize[1];

  5.                 float screenRatio = screenWidth / screenHeight;


  6.                 float cameraWidth = this.mDesiredSize;

  7.                 float cameraHeight = this.mDesiredSize;

  8.                 if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_WIDTH) {

  9.                         cameraWidth = this.mDesiredSize * screenRatio;

  10.                 } else if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_HEIGHT) {

  11.                         cameraHeight = this.mDesiredSize / screenRatio;

  12.                 }

  13.                 Class<?>[] parameterTypes = { float.class, float.class, float.class,

  14.                                 float.class };

  15.                 Object[] argParam = { 0.0f, 0.0f, cameraWidth, cameraHeight };

  16.                 Camera camera = ReflectionUtils.newInstance(this.mCameraCls,

  17.                                 parameterTypes, argParam);

  18.                 EngineOptions engineOptions = new EngineOptions(true,

  19.                                 this.mScreenOrientation, new FillResolutionPolicy(), camera);

  20.                 engineOptions.getTouchOptions().setNeedsMultiTouch(true);

  21.                 engineOptions.getAudioOptions().setNeedsSound(true);

  22.                 engineOptions.getAudioOptions().setNeedsMusic(true);

  23.                 engineOptions.getRenderOptions().setDithering(true);

  24.                 return engineOptions;

  25.         }

复制代码

我们可以在onLoadResources()方法中加载音乐和音效资源

  1. @Override

  2.         protected void onl oadResources() {

  3.                 // TODO Auto-generated method stub

  4.                 // Log.i("TAG","onLoadResources----->加载资源中");

  5.                 /**设置音乐资源读取目录*/

  6.                 MusicFactory.setAssetBasePath("mfx/");

  7.                 /**加载背景音乐*/

  8.                 MusicRes.loadMusicFromAssets(ConfigData.BG,"bg.mp3");

  9.                 /**设置音效读取目录*/

  10.                 SoundFactory.setAssetBasePath("mfx/");

  11.                 /**加载音效*/

  12.                 SoundRes.loadSoundFromAssets(ConfigData.SELECT, "select.mp3");

  13.         }

复制代码


将音乐和音效的使用方法放在了按键精灵的点击事件里

  1. bg2.setOnClickListener(new OnClickListener() {

  2.         @Override

  3.         public void onClick(ButtonSprite pButtonSprite,

  4.                 float pTouchAreaLocalX, float pTouchAreaLocalY) {

  5.                         // TODO Auto-generated method stub

  6.                         /**播放背景音乐*/

  7.                         MusicRes.playMusic(ConfigData.BG, false);

  8.                         /**播放声音*/

  9.                         SoundRes.playSound(ConfigData.SELECT);

  10.         }

  11. });

复制代码


纹理管理

纹理缓存

纹理缓存是将纹理缓存起来方便之后的绘制工作。每一个缓存的图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中的,不用在每一次绘制的时候都发送给GPU。因此一个应用消耗大部分内存的就是Texture(也就是纹理),它几乎占用了90%的应用内存,所以我们应该尽可能的去减小我们应用的纹理内存使用,否则我们的应用程序将会被系统kill掉。


纹理 Texture

OGEngine开源引擎所提供的纹理用类,但Texture本身并没有提供加载图片的方法,必须通过TextureRegionFactory类(更准确的说,依赖它内部封装的TextureRegion、BuildableTexture等类)与之合作才可以加载纹理。除此之外,OGEngine开源引擎要求所加载纹理(图片)大小必须为2的整数次幂。目前我们通常使用的是BitmapTextureAtlas,它是Texture的一个子类。 mTextureOptions:纹理渲染方式NEAREST:Nearest滤波,实现上依赖GL_NEAREST做不光滑过滤,纹理环绕模式为GL_CLAMP_TO_EDGE,显示速度快画质差BILINEAR:双线性插值,实现上依赖GL_LINEAR做线性滤波,纹理环绕模式为GL_CLAMP_TO_EDGE,显示速度慢画质佳REPEATING_NEAREST:与NEAREST同为Nearest滤波,但纹理环绕模式为GL_REPEAT,会自动填充纹理上的空白区域,显示速度较快画质差REPEATING_BILINEAR:与BILINEAR同为双线性插值,但纹理环绕模式为GL_REPEAT,会自动填充纹理上的空白区域,显示速度很慢画质佳(低端机跑此模式异常悲剧,高端机尚可) 下列四个与上面相同,多了支持Alpha通道渲染NEAREST_PREMULTIPLYALPHABILINEAR_PREMULTIPLYALPHAREPEATING_NEAREST_PREMULTIPLYALPHAREPEATING_BILINEAR_PREMULTIPLYALPHA


纹理区域TextureRegion

TextureRegion的父类是抽象类BaseTextureRegion,主要功能也被封装在BaseTextureRegion类当中,OGengine开源引擎提供了TextureRegionFactory这个工厂类用以简化构建TextureRegion的流程。单就TextureRegion来讲,它的作用就是让系统知道如何剪切一个纹理,并返回一个这样的纹理给你。用例:

  1. /** 创建2次幂高和宽的纹理图片组合对象 */

  2.                 BitmapTextureAtlas bgTexture = new BitmapTextureAtlas(getEngine()

  3.                                 .getTextureManager(), 1024, 1024);


  4.                 /** 生成纹理区域mTextureRegion */

  5.                 mSnapdragonTextureRegion = BitmapTextureAtlasTextureRegionFactory

  6.                                 .createTiledFromAsset(bgTexture,

  7.                                                 this.getActivity().getAssets(),

  8.                                                 "gfx/testbg.jpg", 0, 0, 1, 2);

  9.                 /** 在引擎中加载纹理组合 */

  10.                 getEngine().getTextureManager().loadTexture(bgTexture);

复制代码


字体管理

默认字体加载

在游戏开发中,最耗费性能的是显示文本,因为必须临时在内存中将文本生成bitmap,然后将bitmap绑定到OpenGL的纹理并渲染出来。深入Java开发中缓存这个概念的重要性的影响OGEngine做了一个精心的规划封装,由一种文本精灵类(Text)负责显示文本。并把生成文本bitmap并转换到纹理的职责进行封装,集成一个FontRes的类。它将要显示的字符串切分为单个的字符,通过canvas生成bitmap后缓存起来,然后在绑定纹理的时候合并,这样做的好处是当显示重复的字符时性能非常高。在onLoadResources()方法中加载音乐和音效资源

  1. /**默认字体加载*/

  2.                 FontRes.loadFont(512, 512, Typeface.create(Typeface.DEFAULT,

  3.                                 Typeface.NORMAL), 24, true, Color.WHITE, "Font24");

复制代码


创建文本精灵

  1. /**创建文本精灵*/

  2. Text text = new Text(0, 0, FontRes.getFont("Font24"), "hello OGEngine", this.getVertexBufferObjectManager());

  3. /** 在场景里面添加精灵 */

  4. this.attachChild(text);

复制代码

修改文本内容

  1. text.setText("hello world");

复制代码

 http://www.eoeandroid.com/forum-863-1.html

www.ogengine.com