首页 > 代码库 > OGEngine学习笔记---资源加载
OGEngine学习笔记---资源加载
声音管理
兼容各种音频文件格式,比特率和样本率
OGEngine开源引擎兼容各种音频视频文件格式,并且引用了硬件加速技术,来对音频文件进行io读取,简化了资源的加载和读取写入的过程,大幅度减少应用卡顿、无响应的状况出现。
一个背景音乐 多个音效
OGEngine开源引擎在同一时间只能播放一首背景音乐,但是能同时播放多个音效。
首先自定义一个枚举类ConfigData,用来存放背景音乐key和音效key。
public class ConfigData {
/** 背景音乐*/
public static String BG = "bg";
/** 音效key*/
public static String SELECT = "select";
}
复制代码
OGEngine已默认开启声音播放和背景音
@Override
public EngineOptions onCreateEngineOptions() {
// TODO Auto-generated method stub
return this.mPixelPerfectEngineOptions.createEngineOptions();
}
复制代码
public EngineOptions createEngineOptions() {
float[] screenSize = this.getScreenSize();
float screenWidth = screenSize[0];
float screenHeight = screenSize[1];
float screenRatio = screenWidth / screenHeight;
float cameraWidth = this.mDesiredSize;
float cameraHeight = this.mDesiredSize;
if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_WIDTH) {
cameraWidth = this.mDesiredSize * screenRatio;
} else if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_HEIGHT) {
cameraHeight = this.mDesiredSize / screenRatio;
}
Class<?>[] parameterTypes = { float.class, float.class, float.class,
float.class };
Object[] argParam = { 0.0f, 0.0f, cameraWidth, cameraHeight };
Camera camera = ReflectionUtils.newInstance(this.mCameraCls,
parameterTypes, argParam);
EngineOptions engineOptions = new EngineOptions(true,
this.mScreenOrientation, new FillResolutionPolicy(), camera);
engineOptions.getTouchOptions().setNeedsMultiTouch(true);
engineOptions.getAudioOptions().setNeedsSound(true);
engineOptions.getAudioOptions().setNeedsMusic(true);
engineOptions.getRenderOptions().setDithering(true);
return engineOptions;
}
复制代码
我们可以在onLoadResources()方法中加载音乐和音效资源
@Override
protected void onl oadResources() {
// TODO Auto-generated method stub
// Log.i("TAG","onLoadResources----->加载资源中");
/**设置音乐资源读取目录*/
MusicFactory.setAssetBasePath("mfx/");
/**加载背景音乐*/
MusicRes.loadMusicFromAssets(ConfigData.BG,"bg.mp3");
/**设置音效读取目录*/
SoundFactory.setAssetBasePath("mfx/");
/**加载音效*/
SoundRes.loadSoundFromAssets(ConfigData.SELECT, "select.mp3");
}
复制代码
将音乐和音效的使用方法放在了按键精灵的点击事件里
bg2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(ButtonSprite pButtonSprite,
float pTouchAreaLocalX, float pTouchAreaLocalY) {
// TODO Auto-generated method stub
/**播放背景音乐*/
MusicRes.playMusic(ConfigData.BG, false);
/**播放声音*/
SoundRes.playSound(ConfigData.SELECT);
}
});
复制代码
纹理管理
纹理缓存
纹理缓存是将纹理缓存起来方便之后的绘制工作。每一个缓存的图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中的,不用在每一次绘制的时候都发送给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来讲,它的作用就是让系统知道如何剪切一个纹理,并返回一个这样的纹理给你。用例:
/** 创建2次幂高和宽的纹理图片组合对象 */
BitmapTextureAtlas bgTexture = new BitmapTextureAtlas(getEngine()
.getTextureManager(), 1024, 1024);
/** 生成纹理区域mTextureRegion */
mSnapdragonTextureRegion = BitmapTextureAtlasTextureRegionFactory
.createTiledFromAsset(bgTexture,
this.getActivity().getAssets(),
"gfx/testbg.jpg", 0, 0, 1, 2);
/** 在引擎中加载纹理组合 */
getEngine().getTextureManager().loadTexture(bgTexture);
复制代码
字体管理
默认字体加载
在游戏开发中,最耗费性能的是显示文本,因为必须临时在内存中将文本生成bitmap,然后将bitmap绑定到OpenGL的纹理并渲染出来。深入Java开发中缓存这个概念的重要性的影响,OGEngine做了一个精心的规划封装,由一种文本精灵类(Text)负责显示文本。并把生成文本bitmap并转换到纹理的职责进行封装,集成一个FontRes的类。它将要显示的字符串切分为单个的字符,通过canvas生成bitmap后缓存起来,然后在绑定纹理的时候合并,这样做的好处是当显示重复的字符时性能非常高。在onLoadResources()方法中加载音乐和音效资源
/**默认字体加载*/
FontRes.loadFont(512, 512, Typeface.create(Typeface.DEFAULT,
Typeface.NORMAL), 24, true, Color.WHITE, "Font24");
复制代码
创建文本精灵
/**创建文本精灵*/
Text text = new Text(0, 0, FontRes.getFont("Font24"), "hello OGEngine", this.getVertexBufferObjectManager());
/** 在场景里面添加精灵 */
this.attachChild(text);
复制代码
修改文本内容
text.setText("hello world");
复制代码
http://www.eoeandroid.com/forum-863-1.html
www.ogengine.com