ECS学习笔记(3)
AttributesEntitas提供了各种属性在生成代码时提供特殊功能。代码生成器支持以下与类,接口和结构一起使用的属性:
[Context]将组件添加到指定的Context,如果没有指定则会添加到默认Context中(Jenny 设置面板中定义的第一个Context)。例:
12345[Game]public class ViewComponent : IComponent{ public GameObject gameObject;}
将View组件添加到Game Context中,生成代码后会在Generated/Game/Components文件夹下生成GameViewComponent类。
允许同时指定多个Context名称。如果用于Class或者Struct上首先会在Generated/Components生成 {classname}Component的组件,然后同上例:123456789[Game]public class ContextView { public GameObject gameObject;}[Ga ...
ECS学习笔记(1)
关于ECS框架在ECS中每个基本单位都是一个实体,一个实体由N个组件组成。然后拥有相同组件的实体会被特定的系统处理特定的逻辑。E(ntity)——C(omponent)——S(ystem)
Entity 实体,组件的载体本身并无意义,拥有什么功能完全取决于拥有什么组件。但是可以通过在游戏中增加或删除组件来改变实体的行为。
Component 组件,包含了代表其对应特性的数据,所以组件中没有任何方法。
System 系统,用来处理一个或多个具有相同组件的实体,即系统中没有任何数据。
Jenny设置面板
Project Path C#项目工程文件路径。
Target Directory 自动生成代码的路径。
Assemblies 引用程序集的路径,这里的默认值也是Unity自动引用的路径,除非自己修改过。
Contexts 需要生成的上下文,后面会介绍上下文。
Ignore Namespaces 生成的代码文件名称是否忽略命名空间。
Entity实体实体作为ECS的三大基本概念之一,实体作为组件的载体,本身并无实际意义,最核心的数据便是唯一ID,和Untiy的Game ...
ECS学习笔记(2)
IInitializeSystem从这章这开始我们以一个小案例分章介绍Entitas为我们提供的五种类型的System。案例的主要功能比较简单,大致的流程如下:
在游戏启动时在屏幕上创建一个站立的小熊。
点击键盘上的左右按键时将小熊切换成一个对应方向的Sprite,朝对应方向移动并实时打印位置信息。松开左右按键时切换回站立的小熊Sprite,结束打印位置信息。
结束游戏输出一个”Game Over!”信息。这一章我们将在游戏中通过代码创建一个小熊的GameObject,并可以看到小熊Entity的一些组件信息。案例准备创建ViewComponent.cs
ViewComponent 记录小熊的GameObject
SpriteComponent 记录小熊的Sprite名称数据
PositionComponent 记录小熊的Position数据
DirectionComponent 记录小熊的方向数据
MoveSpeedComponent 记录小熊的移动速度数据 (但是这里需要注意,这个组件一旦添加到小熊身上就会移动,不需要移动时需将这个组件移除,这就是我们将Component时提到过 ...
XLua项目使用-HQG
GameManager123456789public void LaunchLua(){ // Logger.printMono("LaunchLua start"); lua = LuaManager.Singleton.init(); // Logger.printMono("LaunchLua end"); System.GC.Collect(); System.GC.Collect(); // Logger.printMono("LaunchLua end gc");}
LuaManager先调用了构造函数。
LuaManager()1234567private LuaManager(){ luaMap = new Dictionary<string, byte[]>(); mLoadedLuaPBMap = new Dictionary<string, byte[]>(); LuaScrpitModel = S ...
ILRuntime学习笔记(1)
ILRuntime的设计目标1.尽可能的无缝接入现有项目。2.运行行为跟原生保持一致。3.调用原生接口的性能尽可能的高。
1.HelloWorldHelloWorld.cs123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293public class HelloWorld : MonoBehaviour{ //AppDomain是ILRuntime的入口,最好是在一个单例类中保存,整个游戏全局就一个,这里为了示例方便,每个例子里面都单独做了一个 //大家在正式项目中请全局只创建一个AppDomain AppDomain appdomain; System.IO.MemoryStream fs; System.IO.MemoryStream p; ...
ILRuntime学习笔记(2)
ILRuntime使用调试器基于TCP的调试,没有机器限制,可以调试本地,也可以调试真机。
1234567891011121314151617void InitializeILRuntime() { …… appdomain.DebugService.StartDebugService(56000); }IEnumerator WaitDebuggerAndRun() { Debug.Log("等待调试器连接"); while (!appdomain.DebugService.IsDebuggerAttached) { yield return null; } yield return new WaitForSeconds(1); OnHotFixLoaded(); }
ILRuntime使用委托在热更里面创建的委托实例,传到主工程的变量里,称为委托实例的跨域。这 ...
ILRuntime学习笔记(4)
在ILRuntime中使用反射反射接口的使用1.ILRuntime对主要反射接口进行了模拟。2.ILRuntimeType。3.ILRuntimeWrapperType。4.Attribute。5.Enum。
1234567891011121314151617181920212223242526272829303132333435void OnHotFixLoaded() { Debug.Log("C#工程中反射是一个非常经常用到功能,ILRuntime也对反射进行了支持,在热更DLL中使用反射跟原生C#没有任何区别,故不做介绍"); Debug.Log("这个Demo主要是介绍如何在主工程中反射热更DLL中的类型"); Debug.Log("假设我们要通过反射创建HotFix_Project.InstanceClass的实例"); Debug.Log("显然我们通过Activator或者Type.GetType(\"HotFix_Project ...
ILRuntime学习笔记(5)
ILRuntime的使用建议影响热更执行效率的因素1.热更DLL的编译模式,用Debug的模式编译会比Release编译慢数倍。2.编辑器内执行比打包出来执行慢10倍左右。3.使用Development Build打包会慢数倍。4.IL2CPP编译的C++编译选项Release以外选项也会导致运行慢很多倍。5.没有正确使用CLR绑定会让执行速度慢数十倍。6.没有注册值类型绑定的情况下大量使用值类型会导致GC Alloc大量增加。7.使用foreach由于会频繁创建值类型导致性能开销较大。8.主工程调用热更工程开销>热更调用主工程。9.解译<<<<<<原生,合理规划。
如何定位热更性能问题1.Profiler!!2.ILRuntime已加入Profiler支持。3.由于懒加载,方法在第一次执行时会有额外开销,可通过预热解决。4.编辑器中每次调用20字节的额外GC Alloc,定义DISABLE_ILRUNTIME_DEBUG宏可避免,但将失去断点调试+行号报告。
如何排查热更中的GC Alloc异常1.Profiler!!2.确定在非热更环境,相 ...
ILRuntime学习笔记(3)
在ILRuntime中挟持主工程方法(CLR重定向)1.有些主工程的方法和接口无法正常处理热更DLL里的类型和对象。2.CLR重定向可以对这些方法进行挟持。3.重定向方法需要理解IL底层机制,建议参考CLR绑定生成的代码。
12345678910 unsafe void InitializeILRuntime() {#if DEBUG && (UNITY_EDITOR || UNITY_ANDROID || UNITY_IPHONE) //由于Unity的Profiler接口只允许在主线程使用,为了避免出异常,需要告诉ILRuntime主线程的线程ID才能正确将函数运行耗时报告给Profiler appdomain.UnityMainThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId;#endif //这里做一些ILRuntime的注册 var mi = typeof(Debug).GetMethod("L ...
ILRuntime学习笔记(6)
推荐的项目组织方式
如何划定热更范围