標籤:手遊 安卓 開發引擎 程式 手遊開發 電腦
聲音管理
相容各種音頻檔案格式,位元速率和樣本率
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 onLoadResources() {
// 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