Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[unity]即使有生成代码,registerType也会反射补充没有生成到的类成员。可能导致初始化缓慢。 #485

Closed
zombieyang opened this issue Oct 9, 2021 · 5 comments
Assignees

Comments

@zombieyang
Copy link
Contributor

No description provided.

@zombieyang zombieyang changed the title [unity]即使有生成代码,registerType会反射补充没有生成到的类成员。导致初始化缓慢。 [unity]即使有生成代码,registerType也会反射补充没有生成到的类成员。可能导致初始化缓慢。 Oct 9, 2021
@zombieyang zombieyang self-assigned this Oct 9, 2021
zombieyang added a commit to zombieyang/puerts that referenced this issue Oct 11, 2021
zombieyang added a commit to zombieyang/puerts that referenced this issue Oct 11, 2021
@zombieyang
Copy link
Contributor Author

    public enum TypeRegisterMode 
    {
        Mixed = 0,
        GeneratedCodeFirst = 1,
        GeneratedCodeOnly = 2
    }

Mixed:默认状态。会先用生成的代码,然后再反射补上缺的。
GeneratedCodeFirst:没有生成代码就用反射。有生成就用生成的,不会再用反射补缺。
GeneratedCodeOnly:只用生成的代码。如果没有生成,这个类就是空的。

@chexiongsheng
Copy link
Collaborator

    public enum TypeRegisterMode 
    {
        Mixed = 0,
        GeneratedCodeFirst = 1,
        GeneratedCodeOnly = 2
    }

Mixed:默认状态。会先用生成的代码,然后再反射补上缺的。 GeneratedCodeFirst:没有生成代码就用反射。有生成就用生成的,不会再用反射补缺。 GeneratedCodeOnly:只用生成的代码。如果没有生成,这个类就是空的。

这种信息要写在使用手册里头,包括之前node的参数

@chexiongsheng chexiongsheng reopened this Oct 14, 2021
@zombieyang
Copy link
Contributor Author

zombieyang commented Oct 27, 2021

根据内部的需求反馈情况,上述配置方式不能指定细化到类型或者成员的配置。考虑以类似Binding列表配置的形式重新设计一种配置。

@zombieyang
Copy link
Contributor Author

标签名称 作用领域 生成d.ts 生成静态wrap 生成lazy wrap
puerts.Typing type 1 0 0
puerts.Binding type 1 1 0
puerts.Filter member 0 0 0
xLua.LuaCallCSharp type - 1 0
xLua.ReflectionUse type - 0 0
xLua.DoNotGen member - 0 1
xLua.BlackList member - 0 0

对现有需求以及xLua和puerts现存有关生成和反射的配置进行了整理。可以归纳几条结论:

  1. 配置需要能细化到类与成员。其中成员级别的配置比类优先级更高。但成员级别的配置最好使用函数而不是List,会更好理解一些。
  2. 实际上要设置的级别分成三种:静态wrap、反射wrap、懒惰反射wrap。如果包装成一个更上口一点的表达,也许可以表达成FastWrapSlowWrapLazyWrap
  3. 本issue提到的“补充”功能,实际上是为Filter服务的。本质上来说,Filter是一个成员级别SlowWrap设置器。

根据上述结论,提出改进方案如下:

  1. 新增一个枚举量WrapMode来处理相关事情,里面分别有三种枚举FastWrap``SlowWrap``LazyWrap。puerts目前还没支持LazyWrap,先当是noWrap处理。对于设置了Binding的Type,其所有成员默认当FastWrap处理。
  2. 新增一个类似Filter的过滤器,名为WrapFilter,传入Type和MemberInfo,返回值是WrapMode,开发者可以通过定义这个过滤函数来给不同Type和不同Member设置Wrap模式,但只有在Binding的Type的成员会调用该函数。
  3. 本issue提到补充功能去掉。针对有Binding的Type里设置为SlowWrap的属性,在Gen出来的RegisterInfo里提供标记。

@zombieyang
Copy link
Contributor Author

zombieyang commented Nov 1, 2021

和车神交流了一下上述草案改动较多。且目前尚未在Puerts实现Lazy注册功能。所以1.1.0版本先以去掉TypeRegister里的GetMethods为目标。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants