UGUI 优化- DrawCall
前言
UI优化核心就是一点:减低DrawCall对于DC(DrawCall)问题来说
是游戏客户端程序员头疼以及及其影响性能的重大原因之一
DrawCall介绍简而言之,Draw Call 就是你的CPU要求你的GPU绘制一些东西。就是你的CPU在说:嘿,用这些纹理和照明信息在那角落画这张椅子。
12CPU准备好需要绘制的元素,对底层图形程序接口进行调用的过程。也可以理解为:CPU向GPU发布一条渲染指令,就是一次DrawCall的过程。简称DC。
DC作用问题是,准备Unity Draw Call会占用CPU大量的时间和精力。Unity必须将场景内容转换为GPU可以理解的格式。这个过程开销最昂贵的部分是设置正确的渲染参数,例如纹理,着色器,网格等。
手动设置渲染参数很繁琐。这就是游戏开发人员引入材质概念的原因。
这是否意味着我们不能一次绘制太多对象?
不是的。
游戏开发人员使用批处理将相似对象的渲染分组到同一个Draw Call中。这样,CPU只需支付一次绘制调用即可渲染多个对象。
在使用批处理时,我们要求GPU一次在这里,那里和后面画三把椅子,而不是在三个不同的时间。
为什 ...
IOC容器
Spring IOC容器基本原理2.2.1 IOC容器的概念IOC容器是具有依赖注入功能的容器,负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,而是由IOC容器进行组装。在Spring中,BeanFactory是IOC容器的实际代表者。
Spring IOC容器通过读取配置文件中的配置元数据来管理对象。配置元数据可以通过XML文件、注解、基于Java文件的配置或基于属性文件的配置来定义。
2.2.2 Bean的概念由IOC容器管理的应用程序对象称为Bean。Bean是由Spring容器初始化、装配及管理的对象。IOC容器通过配置元数据(由BeanDefinition代表)来确定如何实例化Bean、管理Bean之间的依赖关系以及管理Bean。
2.2.3 开始Spring Hello World之旅1. 准备需要的jar包核心jar包:
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springfra ...
关于CLR模型-GC
前言
对于C#的内存模型而言 CLR是最主要的处理内存的”中心”
类比下,C#是司机,.Net是汽车,CLR是引擎
本文可能后续还有补充,目前以GC为核心解析
基础概念
.Net:以下这些技术的统称
.Net Framework/.Net Core/Mono:3种将.Net技术打包发行的方式,其选择的组件不一定相同
CLR:Common Language Runtime 一个执行引擎,用于进行一类程序(CLI),提供类型系统、垃圾回收、JIT等功能;目前有3个主要实现,分别为coreclr用于.Net Core、desktop clr用于.Net Framework(有了coreclr之后才获得的一个相对”名称)、Mono(没人给其中的runtime部分单独取名)
CLI:Common Language Infrastructure 一个经标准化组织认证的标准(ECMA-335),定义了CLR的基础功能和其上执行的程序的标准
IL:Intermediate Language 用于将程序直接输入CLR的格式,包含二进制格式与其对应的文本格式;IL中的任何构造都与CLR内部严格一一对 ...
Unity Mulligan Renamer 使用教程
1. 项目介绍Unity Mulligan Renamer 是一个用于 Unity 编辑器的开源工具,旨在快速且安全地批量重命名多个资产或游戏对象。该工具提供了多种重命名方式,包括替换子字符串、添加前缀和后缀、添加数字以及删除字符等。通过这些功能,开发者可以高效地组织和管理项目中的资源。
2. 项目快速启动安装方法通过 Unity Asset Store 安装
打开 Unity Asset Store。
搜索并找到 Mulligan Renamer。
点击“添加到我的资源”并导入到你的项目中。
通过 GitHub 安装
在你的项目目录中,打开 Packages/manifest.json 文件。
添加以下依赖项:
12345{ "dependencies": { "com.redbluegames.mulligan": "https://github.com/redbluegames/unity-mulligan-renamer.git#upm" }}
保存文件并重新打开 ...
安卓打包流程
视频链接Unity 与 Android 、IOS (一) 打包与交互_哔哩哔哩_bilibili
基础 Bulid Setting安卓插件选择安卓的Platform并且下载unity的安卓插件
设置app基础
基础信息
Company Name
Product Name
Version
Default Icon
Icon
Resolution and Presentation 分辨率和显示
Orientation 和 Allowed Orientations for Auto Rotation
俩个用来选择是否自动旋转
Portrait 竖屏
Portrait Upside Down 竖屏
Landscape Right 横屏
Landscape Left 横屏
Preferences配置外部环境包External Tools
Unity防坑指南之Android路径缺失jdk、sdk和nd ...
帧同步和状态同步
前言
谈到网络游戏,不可避免要谈到现有两种比较常见的网游同步技术:帧同步和状态同步说到这两个名词,大家夸夸奇谈,都能讲上些许自己的见解,我反正啥也不懂这篇文章就打算着重学习一下这两种技术的基础和原理
网络同步的目标就是时刻保证多台机器的游戏表现完全一致。
网络同步 = 实时的多端数据同步+实时的多端表现
同步战斗逻辑是包括技能逻辑、普攻、属性、伤害、移动、AI、检测、碰撞等等的一系列内容,这常常也被视为游戏开发过程中最难的部分。
网络同步按大类来分有两种做法:状态同步和帧同步。需要强调的是这两个概念并不是简单的对立概念,其中的差异包括:”数据格式与内容”、“逻辑的计算位置”和“是否有权威服务器”等。
帧同步【LockStep】
LockStep的翻译是锁步同步,是齐步行军的意思
有明确的逻辑帧概念,按照固定的逻辑帧间隔同步数据
帧同步的战斗逻辑在客户端
在帧同步下,通信就比较简单了,服务端只转发操作,不做任何逻辑处理。
客户端按照一定的帧速率(理解为逻辑帧,而不是客户端的渲染帧)去上传当前的操作指令,服务端将操作指令广播给所有客户端,
当客户端收到指令后执行本地代码,如果输入的指 ...
C# 高级语法
前言
关于C#高级语法在重新拾起后发现很多有趣以及好用的特性与语法糖
本篇关于高级语法包括: 属性 常量 字段 泛型 委托 事件 匿名函数 lambda 协变逆变 预处理指令 反射 特性 多线程 迭代器
基础属性 get set定义 :属性Property—-看起来像变量的函数 如下
12345678910111213141516partial class Human{ public int Age{ get{ Log($“getAge{age}”); return age; } set{ Log($”setAge{age}=>{value}”); age=value; } }}//mainHuman human =new human();human.Age=32;//属性读写
这 ...
unityShader基本介绍
第二章:Shader和渲染管线【图形学】学长沉浸式啃《实时渲染4th》- 第一章图形渲染流水线 - 深入浅出实时渲染的整体流程_哔哩哔哩_bilibili
2.1 什么是Shader
GPU流水线上高度可编程阶段。
有特定类型的着色器,如顶点着色器,片元着色器。
依靠着色器可以控制流水线中的渲染细节。
2.2 什么是顶点、片元
顶点就是点,包含了空间坐标信息。
图元是由顶点组成的。一个顶点,一条线段,一个三角形或者多边形都可以成为图元。
片元是在图元经过光栅化阶段后,被分割成一个个像素大小的基本单位。
像素是最终呈现在屏幕上的包含RGBA值的图像最小单元。
2.3 渲染流水线
计算机从一系列的顶点数据,纹理等信息出发,将这些信息转换为图像,这个工作通常由GPU和CPU共同完成。
渲染流水线是概念流水线。
渲染流水线:应用阶段->几何阶段->光栅化阶段->像素化阶段
2.3.1 应用阶段这一阶段由三个主要任务:
准备场景数据
粗粒度剔除(可以剔除不可见物体,提升渲染性能)
输出渲染图元。
渲染图元:可以是点,线,三角面等。渲染图元会传递到几何阶段。
步骤 ...
unity UI优化
前言UI的性能问题是很多人容易忽视,但却很重要的一个问题。通常我们的UI界面可能是美术或者策划来拼接,然后程序在做功能时并不会去关心UI的布局是否合理,有没有动静分离,以及禁用一些不需要的属性。所以在团队中制定一些做UI的规则就很重要。
优化UI系统能带来什么收益呢?优化UI系统带来的最明显的收益就是包体和内存的骤减,以及整体界面的流畅度。
一个没有提前考虑性能和优化的UI系统带来的问题会有很多,比如:
APK包体过大内存占用过大(致应用闪退)Draw Call过多导致性能问题界面之间切换不流畅动画卡顿掉帧顶点过多造成游戏卡顿等等这里列举的只是一部分在很常见的未优化导致的问题。
2.如何进行优化,从哪下手?相信有些人开始优化的时候会觉得无从下手,或者跟着网上优化一下图片格式,或者删删减减无用资源等,说白了这些跟算不得上是优化,因为他就是基础必备的。
内存优化使用图集尽量一个界面的元素保持在一个图集中,一些公用的图片放到一张公用的图集中,比如关闭 \底框等,这样做的好处是我们打开一个界面就只需要把对应的图集加载到内存中,如果该界面引用到其他图集中图片,哪怕是一张,对应的整个图集都会加载 ...
游戏设计模式(逐步更新)
前言本文为游戏设计模式的读书笔记,
架构,性能和游戏重访设计模式命令模式定义:1将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。
理解1将命令封装,与目标行为解耦,使命令由流程概念变为对象数据
UML
要点
将一组行为抽象为对象,这个对象和其他对象一样可以被存储和传递,从而实现行为请求者与行为实现者之间的松耦合,这就是命令模式。
命令模式是回调机制的面向对象版本。
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
命令模式的优点有:对类间解耦、可扩展性强、易于命令的组合维护、易于与其他模式结合,而缺点是会导致类的膨胀。
命令模式有不少的细分种类,实际使用时应根据当前所需来找到合适的设计方式。
使用场合
命令模式很适合实现诸如撤消,重做,回放,时间倒流之类的功能。
基于命令模式实现录像与回放等功能,也就是执行并解析一系列经过预录制的序列化后的各玩家操作的有序命令集合。
引申与参考
最终我们可能会得到很多不同的命令类。为了更容易实现这些类,定义一个具体的基类,包含一些能定义行 ...