lvm.md corrected by Tuxilio
This commit is contained in:
parent
fea9965901
commit
4a2e607b86
@ -21,8 +21,8 @@ Engine und Ihrem Mod, was langsam ist und die Leistung des Spiels schnell verrin
|
|||||||
|
|
||||||
- [Konzepte](#konzepte)
|
- [Konzepte](#konzepte)
|
||||||
- [Einlesen in die LVM](#einlesen-in-den-lvm)
|
- [Einlesen in die LVM](#einlesen-in-den-lvm)
|
||||||
- [Knoten lesen](#knoten-lesen)
|
- [Nodes lesen](#nodes-lesen)
|
||||||
- [Knoten schreiben](#knoten-schreiben)
|
- [Nodes schreiben](#nodes-schreiben)
|
||||||
- [Beispiel](#beispiel)
|
- [Beispiel](#beispiel)
|
||||||
- [Sie sind dran](#sie-sind-dran)
|
- [Sie sind dran](#sie-sind-dran)
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ Aus Leistungsgründen wird ein LVM fast nie genau den Bereich lesen, den Sie ihm
|
|||||||
|
|
||||||
{% include notice.html notice=page.mapgen_object %}
|
{% include notice.html notice=page.mapgen_object %}
|
||||||
|
|
||||||
## Knoten lesen
|
## Nodes lesen
|
||||||
|
|
||||||
Um die Typen von Knoten an bestimmten Positionen zu lesen, müssen Sie `get_data()` verwenden. Dies gibt ein flaches Array zurück, in dem jeder Eintrag den Typ eines bestimmten Knotens darstellt.
|
Um die Typen von Knoten an bestimmten Positionen zu lesen, müssen Sie `get_data()` verwenden. Dies gibt ein flaches Array zurück, in dem jeder Eintrag den Typ eines bestimmten Knotens darstellt.
|
||||||
|
|
||||||
@ -61,20 +61,20 @@ local a = VoxelArea:new{
|
|||||||
MaxEdge = emax
|
MaxEdge = emax
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Get node's index
|
-- Index des Nodees abrufen
|
||||||
local idx = a:index(x, y, z)
|
local idx = a:index(x, y, z)
|
||||||
|
|
||||||
-- Read node
|
-- Node lesen
|
||||||
print(data[idx])
|
print(data[idx])
|
||||||
```
|
```
|
||||||
|
|
||||||
Wenn Sie den obigen Code ausführen, werden Sie feststellen, dass `data[vi]` eine Ganzzahl ist. Das ist so, weil die Engine aus Leistungsgründen keine Knoten in Form von Zeichenketten speichert. Stattdessen verwendet die Engine eine ganze Zahl, die sogenannte Inhalts-ID. Sie können die Inhalts-ID für einen bestimmten Knotentyp herausfinden mit `get_content_id()` herausfinden. Zum Beispiel:
|
Wenn Sie den obigen Code ausführen, werden Sie feststellen, dass `data[vi]` eine Ganzzahl ist. Das ist so, weil die Engine aus Leistungsgründen keine Nodes in Form von Zeichenketten speichert. Stattdessen verwendet die Engine eine ganze Zahl, die sogenannte Inhalts-ID. Sie können die Inhalts-ID für einen bestimmten Nodetyp herausfinden mit `get_content_id()` herausfinden. Zum Beispiel:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local c_stone = minetest.get_content_id("default:stone")
|
local c_stone = minetest.get_content_id("default:stone")
|
||||||
```
|
```
|
||||||
|
|
||||||
Sie können dann überprüfen, ob der Knoten zum Beispiel Stein ist:
|
Sie können dann überprüfen, ob der Node zum Beispiel Stein ist:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local idx = a:index(x, y, z)
|
local idx = a:index(x, y, z)
|
||||||
@ -85,13 +85,13 @@ end
|
|||||||
|
|
||||||
Die Inhalts-IDs eines Knotentyps können sich während der Ladezeit ändern, daher wird es nicht empfohlen, diese während dieser Zeit abzurufen.
|
Die Inhalts-IDs eines Knotentyps können sich während der Ladezeit ändern, daher wird es nicht empfohlen, diese während dieser Zeit abzurufen.
|
||||||
|
|
||||||
Knoten in einem LVM-Datenarray werden in umgekehrter oordinatenreihenfolge gespeichert. Deshalb sollten Sie immer in der Reihenfolge `z, y, x` *iterieren* (umdrehen). Zum Beispiel:
|
Knoten in einem LVM-Datenarray werden in umgekehrter Koordinatenreihenfolge gespeichert. Deshalb sollten Sie immer in der Reihenfolge `z, y, x` *iterieren* (umdrehen). Zum Beispiel:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
for z = min.z, max.z do
|
for z = min.z, max.z do
|
||||||
for y = min.y, max.y do
|
for y = min.y, max.y do
|
||||||
for x = min.x, max.x do
|
for x = min.x, max.x do
|
||||||
-- vi, voxel index, is a common variable name here
|
-- vi, Voxel-Index, ist hier ein gängiger Variablenname
|
||||||
local vi = a:index(x, y, z)
|
local vi = a:index(x, y, z)
|
||||||
if data[vi] == c_stone then
|
if data[vi] == c_stone then
|
||||||
print("ist Stein!")
|
print("ist Stein!")
|
||||||
@ -105,7 +105,7 @@ Der Grund dafür liegt im Bereich der Computerarchitektur. Das Lesen aus dem RAM
|
|||||||
im Cache sind, kann er sie sehr schnell abrufen. Wenn sich die Daten nicht im Cache befinden, kommt es zu einem Cache-Miss und der Prozess holt sich die benötigten Daten aus dem RAM. Alles,
|
im Cache sind, kann er sie sehr schnell abrufen. Wenn sich die Daten nicht im Cache befinden, kommt es zu einem Cache-Miss und der Prozess holt sich die benötigten Daten aus dem RAM. Alles,
|
||||||
was die angeforderten Daten umgibt, wird ebenfalls geholt und ersetzt dann die Daten im Cache. Dies geschieht, weil es sehr wahrscheinlich ist, dass der Prozess erneut Daten in der Nähe dieser Stelle anfordert. Das bedeutet, dass es eine gute Optimierungsregel ist, so zu iterieren, dass die Daten nacheinander gelesen werden und *Chache Trashing* zu vermeiden.
|
was die angeforderten Daten umgibt, wird ebenfalls geholt und ersetzt dann die Daten im Cache. Dies geschieht, weil es sehr wahrscheinlich ist, dass der Prozess erneut Daten in der Nähe dieser Stelle anfordert. Das bedeutet, dass es eine gute Optimierungsregel ist, so zu iterieren, dass die Daten nacheinander gelesen werden und *Chache Trashing* zu vermeiden.
|
||||||
|
|
||||||
## Knoten schreiben
|
## Nodes schreiben
|
||||||
|
|
||||||
Zunächst müssen Sie eine neue Inhalts-ID im Datenfeld festlegen:
|
Zunächst müssen Sie eine neue Inhalts-ID im Datenfeld festlegen:
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ local function grass_to_dirt(pos1, pos2)
|
|||||||
local c_dirt = minetest.get_content_id("default:dirt")
|
local c_dirt = minetest.get_content_id("default:dirt")
|
||||||
local c_grass = minetest.get_content_id("default:dirt_with_grass")
|
local c_grass = minetest.get_content_id("default:dirt_with_grass")
|
||||||
|
|
||||||
-- Read data into LVM
|
-- Daten in LVM einlesen
|
||||||
local vm = minetest.get_voxel_manip()
|
local vm = minetest.get_voxel_manip()
|
||||||
local emin, emax = vm:read_from_map(pos1, pos2)
|
local emin, emax = vm:read_from_map(pos1, pos2)
|
||||||
local a = VoxelArea:new{
|
local a = VoxelArea:new{
|
||||||
@ -149,7 +149,7 @@ local function grass_to_dirt(pos1, pos2)
|
|||||||
}
|
}
|
||||||
local data = vm:get_data()
|
local data = vm:get_data()
|
||||||
|
|
||||||
-- Modify data
|
-- Daten ändern
|
||||||
for z = pos1.z, pos2.z do
|
for z = pos1.z, pos2.z do
|
||||||
for y = pos1.y, pos2.y do
|
for y = pos1.y, pos2.y do
|
||||||
for x = pos1.x, pos2.x do
|
for x = pos1.x, pos2.x do
|
||||||
@ -161,7 +161,7 @@ local function grass_to_dirt(pos1, pos2)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Write data
|
-- Daten schreiben
|
||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map(true)
|
vm:write_to_map(true)
|
||||||
end
|
end
|
||||||
@ -171,4 +171,4 @@ end
|
|||||||
|
|
||||||
* Erstellen Sie `replace_in_area(from, to, pos1, pos2)`, das alle Instanzen von `von` durch `bis` in dem angegebenen Bereich ersetzt, wobei `von` und `bis` Knotennamen sind.
|
* Erstellen Sie `replace_in_area(from, to, pos1, pos2)`, das alle Instanzen von `von` durch `bis` in dem angegebenen Bereich ersetzt, wobei `von` und `bis` Knotennamen sind.
|
||||||
* Programmieren Sie eine Funktion, die alle Brustknoten um 90° dreht.
|
* Programmieren Sie eine Funktion, die alle Brustknoten um 90° dreht.
|
||||||
* Erstellen Sie eine Funktion, die einen LVM benutzt, um zu bewirken, dass sich moosiges Kopfsteinpflaster auf nahegelegene Stein- und Pflastersteinknoten ausbreitet. Verursacht Ihre Implementierung, dass sich das Moospflaster auf mehr als einen Knoten ausbreitet? Wenn ja, wie können Sie dies verhindern?
|
* Erstellen Sie eine Funktion, die einen LVM benutzt, um zu bewirken, dass sich moosiges Kopfsteinpflaster auf nahegelegene Stein- und Pflastersteinknoten ausbreitet. Verursacht Ihre Implementierung, dass sich das Moospflaster auf mehr als einen Node ausbreitet? Wenn ja, wie können Sie dies verhindern?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user