標籤:
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的硬體縮放技術最佳化執行效率