
游戏开发
文章平均质量分 73
小黄跑跑跑
这个作者很懒,什么都没留下…
展开
-
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 · 305 阅读 · 1 评论 -
unity工程检测无用代码
在实际开发过程中,我们会使用之前的工程来作为新游戏的基础或者是在开发过程中功能被抛弃了,很多类似的情况会导致工程中出现没用的代码。如果要手动删除,那势必要一个个文件去查看有没有引用,但可能存在文件被引用但那个文件没有被引用的情况,所以很难删干净,而且还费时间。这里提供一种方法(附代工具)来解决这个问题。解决方法:利用unity打包,1:生成IL2cpp的apk,一个设置PlayerSettings.SetManagedStrippingLevel(targetGroup, ManagedS原创 2021-09-26 11:40:52 · 547 阅读 · 0 评论 -
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 · 1894 阅读 · 0 评论 -
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 · 165 阅读 · 0 评论 -
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 · 479 阅读 · 0 评论 -
安卓U3D逆向从Assembly-CSharp到il2cpp
转载 https://zhuanlan.zhihu.com/p/32468958原创 2020-10-10 17:10:12 · 572 阅读 · 0 评论 -
池化思想 内存管理 减GC
在游戏开发当中,GC是一个重要的优化项,Unity厂家建议每帧别超过大概50B(大概这个数量级,我也记不清了),但是对于复杂点的游戏,各种Entity逻辑,动态结构,如果不进行优化的很难做到这个级别。下面提出一种池化思想,通过进行内存管理,来减少GC。中心思想是把释放的东西保存起来管理,要用时直接取出使用。下面直接来看代码:public abstract class PoolObject{ public IObjectPool _pool; public int InstanceId;原创 2020-08-06 15:00:28 · 333 阅读 · 0 评论 -
Unity UI框架设计(附代码链接)
最近的工作内容中有比较多UI的内容,学到了比较多有意思的东西,写几篇文章来分析一下。第一篇文章主要来进行需求分析和大致的实现思路。1:数据和UI的分离。采用MVC架构,模块耦合度低,重用性高。2:UI界面的打开需要能够实现以下功能:(1)能够正常打开一个界面。(2)能够在一个界面上打开另一个界面,重叠显示。(3)能够在一个界面上打开一个stack UI,打开时将之前的界面隐藏,关闭时能够将之前的界面显示出来。(4)能够在一个界面的固定位置位置打开一个UI。(5)有一个队列UI,能够逐个打开。 (6原创 2020-06-11 17:33:06 · 1865 阅读 · 0 评论 -
Unity UGUI AutoLayout
unity autolayout 总共有ContentSizeFitter LayoutElement HorizontalLayoutGroup VerticalLayoutGroup GridLayoutGroup AspectRatioContentSizeFitter 是用来控制自身大小的,它有minimum和preferredSize和Unconstrained三个选项,子节点中如果有layoutItem就会来控制这个节点的大小。比如我们有一个需求,一个文本后面有一个背景图,文字变多的时候背景原创 2020-05-22 18:48:05 · 296 阅读 · 0 评论 -
Unity UGUI 血条 伤害数字 优化
血条:游戏开发中,血条位置会因为角色位置改变而频繁进行刷新。这个过程会耗费比较多的性能,下面提出一些小的优化。1:血条缓存,这个是最基本的,不能因为血条出现一次重建一次,太费了。2:降低更新频率,可以尝试每五帧更新一次UI。(当然也可以是人物走了多少距离了再更新, 共同使用)3:将所有血条独立到一个Canvas下,因为一个canvas下的所有UI元素都是合在一个mesh中,如果界面中有大量静态元素会导致mesh重建消耗大的问题。4:画一个比屏幕更大的矩形区域(比如(screen.width+100原创 2020-05-20 15:45:38 · 2551 阅读 · 0 评论 -
Unity RectTransform分析
先来逐一介绍下RectTransform的property1:anchor,anchorMin和anchorMax是两个Vector2,锚点当anchorMin和anchorMax相等时,我们可以看到有一朵小菊花,表示该物体相对于父节点是绝对定位,如果anchorMin和anchorMax均为(0.5, 0.5),那么表示以父节点的中间位置进行定位,如果anchorMin和anchorMax...原创 2020-05-06 16:16:32 · 431 阅读 · 0 评论 -
游戏开发中数据层的观察者模式设计
在游戏开发中,一个数据层中的数据改变等事件会造成其它数据层的改变或者界面的改动。下面提供一种方法来解决这个问题。解决思路是一个数据层或者界面表达出对于其它数据层中的某个数据变化的兴趣,当事件发生时,触发自身的相应代码。相当于是观察者模式,解决多个对象依赖一个对象的情况。 public interface IDataChangeObserver { uint GetInte...原创 2020-05-06 12:09:36 · 235 阅读 · 0 评论 -
Unity GameObject 传递消息 SendMessage BroadcastMessage SendMessageUpwards
GameObject类有三种方法可以传递消息SendMessage BroadcastMessage SendMessageUpwards,区别如下 Sendmessage只能向自身传递消息,和自身同级的物体不会接收到消息。 BroadcastMessage向自身和所有子类发送消息,和自身同级的物体不会接收到消息。 SendMessageUpwards向自身和所有父类发送消息,和自身同级的物...原创 2020-04-29 18:06:06 · 1073 阅读 · 0 评论 -
代码设计思路总结1 接口设计 传值设计
关于代码设计的一些收获。Part1:最近关于代码设计的一些收获,将一些功能提炼成接口,这样代码清晰,使用也会更方便。使用前register,使用过程中就能调用接口相关的函数。 public class Test : ITestInterface { public string GetInfo1() { return "info1 of Test...原创 2020-04-27 17:26:31 · 399 阅读 · 0 评论 -
unity Coroutine 协程执行时机
图片来自于https://blog.youkuaiyun.com/qq_28768929/article/details/54340567可以看到流程中有yield waitforFixedUpdate,yield null, yield waitforSeconds, yield waitforEndOfFrame.unity的Cortinue是按照顺序在monoBehhaviour中执行的,并且如果...原创 2020-04-27 15:36:20 · 652 阅读 · 0 评论 -
Unity开发中的GC优化——数据缓存
情况:unity开发过程中,避免GC是很重要的一个问题。但该new的东西还是很多,放任不管的话就是产生挺多GC。那怎么办呢?下面提供一种思路。思路:把创建的变量缓存起来,最多缓存40个,缓存的数据能重复利用。这样能很大程度的避免GC,当然这样内存会耗费一点,不过大多数情况下这东西还是有点用的。使用:var res = PoolObject<List<int>>.A...原创 2020-04-21 17:27:47 · 443 阅读 · 0 评论 -
C#关键词解析 partial
含义Partial是局部类型的意思,允许我们将一个类,结构或者接口分成几个部分放在不同的cs文件中,编译的过程中会把各部分合并成一个类。适用情况:<1>类型比较大,可按照内容把类分成多个部分<2>部分代码为导出代码限制条件:<1>局部类型只支持类,结构题,接口,不支持枚举和委托<2>只有同一个命名空间中的局部类会被合并(无所谓是...原创 2020-04-19 11:19:58 · 325 阅读 · 0 评论 -
XLua Hotfix 常见问题分析 范型 重载等
最近做了下代码的热修复功能,主要为了修复线上出现的UI模块的bug.下面总结下遇到的问题。为什么要使用热修复以及为什么选择XLua?使用热修复是为了紧急修复一些线上bug,同时避免整包更新.选择XLua是因为它的hotfix能方便的接入到纯C#开发的代码中,效率还行.开发过程中需要注意什么?我把UI相关的命名空间都加到了配置中,打包过程中会对这些命名空间下的类型进行代码注入。开发过程中的只...原创 2020-04-08 23:08:57 · 989 阅读 · 0 评论 -
cocos2dx_实例分析getBoundingBox和getContentSize
1:分析BoundingBox.首先来看这样一段代码,其中HelloWorld的图片大小为195*270Node* pNode = Node::create();addChild(pNode);Sprite* pSprite1 = Sprite::create(&quot;HelloWorld.png&quot;);pNode-&amp;gt;addChild(pSprite1);Rect rt1 = pSpr...原创 2018-11-02 23:18:36 · 4212 阅读 · 0 评论 -
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 · 874 阅读 · 0 评论 -
cocos2dx_事件分发机制解析
1:事件分发原理cocos2dx中事件由触发到完成响应,主要由以下三部分组成:事件分发器EventDispatcher;事件EventTouch、EventKeyboard等;事件监听器EventListenerTouch、EventListenerKeyboard等。在cocos2dx中添加事件处理的流程Event是由系统产生的消息。Listener是程序中的消息处理函数,来处理分发...原创 2018-11-10 23:05:30 · 504 阅读 · 0 评论 -
寻路算法(A*算法)实现(附C++代码)
–需求是求A到B的最短路径。这里的行走方案是上下左右,左上、左下、右上、右下八个方向(这个根据实际情况实际处理)。蓝色的块是障碍,不能行走。步骤:–维护待处理点的队列,初始只有起点即A。–取出待处理点向各方向走。如果到达点还没有点到达过,那么将处理点作为这个到达点的前点(用于找出路径),并设置到达点的距离为处理点+距离。如果到达点已经有点到达过了,那么判断处理点的距离+两点距离是否小于...原创 2019-08-30 17:51:15 · 797 阅读 · 0 评论 -
C++ 基础知识梳理
本文主要描述1:const修饰符,2:模版相关内容,3:指针和引用的区别,4:内联与预定义,5:虚表相关内容。一:const修饰符const修饰符可以修饰函数,函数参数,函数返回值,变量等。(1)修饰函数 int function() constconst修饰函数表明在函数内不能修改对象数据成员且不能调用非const函数。因为在非const内部能修改数据成员,而const修饰的函数是不能改...原创 2019-09-02 17:48:45 · 126 阅读 · 0 评论