【轉】Unity3D研究院之使用Android的硬體縮放技術最佳化執行效率

來源:互聯網
上載者:User

標籤:

Andoird太頭疼了,尤其有些機器就是螢幕大別的硬體條件都很爛,為了最佳化渲染效率可以試試安卓的硬體縮放技術,我在真機上已經測試通過,效率確實提升了很多,FPS直線上升。。

原理如下 http://android-developers.blogspot.it/2013/09/using-hardware-scaler-for-performance.html

但是需要拿到Unity android的GLSurfaceView,可是我試過了很多辦法就是拿不到它,不過還好Unity 直接提供了方法。

找一個合適的地方調用如下方法即可,這個方法在IOS和Android上都支援,但是經過測試IOS沒必要使用,在android上還是很有必要使用的。

Screen.SetResolution(960,640,true);

這樣會強制把螢幕的解析度指定成960X640. 但是你的目標裝置的解析度可能不是3:2的,所以你需要做一個演算法,假設搭建介面的時候是960X640,此時運行在1280X760的解析度上,1280X760 和 960X640 等比換算一下 即可。代碼我就不貼了。。。使用如下代碼可以取出當前手機的螢幕解析度,根據演算法算一下就行了。

int width = Screen.currentResolution.width;
int height = Screen.currentResolution.height;

還有一點需要注意,經過我的測試發現 橫屏遊戲時 Android切到後台在返回前台渲染地區變成豎屏了。 所以每次切到前台的時候一定要強制設定一下解析度。

 
1234567 void OnApplicationPause(bool paused){Logger.Print("paused:", paused);if (!paused) {            Screen.SetResolution(960,640,true);}}

還有個問題就是當調用Screen.SetResolution(960,640,true); 緊跟著就開啟NGUI介面,可能會造成UI閃爍一下。我想最好可以通過unity的GLSurfaceView在java內層去設定解析度,但是我不知道怎麼取到GLSurfaceView,或者如果有朋友知道請在下面留言告訴我一下。

做一個比較簡單的介面, 介面上就寫上 “正在載入中..”幾個大字,因為背景是黑的閃就閃吧反證我們的策劃說能忍。。

 
123456 IEnumerator Start(){                Screen.SetResolution(960,640,true);yield return new WaitForSeconds(0.1f);//在下面代碼裡面在處理設定完解析度以後的邏輯}

可能我上面寫 Screen.SetResolution(960,640,true); 可能會誤導大家,我舉個裡例子。開發的時候布的介面是 960X640 ,此時運行在 1280X720上。 那麼 修改後的解析度 就是 Screen.SetResolution(1138,640,true);

因為 1138 = 1280/(720/640)但是你還要去考慮 比 960X640 大的情況 或者 比 960X640小的情況。 總之就是等比例的計算 目標解析度。如果一個是960 另一個就按比例算, 如果一個是640 另一個也按比例算。 

設定解析度以後不會影響到你的代碼原有的任何邏輯,效率確實提升了很多,建議大家最好在android上用一下。嘿嘿。歡迎大家在下面給 @雨松MOMO 留言,大家一起討論。。

我在補充一下: 這個方法不會影響NGUI的自適應,也不會影響遊戲原有的任何邏輯也不用在改別的代碼,在各種Android解析度上都可行,效率就可以提升很多。我們項目已經轟轟烈烈的使用了,唯一的缺點就是設定解析度的時候螢幕會閃一下。可以做一個黑屏 或者 幾個字“正在載入中” 。。 所以我想在java層去改, 但是拿不到GLSurfaceView 。。如果有知道的朋友請在下面留言告訴我。謝謝。

這兩天測試發現有時候按下手機的關機鍵,然後在返回遊戲發現遊戲螢幕豎過來了(我們是橫屏遊戲)。而且是隨機性的,效果如所示:

 

 

在這兩篇文章中我找到了答案

http://blog.k-res.net/archives/1702.html

http://stackoverflow.com/questions/7185644/android-opengl-crazy-aspect-ratio-after-sleep

解決這個問題需要在java這一層來配合,需要改一下你的UnityPlayerNativeActivity.java

 
12345678910111213141516171819202122232425 private int width,height;// Setup activity layout@Override protected void onCreate (Bundle savedInstanceState){requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState); getWindow().takeSurface(null);setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);getWindow().setFormat(PixelFormat.RGB_565); mUnityPlayer = new UnityPlayer(this);if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,                       WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(mUnityPlayer);mUnityPlayer.requestFocus(); //儲存一下遊戲螢幕的寬和高DisplayMetrics dm = getResources().getDisplayMetrics();width = dm.widthPixels;height = dm.heightPixels; }

還是在這個類裡。

 
123456789101112 // This ensures the layout will be correct.@Override public void onConfigurationChanged(Configuration newConfig){super.onConfigurationChanged(newConfig);//在這裡強制設定一下螢幕的寬和高mUnityPlayer.getView().getLayoutParams().width = width;mUnityPlayer.getView().getLayoutParams().height = height;Log.v("unity", width+" " + height ); mUnityPlayer.configurationChanged(newConfig); }

好了,目前我用這個方法已經完美解決了這個問題,大家如果還有什麼好得經驗分享,歡迎在下面給我留言。

 

  • 本文固定連結: http://www.xuanyusong.com/archives/3205
  • 轉載請註明: 雨松MOMO 2014年09月24日 於 雨松MOMO程式研究院 發表

【轉】Unity3D研究院之使用Android的硬體縮放技術最佳化執行效率

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.