mirror of
https://github.com/Siccity/xNode.git
synced 2025-12-20 17:26:02 +08:00
Caches attributes, generates no garbage after first fetch.
Cache gets reset on recompilation of code.
This commit is contained in:
parent
fe2b7a9684
commit
3d1da00652
@ -45,7 +45,7 @@ namespace XNodeEditor {
|
||||
|
||||
float spacePadding = 0;
|
||||
SpaceAttribute spaceAttribute;
|
||||
if(NodeEditorUtilities.GetAttrib(port.node.GetType(), property.name, out spaceAttribute)) spacePadding = spaceAttribute.height;
|
||||
if (NodeEditorUtilities.GetCachedAttrib(port.node.GetType(), property.name, out spaceAttribute)) spacePadding = spaceAttribute.height;
|
||||
|
||||
// If property is an input, display a regular property field and put a port handle on the left side
|
||||
if (port.direction == XNode.NodePort.IO.Input) {
|
||||
@ -53,7 +53,7 @@ namespace XNodeEditor {
|
||||
XNode.Node.ShowBackingValue showBacking = XNode.Node.ShowBackingValue.Unconnected;
|
||||
XNode.Node.InputAttribute inputAttribute;
|
||||
bool instancePortList = false;
|
||||
if (NodeEditorUtilities.GetAttrib(port.node.GetType(), property.name, out inputAttribute)) {
|
||||
if (NodeEditorUtilities.GetCachedAttrib(port.node.GetType(), property.name, out inputAttribute)) {
|
||||
instancePortList = inputAttribute.instancePortList;
|
||||
showBacking = inputAttribute.backingValue;
|
||||
}
|
||||
@ -98,7 +98,7 @@ namespace XNodeEditor {
|
||||
XNode.Node.ShowBackingValue showBacking = XNode.Node.ShowBackingValue.Unconnected;
|
||||
XNode.Node.OutputAttribute outputAttribute;
|
||||
bool instancePortList = false;
|
||||
if (NodeEditorUtilities.GetAttrib(port.node.GetType(), property.name, out outputAttribute)) {
|
||||
if (NodeEditorUtilities.GetCachedAttrib(port.node.GetType(), property.name, out outputAttribute)) {
|
||||
instancePortList = outputAttribute.instancePortList;
|
||||
showBacking = outputAttribute.backingValue;
|
||||
}
|
||||
|
||||
@ -15,6 +15,9 @@ namespace XNodeEditor {
|
||||
/// <summary>C#'s Script Icon [The one MonoBhevaiour Scripts have].</summary>
|
||||
private static Texture2D scriptIcon = (EditorGUIUtility.IconContent("cs Script Icon").image as Texture2D);
|
||||
|
||||
/// Saves Attribute from Type+Field for faster lookup. Resets on recompiles.
|
||||
private static Dictionary<Type, Dictionary<string, Dictionary<Type, Attribute>>> typeAttributes = new Dictionary<Type, Dictionary<string, Dictionary<Type, Attribute>>>();
|
||||
|
||||
public static bool GetAttrib<T>(Type classType, out T attribOut) where T : Attribute {
|
||||
object[] attribs = classType.GetCustomAttributes(typeof(T), false);
|
||||
return GetAttrib(attribs, out attribOut);
|
||||
@ -45,6 +48,34 @@ namespace XNodeEditor {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool GetCachedAttrib<T>(Type classType, string fieldName, out T attribOut) where T : Attribute {
|
||||
Dictionary<string, Dictionary<Type, Attribute>> typeFields;
|
||||
if (!typeAttributes.TryGetValue(classType, out typeFields)) {
|
||||
typeFields = new Dictionary<string, Dictionary<Type, Attribute>>();
|
||||
typeAttributes.Add(classType, typeFields);
|
||||
}
|
||||
|
||||
Dictionary<Type, Attribute> typeTypes;
|
||||
if(!typeFields.TryGetValue(fieldName, out typeTypes)) {
|
||||
typeTypes = new Dictionary<Type, Attribute>();
|
||||
typeFields.Add(fieldName, typeTypes);
|
||||
}
|
||||
|
||||
Attribute attr;
|
||||
if (!typeTypes.TryGetValue(typeof(T), out attr)) {
|
||||
if (GetAttrib<T>(classType, fieldName, out attribOut)) typeTypes.Add(typeof(T), attribOut);
|
||||
else typeTypes.Add(typeof(T), null);
|
||||
}
|
||||
|
||||
if(attr == null) {
|
||||
attribOut = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
attribOut = attr as T;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary> Returns true if this can be casted to <see cref="Type"/></summary>
|
||||
public static bool IsCastableTo(this Type from, Type to) {
|
||||
if (to.IsAssignableFrom(from)) return true;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user