OGEngine學習筆記---資源載入

來源:互聯網
上載者:User

標籤:手遊   安卓   開發引擎   程式   手遊開發   電腦   

聲音管理

相容各種音頻檔案格式,位元速率和樣本率

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 onLoadResources() {

  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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.