mirror of
https://github.com/godotengine/godot.git
synced 2025-10-20 08:23:29 +00:00
Reduce unnecessary COW on Vector by make writing explicit
This commit makes operator[] on Vector const and adds a write proxy to it. From now on writes to Vectors need to happen through the .write proxy. So for instance: Vector<int> vec; vec.push_back(10); std::cout << vec[0] << std::endl; vec.write[0] = 20; Failing to use the .write proxy will cause a compilation error. In addition COWable datatypes can now embed a CowData pointer to their data. This means that String, CharString, and VMap no longer use or derive from Vector. _ALWAYS_INLINE_ and _FORCE_INLINE_ are now equivalent for debug and non-debug builds. This is a lot faster for Vector in the editor and while running tests. The reason why this difference used to exist is because force-inlined methods used to give a bad debugging experience. After extensive testing with modern compilers this is no longer the case.
This commit is contained in:
parent
9423f23ffb
commit
0e29f7974b
228 changed files with 2200 additions and 2082 deletions
|
@ -54,8 +54,8 @@ bool VisualScriptFunction::_set(const StringName &p_name, const Variant &p_value
|
|||
arguments.resize(new_argc);
|
||||
|
||||
for (int i = argc; i < new_argc; i++) {
|
||||
arguments[i].name = "arg" + itos(i + 1);
|
||||
arguments[i].type = Variant::NIL;
|
||||
arguments.write[i].name = "arg" + itos(i + 1);
|
||||
arguments.write[i].type = Variant::NIL;
|
||||
}
|
||||
ports_changed_notify();
|
||||
_change_notify();
|
||||
|
@ -68,7 +68,7 @@ bool VisualScriptFunction::_set(const StringName &p_name, const Variant &p_value
|
|||
if (what == "type") {
|
||||
|
||||
Variant::Type new_type = Variant::Type(int(p_value));
|
||||
arguments[idx].type = new_type;
|
||||
arguments.write[idx].type = new_type;
|
||||
ports_changed_notify();
|
||||
|
||||
return true;
|
||||
|
@ -76,7 +76,7 @@ bool VisualScriptFunction::_set(const StringName &p_name, const Variant &p_value
|
|||
|
||||
if (what == "name") {
|
||||
|
||||
arguments[idx].name = p_value;
|
||||
arguments.write[idx].name = p_value;
|
||||
ports_changed_notify();
|
||||
return true;
|
||||
}
|
||||
|
@ -234,7 +234,7 @@ void VisualScriptFunction::set_argument_type(int p_argidx, Variant::Type p_type)
|
|||
|
||||
ERR_FAIL_INDEX(p_argidx, arguments.size());
|
||||
|
||||
arguments[p_argidx].type = p_type;
|
||||
arguments.write[p_argidx].type = p_type;
|
||||
ports_changed_notify();
|
||||
}
|
||||
Variant::Type VisualScriptFunction::get_argument_type(int p_argidx) const {
|
||||
|
@ -246,7 +246,7 @@ void VisualScriptFunction::set_argument_name(int p_argidx, const String &p_name)
|
|||
|
||||
ERR_FAIL_INDEX(p_argidx, arguments.size());
|
||||
|
||||
arguments[p_argidx].name = p_name;
|
||||
arguments.write[p_argidx].name = p_name;
|
||||
ports_changed_notify();
|
||||
}
|
||||
String VisualScriptFunction::get_argument_name(int p_argidx) const {
|
||||
|
@ -3560,8 +3560,8 @@ void VisualScriptDeconstruct::_set_elem_cache(const Array &p_elements) {
|
|||
ERR_FAIL_COND(p_elements.size() % 2 == 1);
|
||||
elements.resize(p_elements.size() / 2);
|
||||
for (int i = 0; i < elements.size(); i++) {
|
||||
elements[i].name = p_elements[i * 2 + 0];
|
||||
elements[i].type = Variant::Type(int(p_elements[i * 2 + 1]));
|
||||
elements.write[i].name = p_elements[i * 2 + 0];
|
||||
elements.write[i].type = Variant::Type(int(p_elements[i * 2 + 1]));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3606,7 +3606,7 @@ VisualScriptNodeInstance *VisualScriptDeconstruct::instance(VisualScriptInstance
|
|||
instance->instance = p_instance;
|
||||
instance->outputs.resize(elements.size());
|
||||
for (int i = 0; i < elements.size(); i++) {
|
||||
instance->outputs[i] = elements[i].name;
|
||||
instance->outputs.write[i] = elements[i].name;
|
||||
}
|
||||
|
||||
return instance;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue