自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 Unity性能优化(5):脚本篇

这是因为与典型的C#对象相比,Gamcobject 和MonoBehaviour 是特殊对象,因为它们在内存中有两个表示:一个表示在于与管理C#代码相同的系统管理的内存中,C#代码是用户编写的(托管代码):另一个表示存在于另一个单独处理的内存空问中(本机代码)。Profiler.BeginSample(string name)和Profiler.EndSample()是Unity中的性能分析工具Profiler类提供的方法,用于在性能分析中标记开始和结束的样本。如果不需要,可以进行减少运行次数的处理。

2023-08-14 22:20:55 323

原创 Unity性能优化(4):批处理

DrawCall是一个从CPU发送到GPU中用于绘制对象的请求。着色器(Shader):是一种用于定义GPU应该如何渲染输入的顶点和纹理数据的简短程序。材质(Material):用于定义渲染对象外观的一种属性,是着色器的容器。帧调试器 (Frame Debugger) 可将正在运行的游戏的状态冻结到特定帧来自由回放,并查看用于渲染该帧的各个绘制调用(draw calls)。除了列出绘制调用,调试器还可逐个单步执行这些调用,以便您详细查看场景是如何从场景的图形元素构建的。

2023-08-14 22:20:42 133

原创 Unity性能优化(3):优化UGUI

大多数UI的常用实现是激活一个很大、透明的可交互元素来覆盖整个实体屏幕,并强制玩家必须处理弹出窗口才能进入下一步,但仍然允许玩家看到元素背后发生的事情(作为一种不让玩家完全脱离游戏体验的方法)。画布污染后,就需要为画布上的所有 UI对象重新生成网格,这个重新生成网格的过程不是一个简单的任务,也是Unity 项目中性能问题的常见来源。解决办法是,如果想禁用 UI 的一部分,只要禁用其子节点的画布组件,就可以避免布局系统的这种开销较大的重新生成调用。但是,可以用以下方式改善 SerollRect 组件的性能。

2023-08-14 22:20:22 177

原创 Unity性能优化(2):渲染管线和优化策略

这个过程的一般结果是,当着色器进行早期开发时所需的输入数据,现在一旦获得了期望的效果,就会变成冗余数据。GPU 使用更小的数据类型来计算比使用更大的数据类型(特别是在移动平台上)往往更快,因此可以尝试的第一个调整是用较小的版本(16位浮点)或甚至固定长度(12 位定长)替换浮点数据类型(32 位浮点)。LOD系统的核心思想是在越远的距离上使用更简化的模型,而在越近的距离上使用更具细节的模型。使用的纹理越多,则在调用过程中丢失的缓存就越多,制作的纹理越大,将它们传输到纹理缓存中所消耗的内存带宽就越多。

2023-08-10 20:04:15 442

原创 Unity性能优化(1):纹理文件

但是,当观察角度变得倾斜时,例如在倾斜的墙面或地面上,Anisotropic Filtering会在纹理平面之外的相邻纹理平面上采样,以提供更多的细节和清晰度。在物体离相机较远时,Mipmaps可以使用较低分辨率的纹理图像,减少了不必要的细节和像素,并且提供更快的渲染性能。因此,如果你使用非方形的纹理(比如宽度为512,高度为256的纹理),Unity会将其转换为大小为512x512的方形纹理,再进行纹理压缩。在Unity中,建议使用方形纹理的压缩率,主要是因为纹理压缩算法的工作方式,以及渲染硬件的特性。

2023-08-10 20:03:30 261

原创 数据结构和算法(18):希尔排序

我们前一节讲的直接插入排序,应该说,它的效率在某些时候是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,注意只是基本有序时,再对全体记录进行一次直接插入排序。我们需要采取跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。

2023-08-10 20:01:59 23

原创 数据结构和算法(17):堆排序

可惜的是,这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值》,然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如果可以做到每次在选择到最小记录的同时,并根据比较结果对其他记录做出相应的调整,那样排序的总体效率就会非常高了。

2023-08-10 20:01:17 24

原创 数据结构和算法(16):归并排序

归并排序是一种高效、稳定的排序算法,采用分治法(Divide and Conquer)策略将问题分解为较小的子问题,逐步解决这些子问题,最终将结果合并为整体解决方案。在大规模数据排序中表现出色,时间复杂度为O(n log n)。本文将介绍归并排序的工作原理、算法示例、复杂度分析以及与其他排序算法的比较。归并排序的工作原理 归并排序的过程分为三个主要阶段:分割、解决和合并。分割阶段:将待排序的数组分为两个子数组,直到无法再分割为止。解决阶段:递归地对两个子数组进行排序,直到每个子数组只有一个元素。

2023-08-10 19:59:40 30

原创 数据结构和算法(15):快速排序

即它也是通过不断比较和移动交换来实现排序的,只不过它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动交换次数。快速排序( Quick Sort)的基本思想是: 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

2023-08-10 19:56:49 52

原创 数据结构和算法(14):插入排序

插入排序法是将数组中的元素逐一与已排序好的数据进行比较,先将前两个元素拍好,再将第三个元素插入适当地位置,也就是说这三个元素莹然是已排序好的,接着将第四个元素加入,重复此步骤,直到排序完成为止。1.最坏情况和最平均情况需要n(n-1)/2次,时间复杂度为O(n^2);最好情况的时间复杂度为O(n)。4.此排序法适用于大部分数据已经排序或已排序数据库新增数据后进行排序的情况。5.因为插入排序法会造成数据的大量搬移,所以建议在链表上使用。3.因为只需要一个额外空间,所以空间复杂度为最佳。

2023-08-10 19:55:50 18

原创 数据结构和算法(13):选择排序

选择排序法(Selection Sort)可使用两种方式进行排序,即在所有数据中,若从大到小排序,则将最大值放入第一个位置;若从小到大排序,则将最大值放入到最后一个位置。例如,假设是从小到大排序,一开始在所有数据中心挑选一个最小项放在第一个位置,在从第二项开始挑选一个最小项放在第二个位置,以此重复,直到完成排序位置。

2023-08-10 19:55:15 17

原创 数据结构和算法(12):冒泡排序

冒泡排序法又称为交换排序法,是从观察水中气泡变化构思而成,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡从水底逐渐升到水面上一样。如此扫描过一次之后就可以确保最后一个元素是位于正确的顺序,接着逐步进行第二次扫描,直到完成所有元素的排序关系为止。不管数据是否已排序完成都会固定执行n(n-1)/2次。为了避免这种情况,可以使用“岗哨”概念既可以提前终端程序,又可以得到正确的排序结果,依次来提高程序执行的效率。

2023-08-10 19:53:38 33

原创 数据结构和算法(11):排序概述

在排序的过程中,数据移动方式可分为“直接移动”和“逻辑移动”两种。“直接移动”是直接交换存储数据的位置,而”“逻辑移动”并不会移动数据存储的位置,仅改变指向这些数据的辅助指针的值。

2023-08-10 19:51:46 26

原创 数据结构和算法(10):线索二叉树

另一个方面,我们在做遍历时,比如下图做中序遍历是,得到了HDIBJEAFCG这样的字符序列,遍历过后,我们可以知道,节点I的前驱是D,后继是B。在二叉链表上,我们只能知道每个节点指向其左右孩子节点的地址,而不知道某个节点的前驱是谁,后继是谁。对于一个有n个节点的二叉链表,每个节点有指向左右孩子的两个指针域,所以一共是2n个指针域。H的后继D,D的后继是I,I的后继是B,......,C的后继是G。假如,我们将所有的空指针域中的右孩子,改为指向他的后继节点,这样是否可以满足呢?,此时共有6个空指针域被利用。

2023-08-09 15:11:00 51

原创 数据结构和算法(9):二叉排序树

从上面的规则我们知道,左子树内的值一定小于树根,而左子树的值一定大于树根。因此,只需要利用“中序遍历”方式就可以得到从小到大排序好的数据。二叉树是一种很好的排序应用模式,因为在建立二叉树的同时,数据已经经过初步的比较,并按照二叉树的建立规则来存放数据。数据以递归的方式与树根进行比较,小于树根置于左子树,大于树根置于右子树。首先创建一个节点类,这个节点包含数据Data,左孩子Left的引用,右孩子Right的引用。之后的数据以递归的方式与树根进行比较,小于树根置于左子树,大于树根置于右子树。

2023-08-09 15:09:49 26

原创 数据结构和算法(8):树

