首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预置实例化性能提升

预置实例化性能提升
EN

Stack Overflow用户
提问于 2021-08-12 05:55:06
回答 2查看 196关注 0票数 0

所以我有一个多类别的按钮,在每个类别中有20多个项目。因此,当按钮被按下时,进行预置和实例化。问题是,当我实例化预制,我必须初始化它的信息,如名称,精灵,btn点击事件等,这将需要时间来实例化预制和游戏挂起。以下是代码

代码语言:javascript
复制
        for (int i = 0; i < prefab.Length; i++)
        {
            GameObject go = Instantiate(basePrefab) as GameObject;
            go.SetActive(true);
            go.transform.SetParent(prefabParent, false);
            go.transform.localScale = Vector3.one;
            go.GetComponent<Category>().Init(prefab[i]);
        }

此代码在按钮单击中被调用。或者,为了在start方法中获得一些性能,我已经在一个空的游戏对象上实例化了一些basePrefab,然后单击按钮,只需更改父对象并初始化它们。这种方法会带来一些好处,但游戏仍然会挂起2秒,下面是代码

代码语言:javascript
复制
        for (int i = 0; i < prefab.Length; i++)
        {
            GameObject go = InstantiatedGameObject[i];
            go.SetActive(true);
            go.transform.SetParent(prefabParent, false);
            go.transform.localScale = Vector3.one;
            go.GetComponent<Category>().Init(prefab[i]);
        }

有什么解决方案可以提高性能吗?

所以这里是关于预置的内容:基本上预置包括背景图像,蒙版图像在这个图像分类图像,选择图像和一个文本。在init函数中,类别图像更改和文本值更改也包含在init设置中的背景按钮,该按钮的单击事件

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-12 07:08:54

如果您知道类别和类别项的最大数量,则不必实例化它们。您可以根据物品的数量使用您激活和停用的插槽。在激活期间,您还可以将它们绑定和解除绑定到对象,您可以使用这些对象将正确的精灵和文本分配给按钮元素。

如果你事先不知道分类项目的数量,你仍然可以这样做,但如果有很多项目,从用户的角度来看,使用分页也是更可取的。

代码语言:javascript
复制
public class SomeUI : MonoBehavior
{
    public GameObject categorySlotsParent;
    public GameObject categoryItemSlotsParent;
    public Category[] categories;
    
    CategorySlot[] categorySlots;
    CategoryItemSlot[] categoryItemSlots;

    public void Awake(){
        
        categorySlots = GetComponentsInChildren<CategorySlot>();
        categoryItemSlots = GetComponentsInChildren<CategoryItemSlot>();
        AssignCategories(categories);
        
        if(categories.Length > 0 && categories[0] != null)
            SelectCategory(categories[0]);
    }
    
    void AssignCategories(Category[] categories){
        
        for(int i = 0; i < categorySlots.Length;  i++){
            if(i < categories.Length)
            {
                categorySlots[i].SetActive(true);
                categorySlots[i].AssignCategory(categories[i]);
            }
            else
            {
                categorySlots[i].SetActive(false);
                categorySlots[i].AssignCategory(null);
            }
        }
    }
    
    void AssignCategoryItems(CategoryItem[] categoryItems){
        
        for(int i = 0; i < categorySlots.Length;  i++)
        {
            if(i < categoryItems.Length)
            {
                categoryItemSlots[i].SetActive(true);
                categoryItemSlots[i].AssignCategoryItem(categoryItems[i]);
            }
            else
            {
                categoryItemSlots[i].SetActive(false);
                categoryItemSlots[i].AssignCategoryItem(null);
            }
        }
    }
    
    void SelectCategory(Category category){
        AssignCategoryItems(category.categoryItems);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-08-12 06:33:50

如果你的实例化对象是一个普通的对象,你可以通过预置来改进它,避免每次实例化和销毁这个对象。您有一个很好的工作流here示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68752281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档