自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (7)
  • 收藏
  • 关注

原创 drawcall,batch,setpass

2不同的GPU,相同的CPU,triangles/batch较小时,每秒绘制triangles接近,因为GPU的速度远高于CPU,当triangles/batch增大时,GPU导致效率的区别。GPU的速度要远远的高于CPU,绘制的瓶颈往往是CPU没有提交足够大的batch。结合项目中batch数量的实际情况,那么预计batch的消耗将占到CPU的20%量级。3对CPU来说,CPU耗费的周期与batch数的提交数量是呈现线性关系的。为了绘制更多的三角形,想尽所有的办法整合batch,绘制更多的物体。.....

2022-07-20 15:49:41 244 1

原创 学习笔记_C#基础

浅墨知乎阅读笔记——12.20P1命令模式是回调机制的面向对象版本。帧同步中Presentation可以通过接口来实现,也能通过类型加回调来实现。Input->Serialize->Network->Deserlize->Application最基本的处理输入的写法 if(Input.GetKeyDown(KeyCode.A)) DoSomething();这种写法的耦合比较重,且不太好处理联机的情况。如果改成if (Input.GetKeyDown(KeyCode.A))

2021-12-21 13:53:37 137

原创 unity工程检测无用代码

在实际开发过程中,我们会使用之前的工程来作为新游戏的基础或者是在开发过程中功能被抛弃了,很多类似的情况会导致工程中出现没用的代码。如果要手动删除,那势必要一个个文件去查看有没有引用,但可能存在文件被引用但那个文件没有被引用的情况,所以很难删干净,而且还费时间。这里提供一种方法(附代工具)来解决这个问题。解决方法:利用unity打包,1:生成IL2cpp的apk,一个设置PlayerSettings.SetManagedStrippingLevel(targetGroup, ManagedS

2021-09-26 11:40:52 433

原创 unity使用Attribute实现限制资源类型

Attribute代码[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]public class ResourceTypeAttribute : Attribute{ public ResourceTypeAttribute(Type type) { ResourceType = type; } public Type ResourceType;}Inspector代码v

2021-05-31 16:21:21 265 2

原创 C# string internPool

C#编译时会将string存储到PE metaData中,在程序运行时,将PE metaData载入到internPool中,并将这些字符串索引到internPool中的内存。string s = “Hello World”;string t = “Hello” + “World”;string g = new string(new char[11]{‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ’ ', ‘W’, ‘o’, ‘r’, ‘l’, ‘d’});string k = new stri

2021-05-31 15:48:54 242

原创 Unity 2020.3.8f1c1 Android GradleBuild,生成apk

第一次从头整理Unity工程的GradleBuild,总结一下。1:内容下载首先是下载安卓环境,直接通过unityHub下载就行,方便。(第一次下载的时候就下了一半就停止了,直接卸载了Unity,重新下载Unity以及AndroidSupport),当然自己游jdk,ndk,sdk设置进去也行。设置路径,Edit->Prefence->ExternalTools通过UnityHub下载还是这些会直接设置好。2:gradle工程以及apk生成勾选PlayerSetting中Buil

2021-05-25 17:54:08 29924

原创 Index from end operator ^和Range operator ..

看.NET文档发现两个有意思的语法,一个是反向索引操作符还有一个是范围操作符(个人翻译)。1:Index from end operator ^Available in C# 8.0 and later, the ^ operator indicates the element position from the end of a sequence. For a sequence of length length, ^n points to the element with offset length

2021-05-17 15:10:59 202

原创 C#的Dictionary实现原理分析

1:实现中的参数//哈希映射后首个元素在entries中的Indexint[] buckets;//存储Key,Value的数组,C#的dictionary是用数组来组织数据的Dictionary<TKey, TValue>.Entry[] entries;private struct Entry{public int hashCode;public int next;public TKey key;public TValue value;}//当前数据的数量int c

2021-01-15 18:17:36 1743

原创 UML类图绘制

类的属性表示:属性或者方法的可见性public : +private: -protected: #属性的表示方式:比如public string str;+ str : string方法的表示方式:private int Method(int a, string b){}- Method(int a, string b) : int类与类之间的关系表示:1:关联关系单向关联双向关联自关联2:聚合,是组成部分,相当于contain3:组合,

2020-12-21 11:44:54 103

原创 Unity的Editor代码总结

Unity的Editor代码总结:1:使用Unity自带的属性比如AddComponentMenu(),RequireComponent(),ContextMenu(),Range(),Multiline(),Header(),ToolTip(),Space()2:为某个脚本编写Editor代码,实现自定义显示using Editor;[CustomEditor(typeof(T))]public class TInspector : Editor{T t;void OnEnable()

2020-11-09 16:18:07 425

原创 安卓U3D逆向从Assembly-CSharp到il2cpp

转载 https://zhuanlan.zhihu.com/p/32468958

2020-10-10 17:10:12 495

原创 池化思想 内存管理 减GC

在游戏开发当中,GC是一个重要的优化项,Unity厂家建议每帧别超过大概50B(大概这个数量级,我也记不清了),但是对于复杂点的游戏,各种Entity逻辑,动态结构,如果不进行优化的很难做到这个级别。下面提出一种池化思想,通过进行内存管理,来减少GC。中心思想是把释放的东西保存起来管理,要用时直接取出使用。下面直接来看代码:public abstract class PoolObject{ public IObjectPool _pool; public int InstanceId;

2020-08-06 15:00:28 249

原创 C# Tuple(元组类) vs ValueTuple(值元组)

转载一篇比较详细的描述元组的文章。https://www.cnblogs.com/lavender000/p/6916157.htmlTuple是元组类,引用类型,多返回值可以这么用。static Tuple<string, int, uint> GetStudentInfo(string name){return new Tuple<string, int, uint>(“Bob”, 28, 175);}ValueTuple是值元组,值类型,多返回值可以这么用。st

2020-08-04 16:19:41 186

原创 AutoResetEvent 和 ManualResetEvent的使用和区别

参考文档:https://docs.microsoft.com/en-us/dotnet/api/system.threading.autoresetevent?view=netcore-3.1https://docs.microsoft.com/en-us/dotnet/api/system.threading.manualresetevent?view=netcore-3.1https://www.cnblogs.com/chenwolong/p/AutoResetEvent.html解析:.

2020-08-03 11:50:42 284

原创 .Net多线程初步了解

最近花时间了解了下.NetFramework的多线程,看了一个基础教程https://www.bilibili.com/s/video/BV1TJ411v7T7教程中对多线程的概念做了基础讲解,并且也有提到.NetFramework的多线程发展,如果对多线程不是很了解或者说想全面了解这块知识的也可以去看一下,内容相对简单。* 下面对我看这个视频的收获做一个总结。* 概念:线程是进程的一个实体,是CPU调度和分配的基本单位,它比进程更下能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在

2020-07-30 16:17:25 325

原创 Unity UI框架设计(附代码链接)

最近的工作内容中有比较多UI的内容,学到了比较多有意思的东西,写几篇文章来分析一下。第一篇文章主要来进行需求分析和大致的实现思路。1:数据和UI的分离。采用MVC架构,模块耦合度低,重用性高。2:UI界面的打开需要能够实现以下功能:(1)能够正常打开一个界面。(2)能够在一个界面上打开另一个界面,重叠显示。(3)能够在一个界面上打开一个stack UI,打开时将之前的界面隐藏,关闭时能够将之前的界面显示出来。(4)能够在一个界面的固定位置位置打开一个UI。(5)有一个队列UI,能够逐个打开。 (6

2020-06-11 17:33:06 1671

原创 Unity UGUI AutoLayout

unity autolayout 总共有ContentSizeFitter LayoutElement HorizontalLayoutGroup VerticalLayoutGroup GridLayoutGroup AspectRatioContentSizeFitter 是用来控制自身大小的,它有minimum和preferredSize和Unconstrained三个选项,子节点中如果有layoutItem就会来控制这个节点的大小。比如我们有一个需求,一个文本后面有一个背景图,文字变多的时候背景

2020-05-22 18:48:05 204

原创 Unity UGUI 血条 伤害数字 优化

血条:游戏开发中,血条位置会因为角色位置改变而频繁进行刷新。这个过程会耗费比较多的性能,下面提出一些小的优化。1:血条缓存,这个是最基本的,不能因为血条出现一次重建一次,太费了。2:降低更新频率,可以尝试每五帧更新一次UI。(当然也可以是人物走了多少距离了再更新, 共同使用)3:将所有血条独立到一个Canvas下,因为一个canvas下的所有UI元素都是合在一个mesh中,如果界面中有大量静态元素会导致mesh重建消耗大的问题。4:画一个比屏幕更大的矩形区域(比如(screen.width+100

2020-05-20 15:45:38 2041

原创 C# GetType() 和 typeof 的区别

原文链接:https://blog.csdn.net/letianok/article/details/7257117GetType和typeof()都能获得数据类型System.Type.1:GetType()方法继承自Object,因此C#中任何对象都具有GetType()方法,t.GetType(),其中t为变量名。2:typeof是操作符,typeof(t)的t必须是具体的类型名称,不可以是变量名称。比如有这样一个变量i:string str = new string();使用GetTy

2020-05-14 11:43:11 321

原创 Unity RectTransform分析

先来逐一介绍下RectTransform的property1:anchor,anchorMin和anchorMax是两个Vector2,锚点当anchorMin和anchorMax相等时,我们可以看到有一朵小菊花,表示该物体相对于父节点是绝对定位,如果anchorMin和anchorMax均为(0.5, 0.5),那么表示以父节点的中间位置进行定位,如果anchorMin和anchorMax...

2020-05-06 16:16:32 332

原创 游戏开发中数据层的观察者模式设计

在游戏开发中,一个数据层中的数据改变等事件会造成其它数据层的改变或者界面的改动。下面提供一种方法来解决这个问题。解决思路是一个数据层或者界面表达出对于其它数据层中的某个数据变化的兴趣,当事件发生时,触发自身的相应代码。相当于是观察者模式,解决多个对象依赖一个对象的情况。 public interface IDataChangeObserver { uint GetInte...

2020-05-06 12:09:36 197

原创 Unity GameObject 传递消息 SendMessage BroadcastMessage SendMessageUpwards

GameObject类有三种方法可以传递消息SendMessage BroadcastMessage SendMessageUpwards,区别如下 Sendmessage只能向自身传递消息,和自身同级的物体不会接收到消息。 BroadcastMessage向自身和所有子类发送消息,和自身同级的物体不会接收到消息。 SendMessageUpwards向自身和所有父类发送消息,和自身同级的物...

2020-04-29 18:06:06 871

原创 代码设计思路总结1 接口设计 传值设计

关于代码设计的一些收获。Part1:最近关于代码设计的一些收获,将一些功能提炼成接口,这样代码清晰,使用也会更方便。使用前register,使用过程中就能调用接口相关的函数。 public class Test : ITestInterface { public string GetInfo1() { return "info1 of Test...

2020-04-27 17:26:31 355

原创 unity Coroutine 协程执行时机

图片来自于https://blog.csdn.net/qq_28768929/article/details/54340567可以看到流程中有yield waitforFixedUpdate,yield null, yield waitforSeconds, yield waitforEndOfFrame.unity的Cortinue是按照顺序在monoBehhaviour中执行的,并且如果...

2020-04-27 15:36:20 494

原创 C# IEnumerable IEnumerator yield

先来看IEnumerable,接口只有一个函数GetEnumerator(). public interface IEnumerable { IEnumerator GetEnumerator(); }再来看IEnumerator,有moveNext()和Reset()函数,还有只读的current. public interface IEnumerator { ...

2020-04-27 15:19:31 207

原创 C# 类似于C++ Const的语法。

一直在想C#为什么没有类似于C++的const语法,对函数参数,函数返回值,以及对函数内容进行限制。记录下自己的发现。在C#中,数据类型分为值类型和引用类型。传递类型分为按值传递和按引用传递。对于函数参数和返回值其实C#是能进行限制的。对于函数参数有关键字in。public class Test{ public int Num; public Test(int val) ...

2020-04-24 20:07:21 551

原创 C#方法参数关键字 params in ref out 四种类型传递方式

申明方法参数时可以使用的关键字:params:指定该参数采用可变数量的参数。in:指定此参数由引用调用,但是只由调用方法读取。ref:指定该参数为引用传递,可能由调用方法读取或写入。out:指定此参数为引用传递,由调用方法写入。1. params:使用params关键字可以指定采用数目可变的参数可以发送参数申明中指定类型的逗号分隔的参数列表或者指定类型的参数数组,也可以不发送参数,那...

2020-04-23 20:05:22 993

原创 C#特殊字符 逐字符字符串@ 字符串内插$

1:概述特殊字符是预定义的上下文字符,用于修改最前面插入了此类字符的程序元素(文本字符串、标识符或属性名称)。 C# 支持以下特殊字符:@:逐字字符串标识符字符。$:内插的字符串字符。2:逐字字符串标识符字符 @作用1:加在C#关键字前面用作标识符。int @for = 1; print(@for);作用二:指示将原义解释字符串。string filename1 = @“c:\do...

2020-04-22 18:11:16 1136

原创 Unity开发中的GC优化——数据缓存

情况:unity开发过程中,避免GC是很重要的一个问题。但该new的东西还是很多,放任不管的话就是产生挺多GC。那怎么办呢?下面提供一种思路。思路:把创建的变量缓存起来,最多缓存40个,缓存的数据能重复利用。这样能很大程度的避免GC,当然这样内存会耗费一点,不过大多数情况下这东西还是有点用的。使用:var res = PoolObject<List<int>>.A...

2020-04-21 17:27:47 362

原创 C# 函数多个返回值 解决办法

编程中经常遇到有多个返回值的情况,下面提供了几种方法供参考。方法一:GetPerson(out var Name, out var Age, out var Male);Debug.Log(Name + " " + Age + " " + Male);public void GetPerson(out string name, out int age, out bool male){...

2020-04-20 17:36:41 3205

原创 C# 强引用和弱引用的区别 弱引用的使用

什么是强引用?Object obj = new Object(); 这就是一个强引用,内存分配一份空间用以存储Object数据。当一个对象被强引用的形式创建的时候,本身引用的次数为1.接着Object o = obj.执行之后Object的引用次数为2.所以强引用会导致被引用的对象的引用次数加1.什么是弱引用?弱引用可以保持该对象的引用,但是不增加对象的引用次数。这样GC就能在必要时候释放...

2020-04-19 22:07:49 750

原创 C#关键词解析 partial

含义Partial是局部类型的意思,允许我们将一个类,结构或者接口分成几个部分放在不同的cs文件中,编译的过程中会把各部分合并成一个类。适用情况:<1>类型比较大,可按照内容把类分成多个部分<2>部分代码为导出代码限制条件:<1>局部类型只支持类,结构题,接口,不支持枚举和委托<2>只有同一个命名空间中的局部类会被合并(无所谓是...

2020-04-19 11:19:58 244

原创 XLua Hotfix 常见问题分析 范型 重载等

最近做了下代码的热修复功能,主要为了修复线上出现的UI模块的bug.下面总结下遇到的问题。为什么要使用热修复以及为什么选择XLua?使用热修复是为了紧急修复一些线上bug,同时避免整包更新.选择XLua是因为它的hotfix能方便的接入到纯C#开发的代码中,效率还行.开发过程中需要注意什么?我把UI相关的命名空间都加到了配置中,打包过程中会对这些命名空间下的类型进行代码注入。开发过程中的只...

2020-04-08 23:08:57 875

原创 C++基础知识梳理

一:类型转换1:const_cast 去除指针或引用的const属性。转换常量指针为非常量的指针,并且仍然指向原来的对象。转换常量引用为非常量的引用,并且仍然指向原来的对象。const_cast一般用户修改指针。如const int * ptr;int array[4] = {1,2,3,4};const int* c_ary = Ary;int* ary2 = const_c...

2019-09-06 15:12:58 166

原创 C++ 基础知识梳理

本文主要描述1:const修饰符,2:模版相关内容,3:指针和引用的区别,4:内联与预定义,5:虚表相关内容。一:const修饰符const修饰符可以修饰函数,函数参数,函数返回值,变量等。(1)修饰函数 int function() constconst修饰函数表明在函数内不能修改对象数据成员且不能调用非const函数。因为在非const内部能修改数据成员,而const修饰的函数是不能改...

2019-09-02 17:48:45 88

原创 寻路算法(A*算法)实现(附C++代码)

–需求是求A到B的最短路径。这里的行走方案是上下左右,左上、左下、右上、右下八个方向(这个根据实际情况实际处理)。蓝色的块是障碍,不能行走。步骤:–维护待处理点的队列,初始只有起点即A。–取出待处理点向各方向走。如果到达点还没有点到达过,那么将处理点作为这个到达点的前点(用于找出路径),并设置到达点的距离为处理点+距离。如果到达点已经有点到达过了,那么判断处理点的距离+两点距离是否小于...

2019-08-30 17:51:15 710

原创 cocos2dx_Shader简单实例入门

Shader是图形学方面的知识,不太好入门,下文用一个比较简单的例子来体验下shader。先看创建的代码ShaderSprite.hpp#include "CCSprite.h"class ShaderSprite : public cocos2d::Sprite{public: void initWithShader(const char* vertexShader, con...

2018-11-12 23:11:30 752

原创 cocos2dx_事件分发机制解析

1:事件分发原理cocos2dx中事件由触发到完成响应,主要由以下三部分组成:事件分发器EventDispatcher;事件EventTouch、EventKeyboard等;事件监听器EventListenerTouch、EventListenerKeyboard等。在cocos2dx中添加事件处理的流程Event是由系统产生的消息。Listener是程序中的消息处理函数,来处理分发...

2018-11-10 23:05:30 430

原创 cocos2dx_实例分析getBoundingBox和getContentSize

1:分析BoundingBox.首先来看这样一段代码,其中HelloWorld的图片大小为195*270Node* pNode = Node::create();addChild(pNode);Sprite* pSprite1 = Sprite::create(&amp;quot;HelloWorld.png&amp;quot;);pNode-&amp;amp;gt;addChild(pSprite1);Rect rt1 = pSpr...

2018-11-02 23:18:36 3956

Unity接入Sqlite案例,包括Assetbundle下载

Unity中实现Sqlite接入,能够极大的降低mono内存。现在流程中包括Assetbundle和StreamingAsset.在android,ios,windows,macOS都已经过验证。

2022-12-08

DumpCompare.rar

DumpComp

2021-09-26

Il2CppDumper-v6.6.5.zip

IL2CppDumper

2021-09-26

HearthStoneExporter.rar

炉石记牌器导出工具

2021-05-20

Spring.rar

Damping 阻尼:阻止简谐运动的惯性运动,相当于弹簧的摩擦力。为0时简谐运动过程不会主动停止,为1时简谐运动过程不会发生; Elasticity 弹性:决定回振移动强度,在简谐运动过程中作为额外的作用力将节点拉到还原位置,相当于弹簧的弹力。为0时系统形变不会主动还原,为1时形变不会发生; Stiffness 刚性:限制最大振动幅度与方向,保证碰撞处理前节点不会跑到指定范围外,相当于弹簧的硬度。为0时不发挥作用,0到1时限制范围从2倍原始距离到0线性衰减; Inert 惯性:限制形变幅度,在每一帧的简谐运动迭代发生前,无条件随物体整体运动拉动节点,拉动距离为Inert * 整体运动距离;

2020-07-03

DynamicBone.zip

dynamicBone的具体实现方法。 Damping 阻尼:阻止简谐运动的惯性运动,相当于弹簧的摩擦力。为0时简谐运动过程不会主动停止,为1时简谐运动过程不会发生; Elasticity 弹性:决定回振移动强度,在简谐运动过程中作为额外的作用力将节点拉到还原位置,相当于弹簧的弹力。为0时系统形变不会主动还原,为1时形变不会发生; Stiffness 刚性:限制最大振动幅度与方向,保证碰撞处理前节点不会跑到指定范围外,相当于弹簧的硬度。为0时不发挥作用,0到1时限制范围从2倍原始距离到0线性衰减; Inert 惯性:限制形变幅度,在每一帧的简谐运动迭代发生前,无条件随物体整体运动拉动节点,拉动距离为Inert * 整体运动距离;

2020-07-03

UIProject.rar

1:数据和UI的分离。采用MVC架构,模块耦合度低,重用性高。 2:UI界面的打开需要能够实现以下功能: (1)能够正常打开一个界面。(2)能够在一个界面上打开另一个界面,重叠显示。(3)能够在一个界面上打开一个stack UI,打开时将之前的界面隐藏,关闭时能够将之前的界面显示出来。 (4)能够在一个界面的固定位置位置打开一个UI。(5)有一个队列UI,能够逐个打开。 (6)能够显示弹窗,弹窗在上层。 3:粒子特效的显示问题。 4:界面的重复利用,unity prefab初始化是一个比较耗时的过程,如果能够将使用过的prefab缓存,那么就能通过内存换取性能。 5:界面的打开流程大致定为OnUIInit, OnUIOpen, OnUIShow, OnUIHide, OnUIClose。 UI被创建的过程中会调用OnUIInit和OnUIOpen,其中OnUIInit只会被调用一次。 OnUIShow会在界面显示的时候调用,setGameobjectActive(true)时也会去调用OnUIShow,主要是针对一些界面打开时需要播放动画以及以及协程或者其它相关的内容。 OnUIHide相对于OnUIShow,是在关闭显示时调用。 6:父界面和子界面之间的消息通知

2020-06-11

MFC按行读取txt文件,以空格分隔字符,并转换为double型

MFC按行读取txt文件,以空格分隔字符,并转换为double型

2016-03-15

空空如也

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

TA关注的人

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