如果没有孩子的节点,这个长子域就设置为-1.再添加一个右兄弟的指针域,这样不管有多少孩子,我们都可以通过不断查找有兄弟的方法,找到左右的孩子。这样的存储结构,我们可以 根据节点的parent指针很容易找到它的双亲,时间复杂度为O(1),直到parent为-1时,表示找到了树的根节点。层数(Level):树的层数,假设树根A为第一层,那么B、C、D节点的层数为2,E、F、G、H、I、J的层数为3。父节点(Parent):每一个节点有连接的上一层节点即为父节点,如图1,F的父节点为B,而B的父节点为A。

2023-08-09 15:09:07 39

原创 数据结构和算法(7):队列及C#Queue源码分析

入队和出队操作的时间复杂度可能为 O(n):数组实现的队列在进行入队和出队操作时可能需要移动元素,这可能导致 O(n) 的时间复杂度。然后把数据存到游标的位置,并且通过取余的方法,计算下一次添加数据时,末尾游标应该在的位置。随机访问效率较低:链表实现的队列不支持随机访问,如果需要访问特定位置的元素,需要从头开始遍历链表,时间复杂度为 O(n)。内存连续:数组实现的队列中的元素在内存中是连续的,这有助于提高缓存命中率,从而提高程序的性能。当扩容的时候,会使用到创建的数据,把原来的数据Copy到新的数组。

2023-08-09 15:07:47 161

原创 数据结构和算法(6):堆栈及C#Stack源码分析

Stack使用一个内部数组(_array)来存储栈中的元素。栈的大小(_size)表示当前栈中元素的数量。当向栈中添加元素(Push操作)时,首先检查栈的大小是否等于内部数组的长度。如果相等,说明数组已满,需要扩展数组以容纳更多元素。新数组的长度是当前数组长度的2倍,如果当前数组长度为0,则使用默认容量(_defaultCapacity)。由于内部数组的扩展策略是翻倍,可能会导致内存占用较高。在某些情况下,数组的实际使用大小可能远小于其分配的大小。

2023-08-09 15:06:42 114

原创 数据结构和算法(5):链式存储结构——链表、LinkedList

链表是一种常见的数据结构,用于存储和组织数据。它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表中的每个节点都是独立分配的,它们在内存中可以不连续地存储。链表的主要特点是灵活性。相比于数组,链表的长度可以动态地增加或减少,不需要预先分配固定大小的内存空间。这使得链表在需要频繁插入和删除元素的场景中表现优秀。一个单向链表节点基本上是由两个元素,即数据字段和指针所组成,而指针将会指向下一个元素在内存中的地址。在“单向链表”中第一个节点是“链表头指针”。

2023-08-09 15:04:52 241

原创 数据结构和算法(4):C#中的顺序存储——数组、List

顺序存储结构是一种数据的物理存储方式,它将数据元素按照其逻辑顺序依次存储在一片连续的存储空间中。常见的顺序存储结构有数组和线性表。

2023-08-09 15:01:28 1292

原创 数据结构和算法(3):线性表的基本特性

线性表(List):零个或多个数据元素的有限序列。首先它是一个序列。元素之间是有顺序的。若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。数据元素之间的关系是一对一的关系。其次,线性表强调是有限的。线性表元素的个数n(n≥0)定义为线性表的长度,当n=0时,成为空表。

2023-08-09 15:00:40 76

原创 数据结构和算法(2):时间复杂度和空间复杂度

正确性:是指算法至少应该具有输入、输出、和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。可读性:算法设计的另一目的是为了便于阅读、理解和交流。健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。时间效率高和存储量低(时间复杂度和空间复杂度)

2023-08-09 14:59:51 49

原创 数据结构和算法(1):基本概念

简单的理解就是关系。在我们的工作当中,我们所需要的如栈、队列、链表、以及查找、排序等算法,在编程语言的开发工具包中都有完美的实现,我们只需要掌握如何使用它们就可以了,为什么还要去弄懂这些算法原理呢?你将学习不同算法的设计思想、常见的算法模式和技巧,以及解决特定问题的有效算法。在数据结构和算法领域,还有许多具体的概念和技术需要学习,如哈希表、堆、红黑树、贪心算法、回溯算法等。2.2.链式存储结构:是把数据元素存放在任意的存储单元里,通过指针记录数据元素的地址,这组存储单元可以是连续的,也可以是不连续的。

2023-08-09 14:59:14 26

使用C#语言实现单向链表

包含方法: 链表的节点类(Node), 链表的是否为空, 输出链表数据, 链表的Add方法, 链表的Remove方法, 链表的串联方法, 链表的反转

2023-07-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除