Unity笔记

2018-06-05  本文已影响0人  灰的狼

http://www.cnblogs.com/alan777/p/6204759.html

Unity函数调用

协程

yield return 0;

这会产生垃圾是因为发生了装箱,如果我们只是想要等待一帧,而不产生垃圾,最好是使用下面的代码:

yield return null;
while (!isComplete)
{
    yield return new WaitForSeconds(1f);
}

如果缓存了WaitForSeconds,可以减少很多垃圾:

WaitForSeconds delay = new WaitForSeconds(1f);
while (!isComplete)
{
    yield return delay;
}

组织我们的代码以便最小化垃圾回收的影响

下面的例子中,结构体包含了字符串,垃圾回收器必须要检查整个数组。

public struct ItemData
{
    public string name;
    public int cost;
    public Vector3 position;
}
private ItemData[] itemData;
public class DialogData
{
    private DialogData nextDialog;
    public DialogData GetNextDialog(){
        return nextDialog;
    }
}

这里,我们重构代码,返回下一个DialogData的实例id,替代返回实例本身。这就不需要引用对象,也就不会增加垃圾回收器的负载了。

public class DialogData
{
    private int nextDialogID;
    public int GetNextDialogID() {
        return nextDialogID;
    }
}

降低要渲染的对象数量

蒙皮

如果游戏是GPU限制,那么第一件事就是找到GPU瓶颈的原因。GPU性能最常被填充率限制,尤其在移动平台,但是显存带宽和顶点处理也可能影响。让我们检查这些问题,并且学习引起问题的原因,怎么诊断和怎么修复问题。

填充率

填充率是指GPU在屏幕上每秒可以渲染的像素数。如果我们的游戏收到填充率的限制,意味着我们的游戏每帧尝试绘制的像素数量超过了GPU的处理能力。

检查是否填充率引起了游戏GPU限制很简单:
如果确认了填充率引起了问题,有几个方法可以解决问题:

显存带宽

显存带宽是指GPU读写它的专用内存的速度。如果我们的游戏受限于显存带宽,通常意味着我们使用的纹理太大了,以至于GPU无法快速处理。

我们可以按如下方法检查是否显存带宽的问题:
如果是显存带宽的问题,我们需要降低纹理的内存占用。针对不同的游戏通常有不同的最佳解决方案,这里我们提供几个优化纹理的方法:

顶点处理

顶点处理的消耗受两件事情影响:必须渲染的顶点数量,以及在每个顶点上要进行的操作数量。
如果我们的游戏是GPU限制,并且已经确认了不是填充率和显存带宽引起的问题,那么就很可能是顶点处理引起的。如果是这种情况,那么尝试减少GPU顶点处理的数量很可能会获得性能提升。

有一些方法可以减少顶点数量或者在每个顶点上执行的操作数量:
上一篇下一篇

猜你喜欢

热点阅读