You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +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:
@@ -196,7 +196,7 @@ Vector<int> TileMapEditor::get_selected_tiles() const {
|
||||
}
|
||||
|
||||
for (int i = items.size() - 1; i >= 0; i--) {
|
||||
items[i] = palette->get_item_metadata(items[i]);
|
||||
items.write[i] = palette->get_item_metadata(items[i]);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
@@ -983,7 +983,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
ids.push_back(0);
|
||||
for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
|
||||
|
||||
ids[0] = E->get().cell;
|
||||
ids.write[0] = E->get().cell;
|
||||
_set_cell(E->get().pos + ofs, ids, E->get().flip_h, E->get().flip_v, E->get().transpose);
|
||||
}
|
||||
_finish_undo();
|
||||
@@ -1006,7 +1006,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
}
|
||||
for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
|
||||
|
||||
ids[0] = E->get().cell;
|
||||
ids.write[0] = E->get().cell;
|
||||
_set_cell(E->get().pos + ofs, ids, E->get().flip_h, E->get().flip_v, E->get().transpose);
|
||||
}
|
||||
_finish_undo();
|
||||
@@ -1228,7 +1228,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
|
||||
for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
|
||||
|
||||
tmp_cell[0] = E->get().idx;
|
||||
tmp_cell.write[0] = E->get().idx;
|
||||
_set_cell(E->key(), tmp_cell, E->get().xf, E->get().yf, E->get().tr);
|
||||
}
|
||||
}
|
||||
@@ -1265,7 +1265,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
|
||||
|
||||
for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
|
||||
|
||||
tmp_cell[0] = E->get().idx;
|
||||
tmp_cell.write[0] = E->get().idx;
|
||||
_set_cell(E->key(), tmp_cell, E->get().xf, E->get().yf, E->get().tr);
|
||||
}
|
||||
}
|
||||
@@ -1750,7 +1750,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
|
||||
bucket_cache_visited = 0;
|
||||
|
||||
invalid_cell.resize(1);
|
||||
invalid_cell[0] = TileMap::INVALID_CELL;
|
||||
invalid_cell.write[0] = TileMap::INVALID_CELL;
|
||||
|
||||
ED_SHORTCUT("tile_map_editor/erase_selection", TTR("Erase Selection"), KEY_DELETE);
|
||||
ED_SHORTCUT("tile_map_editor/find_tile", TTR("Find Tile"), KEY_MASK_CMD + KEY_F);
|
||||
|
||||
Reference in New Issue
Block a user