IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> U3D性能优化之实例化渲染(GPU Instancing) -> 正文阅读

[游戏开发]U3D性能优化之实例化渲染(GPU Instancing)

GPU Instancing原理:

GPU Instancing条件:①使用相同材质②使用相同Mesh③正在视野中

GPU Instancing的适用范围:①大规模小物件渲染,同时有需要表现物件间的异样性,如花草

GPU Instancing能优化性能的原因:

①降低DrawCall

②降低SetPass calls

GPU Instancing的缺点:

①比起静态/动态合批,GPU Instancing可以规避合并Mesh导致的内存与性能上升的问题,但是由于场景中所有符合该合批条件的渲染物体的信息每帧都要被重新创建,并放入"统一/常量缓冲区"中,而碍于缓存区的大小限制,每一个Constant Buffer的大小要严格限制(不得大于64k)

GPU Instancing失败的情况:

①缩放为负值

②代码动态改动材质变量

③受限于常量缓冲区在不同设备上的大小的上限

④只支持一盏实时光,要在多个光源的情况下使用实例化,只能切换到延迟渲染路径,为了能够让这套机制运作起来,请将所需的编译器指令添加到我们着色器的延迟渲染通道中

GPU Instancing中断的情况:

①位置不相邻且中间夹杂着不同材质的其他物体

②一个批次超过1023个物体

③优先静态批处理,然后才到GPU Instancing

下面是GPU Instancing的实操

①先创建一个Material,并勾选"Enable GPU Instancing"

②搭建一个简单的场景,如下图

③脚本Spawner的代码内容如下

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class ObjData
{
    public Vector3 pos;
    public Vector3 scale;
    public Quaternion rot;
    public Color clr;
    public Material mtrl;
    public Matrix4x4 matrix
    {
        get
        {
            return Matrix4x4.TRS(pos, rot, scale);
        }
    }
}

public static class Extensions
{
    public static Vector4 ToVector4(this Color obj)
    {
        return new Vector4(obj.r, obj.g, obj.b, obj.a);
    }
}

public class Spawner : MonoBehaviour
{
    public Material mtrlBatched;//材质
    public Mesh mesh;//网格
    public int count;//生成的实例数量
    public Vector3 maxPos;//生成位置的范围
    private List<ObjData> batch = new List<ObjData>();//用来存要生成的实例的数据
    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < count; i++)
        {
            var obj = new ObjData()
            {
                pos = new Vector3(
                    UnityEngine.Random.Range(-maxPos.x, maxPos.x),
                    UnityEngine.Random.Range(-maxPos.y, maxPos.y),
                    UnityEngine.Random.Range(-maxPos.z, maxPos.z)
                ),
                rot = Quaternion.identity,
                scale = Vector3.one * 2,
                clr = UnityEngine.Random.ColorHSV(),
            };
            obj.mtrl = Instantiate<Material>(mtrlBatched);
            obj.mtrl.SetColor("_Color", obj.clr);
            batch.Add(obj);
        }
    }

    List<ObjData> curBatch = new List<ObjData>();
    private void DrawInstancedBatched()
    {
        for (int i = 0; i < batch.Count; i++)
        {
            var obj = batch[i];
            curBatch.Add(obj);
            if (curBatch.Count == 1023 || i == batch.Count - 1)
            {
                MaterialPropertyBlock props = new MaterialPropertyBlock();
                props.SetVectorArray("_Color",curBatch.Select(x=>x.clr.ToVector4()).ToList());

                Graphics.DrawMeshInstanced(mesh, 0, mtrlBatched, curBatch.Select(x => x.matrix).ToList(), props);
                curBatch.Clear();
            }
        }
    }

    // Update is called once per frame
    void Update()
    {
        DrawInstancedBatched();
    }

}

④点击运行可以看到Stats界面中,Batches为148,Saved by batching为49854,SetPass calls为3,优化效果非常不错

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:54:26  更:2022-01-25 10:55:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:45:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码