Unity ScrollView 滾動列表優化
Unity UGUI Scroll View(滾動列表)優化
在遊戲中很多UI設計都需要用到 Scroll View 控制元件,如排行榜、聊天室、揹包等。當需要顯示的物品達到千量級以上的時候,就會造成大量記憶體上的佔用,列表滾動的時候也會觸發大量的計算,會照成卡頓。接下來講講如何對其優化。
注意看Hierarchy中UIgrid下始終只有4個Item
優化策略就是隻建立螢幕能放下的item的數量再加一個的item。當列表滾動時利用再外面不顯示出來的item進行設定座標即可。
方法還是不難的,所以我們直接看程式碼,註釋只寫出了grid上移時的情況,其餘同理。
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using System.Collections;
using System.Collections.Generic;
using System;
public class ScrollViewManager : MonoBehaviour
{
public enum style {
Horizontal, //橫向分佈
Vertical, //縱向分佈
//HorizontalAndVertical //橫向和縱向分佈
};
public Image scrollView; //scroll view
public Image grid; //grid
public Scrollbar HorizontalScrollBar; //控制horizontal的scroll bar
public Scrollbar VerticalScrollBar; //控制vertical的scroll bar
public int number; //物品總數量
public float middle; //物品間距
public style manage_style; //管理物品方式
//public int rowCount; //行數
//public int columnCount; //列數
public string prefab_path; //物品資源路徑
private List<Item> itemList; //存放物品的列表
private float item_width; //物品寬度
private float item_height; //物品高度
private float sv_width; //scroll view寬度
private float sv_height; //scroll view高度
private float grid_width; //grid寬度
private float grid_height; //grid高度
private int row; //grid內可放物品行數
private int column; //grid內可放物品列數
private GameObject gameObj; //物品物件
private GameObject obj; //例項化物品物件
private Vector3 gridOldPosition; //grid更新前的座標
// Use this for initialization
void Start()
{
gameObj = Resources.Load(prefab_path) as GameObject; \\載入prefab
grid.transform.localPosition = new Vector3(0, 0, 0); \\設定grid座標
item_width = gameObj.transform.GetComponent<RectTransform>().rect.size.x; \\獲取Item寬高
item_height = gameObj.transform.GetComponent<RectTransform>().rect.height;
sv_width = scrollView.transform.GetComponent<RectTransform>().rect.size.x; \\獲取scroll view 寬高
sv_height = scrollView.transform.GetComponent<RectTransform>().rect.height;
HorizontalScrollBar.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(sv_width ,30); //設定scroll bar座標
HorizontalScrollBar.transform.localPosition = new Vector3(0, -sv_height, 0) + scrollView.transform.localPosition;
VerticalScrollBar.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(30, sv_height);
VerticalScrollBar.transform.localPosition = new Vector3(sv_width, 0, 0) + scrollView.transform.localPosition;
itemList = new List<Item>();
switch (manage_style) //根據所選排列方式初始化建立Item
{
case style.Horizontal:
grid_width = number * (middle + item_width);
column = GetUpInt(sv_width, item_width + middle) + 1;
if (grid_width <= sv_width)
{
column = number;
grid_width = sv_width;
}
grid_height = sv_height;
row = 1;
grid.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(grid_width, grid_height);
HorizontalInitItem();
break;
case style.Vertical:
grid_width = sv_width;
column = 1;
grid_height = number * (middle + item_height);
row = GetUpInt(sv_height, item_height + middle) + 1;
if (grid_height <= sv_height)
{
row = number;
grid_height = sv_height;
}
grid.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(grid_width, grid_height);
VerticalInitItem();
break;
//case style.HorizontalAndVertical: //既上下滑動又左右滑動的有些問題先註釋掉
// grid_width = columnCount * (middle + item_width);
// column = (int)(sv_width / (item_width + middle)) + 1;
// if (grid_width <= sv_width)
// {
// column = columnCount;
// grid_width = sv_width;
// }
// grid_height = rowCount * (middle + item_height);
// row = (int)(sv_height / (item_height + middle)) + 1;
// if (grid_height <= sv_height)
// {
// row = rowCount;
// grid_height = sv_height;
// }
// grid.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(grid_width, grid_height);
// HorizontalAndVerticalInitItem();
// break;
}
}
void HorizontalInitItem() {
for (int i = 0; i < column; i++) {
obj = Instantiate(gameObj);
obj.transform.SetParent(grid.transform);
obj.transform.localPosition = new Vector3(middle / 2 + item_width / 2 + (middle + item_width) * i, -(sv_height / 2), 0);
Item item = new Item();
item.BindGameObject(obj);
item.SetData(i + 1);
itemList.Add(item);
}
}
void VerticalInitItem() {
for (int i = 0; i < row; i++){
obj = Instantiate(gameObj);
obj.transform.SetParent(grid.transform);
obj.transform.localPosition = new Vector3(sv_width / 2, -(middle / 2 + item_height / 2 + (middle + item_height) * i), 0);
Item item = new Item();
item.BindGameObject(obj);
item.SetData(i + 1);
itemList.Add(item);
}
}
//void HorizontalAndVerticalInitItem() {
// for (int i = 0; i < row; i++) {
// for (int j = 0; j < column; j++) {
// obj = Instantiate(gameObj);
// obj.transform.SetParent(grid.transform);
// obj.transform.localPosition = new Vector3(middle / 2 + item_width / 2 + (middle + item_width) * j, -(middle / 2 + item_height / 2 + (middle + item_height) * i), 0);
// Item item = new Item();
// item.BindGameObject(obj);
// item.SetData(i * columnCount + j + 1);
// itemList.Add(item);
// }
// }
//}
// Update is called once per frame
//根據grid的移動調整Item的位置
void Update()
{
Vector3 gridNewPosition = grid.transform.localPosition;
float h = gridNewPosition.y - gridOldPosition.y;
float w = gridNewPosition.x - gridOldPosition.x;
gridOldPosition = grid.transform.localPosition;
if (h > 0.05f)
{ \\當最後一個Item的值小於總量
if (itemList[row - 1].GetData() < number)
{ \\當第一個Item的位置已經超出了一gird上一個Item的距離
while (itemList[0].GetGameObjectPosition().y + gridNewPosition.y > (item_height + middle) / 2)
{
Up(); //調整第一個Item位置
}
}
}
else if (h < -0.05f)
{
if (itemList[0].GetData() > 1)
{
while (itemList[row - 1].GetGameObjectPosition().y + gridNewPosition.y < -(sv_height + (item_height + middle) / 2))
{
Down();
}
}
}
if (w > 0.05f)
{
if (itemList[0].GetData() > 1)
{
while (itemList[column - 1].GetGameObjectPosition().x + gridNewPosition.x > (sv_width + (item_width + middle) / 2))
{
Right();
}
}
}
else if (w < -0.05f)
{
if (itemList[column - 1].GetData() < number)
{
while (itemList[0].GetGameObjectPosition().x + gridNewPosition.x < -((item_width + middle) / 2))
{
Left();
}
}
}
}
void Up(){
//將第一個Item的位置放到最後一個Itemd的下方
itemList[0].SetGameObjectPosition(itemList[row - 1].GetGameObjectPosition() + new Vector3(0, -(item_height + middle), 0));
itemList[0].SetData(itemList[row - 1].GetData() + 1);
itemList.Add(itemList[0]);
itemList.RemoveAt(0);
}
void Down() {
itemList[row - 1].SetGameObjectPosition(itemList[0].GetGameObjectPosition() + new Vector3(0, item_height + middle, 0));
itemList[row - 1].SetData(itemList[0].GetData() - 1);
itemList.Insert(0, itemList[row - 1]);
itemList.RemoveAt(row);
}
void Left(){
itemList[0].SetGameObjectPosition(itemList[column - 1].GetGameObjectPosition() + new Vector3(item_width + middle, 0, 0));
itemList[0].SetData(itemList[column - 1].GetData() + 1);
itemList.Add(itemList[0]);
itemList.RemoveAt(0);
}
void Right() {
itemList[column - 1].SetGameObjectPosition(itemList[0].GetGameObjectPosition() + new Vector3(-(item_width + middle), 0, 0));
itemList[column - 1].SetData(itemList[0].GetData() - 1);
itemList.Insert(0, itemList[column - 1]);
itemList.RemoveAt(column);
}
int GetUpInt(float a, float b) {
int i = 0;
while (a > 0) {
a -= b;
i++;
}
return i;
}
}
相關推薦
Unity ScrollView 滾動列表優化
Unity UGUI Scroll View(滾動列表)優化 在遊戲中很多UI設計都需要用到 Scroll View 控制元件,如排行榜、聊天室、揹包等。當需要顯示的物品達到千量級以上的時候,就會造成大量記憶體上的佔用,列表滾動的時候也會觸發大量的計算,會照成
[Unity優化] Unity CPU性能優化 (難度3 推薦4)
難度 sset 依賴關系 目錄 數量 異步 繼續 過多 compare 原文地址: http://www.cnblogs.com/chwen/p/4396515.html 前段時間本人轉戰unity手遊,由於作者(Chwen)之前參與端遊開發,有些端遊的經驗可以直接
Unity+NGUI性能優化方法總結
自己 開關 知識 hierarchy .com 最終 需要 監控 com 1 資源分離打包與加載 遊戲中會有很多地方使用同一份資源。比如,有些界面會共用同一份字體、同一張圖集,有些場景會共用同一張貼圖,有些會怪物使用同一個Animator,等等。可以在制作遊戲安裝包
Android ScrollView滾動實現大眾點評、網易雲音樂評論懸停效果
ins schema bar 音樂 layout mage for bin andro 今天聽著網易雲音樂,寫著代碼,真是爽翻了。 http://blog.csdn.net/linshijun33/article/details/47910833 網
Unity Shader入門精要學習筆記 - 第16章 Unity中的渲染優化技術
也會 檢測 特點 著色器 版本 切換 代碼優化 學習 順序 轉自馮樂樂的 《Unity Shader 入門精要》 移動平臺的特點 為了盡可能一處那些隱藏的表面,減少overdraw(即一個像素被繪制多次),PowerVR芯片(通常用於ios設備和某些Android設備)使用
上下滾動列表
turn tin add fff ica [0 f11 otto sed HTML <div class="box" id="box"> <a href="javascript:;" class="top"></a> <ul
用Vue來實現音樂播放器(十六):滾動列表的實現
com 作用 efault nor 大小 -s stylus BE ack 滾動列表是一個基礎組件 他是基於scroll組件實現的 在base文件夾下面創建一個list-view文件夾 裏面有list-view.vue組件 <template>
用Vue來實現音樂播放器(三十八):歌詞滾動列表的問題
vue 三十八 pla -s toggle 情況 TP 解決辦法 暫停 1、頻繁切換歌曲時,歌詞會跳來跳去 原因: // 歌詞跳躍是因為內部有一個currentLyric對像內部有一些功能來完成歌詞的跳躍 //每個currentLyric能實現歌曲的播放跳到相應的位置 是
直播APP開發之iOS開發中的列表優化思路
uic 異步化 軟件公司 死機 直播 隱藏 屬性 頁面 底層 APP開發中,列表可能是平時我們打交道最多的UI控件之一,其重要性不言而喻,對其性能的優化同樣至關重要。而對於iOS開發,列表就是我們常說的UITableView / UICollectionView。在進行直播
Unity大知識點列表
資料結構 陣列Array,ArrayList,List,Queue,Stack,之後補充 Unity常用外掛 NGUI(UI外掛),DoTween(補間動畫外掛),Tween(補間動畫外掛),EasyTouch(虛擬搖桿外掛),行為樹外掛(AI外掛), ShaderForge(S
第16章 Unity中的渲染優化技術
程式優化的第一條準則: 不要優化。程式優化的第二條準則(僅針對專家! 〉: 不要優化。一一Michael A. Jackson 在進行程式優化的時候,人們經常會引用英國的電腦科學家Michael A. Jackson 在1988 年的優化準則。Jackson 是想借此強調,對問題認識不清以及過度
unite2016上海Unity大會--Unity3D效能優化篇
目錄結構 專案簡述 策劃文案 美術資源 程式邏輯 效能優化 專案簡述 專案方向 時間計劃 人員配置 具體內容執行 GO! 策劃文案(略過) “兵馬未動,糧草先行~”,優秀的
UI_二級列表優化
package com.example.second_listview; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Expandabl
滾動列表導航欄吸頂功能的封裝
前言 因為遇到了這個需求,網上找了一圈也沒發現好用的外掛,於是就自己寫了一個,使用方式簡便,已經在專案的好幾處用到了這個外掛,現分享出來。 滾動列表頭部吸頂效果 安裝 Installation npm i sticky-list-headers --save 使用 usa
Unity 手遊專案優化建議(雜文)
1.載入預製體時,何時使用非同步載入。 當預製體複雜度很高,高達幾百ms,這個時候同步載入可能會造成中低端機型的卡頓。通過拆分預製體進行非同步載入可以避免卡頓,但可能所需的時間會更長。非同步所需的總時間比同步要長几倍,但是非同步分別發散到幾幀內後每幀的時間會很短因此卡頓就沒那麼嚴重了。(順
【Educational Codeforces Round 55 (Rated for Div. 2) E. Increasing Frequency】滾動陣列優化暴力
E. Increasing Frequency 題意 給你一個數列,你可以選擇在[l,r]區間同時加或者減一個值, 在一次操作後,這個序列最多有多少個值等於c 做法 首先我們要想明白的是,a[l]一定是等於a[r]的 如果a[l]!=a[r],那麼我們肯定可以縮小這個區間,
react native ScrollView滾動不起作用
在做頁面初始化時, 想ScrollView跳轉到指定的位置,結果發現程式碼執行了,卻沒有跳到指定的位置,程式碼如下。 componentDidMount(){
Android之ScrollView滾動到指定位置
一、ScrollView滾動到頂部或者底部: ScrollView scrollView = (ScrollView) findViewById(R.id.scroll_view); scrollView.post(new Runnable(){ @Override
Happy Matt Friends(利用滾動陣列優化陣列空間的DP)
Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Others) Total Submission(s): 5492 A
Android 對ScrollView滾動監聽,實現美團 大眾點評的購買懸浮效果
隨著移動網際網路的快速發展,它已經和我們的生活息息相關了,在公交地鐵裡面都能看到很多人的人低頭看著自己的手機螢幕,從此“低頭族”一詞就產生了,作為一名移動行業的開發人員,我自己也是一名“低頭族”,上下班時間在公交地鐵上看看新聞來打發下時間,有時候也會看看那些受歡迎的App的一些