BufferBundle class
Пакет: com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle
Файл: com/hypixel/hytale/builtin/hytalegenerator/engine/bufferbundle/BufferBundle.java
implements: MemInstrument
Поля (49)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public final int |
INITIAL_STAGE_INDEX |
|
private final BufferBundle.Access |
access |
|
private final List<BufferBundle.Access> |
accessors |
|
private final Bounds3i |
bounds_bufferGrid |
|
private final Bounds3i |
bounds_bufferGrid |
|
private final BufferType |
bufferType |
|
private final BufferBundle.Grid.TrackedBuffer[] |
buffers |
|
private final Map<Vector3i, BufferBundle.Grid.TrackedBuffer> |
buffers |
|
private final int |
capacity |
|
private final BufferBundle.Grid |
grid |
|
public final List<BufferBundle.MemoryReport.GridEntry> |
gridEntries |
|
private boolean |
isClosed |
|
private final Deque<Vector3i> |
oldestColumnEntryDeque_bufferGrid |
|
|
return |
|
public int |
stageIndex |
|
long |
var1 |
|
BufferBundle.MemoryReport |
var1 |
|
long |
var1 |
|
Vector3i |
var1 |
|
long |
var1 |
|
long |
var1 |
|
StringBuilder |
var1 |
|
BufferBundle.Grid |
var2 |
|
int |
var2 |
|
BufferBundle.Grid.TrackedBuffer[] |
var2 |
|
BufferBundle.Access |
var2 |
|
BufferBundle.Access |
var2 |
|
int |
var2 |
|
Vector3i |
var2 |
|
Vector3i |
var2 |
|
long |
var2 |
|
long |
var2 |
|
BufferBundle.Grid |
var3 |
|
Vector3i |
var3 |
|
int |
var3 |
|
BufferBundle.Grid.TrackedBuffer |
var3 |
|
int |
var3 |
|
int |
var3 |
|
MemInstrument.Report |
var4 |
|
int |
var4 |
|
int |
var4 |
|
int |
var4 |
|
Vector3i |
var4 |
|
StringBuilder |
var4 |
|
int |
var5 |
|
Vector3i |
var5 |
|
BufferBundle.Tracker |
var6 |
|
Buffer |
var7 |
|
Vector3i |
var8 |
Методы (47)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
private |
Accessprivate Access(@Nonnull BufferBundle.Grid var1, @Nonnull Bounds3i var2) |
|
private |
Gridprivate Grid(@Nonnull BufferType var1, int var2) |
|
public record |
GridEntrypublic record GridEntry(MemInstrument.Report report, int bufferCount, @Nonnull BufferType bufferType) |
|
public |
MemoryReportpublic MemoryReport() |
|
public |
Trackerpublic Tracker() |
|
private |
Viewprivate View(@Nonnull BufferBundle.Access var1, @Nonnull Bounds3i var2) |
|
public void |
closepublic void close() |
public |
void |
closeALlAccessesvoid closeALlAccesses() |
|
public void |
closeAllAccessespublic void closeAllAccesses() |
|
private void |
createBufferColumnprivate void createBufferColumn(@Nonnull Vector3i var1, @Nonnull BufferBundle.Grid.TrackedBuffer[] var2) |
|
public BufferBundle.Access.View |
createViewpublic BufferBundle.Access.View createView(@Nonnull Bounds3i var1) |
|
public BufferBundle.Access.View |
createViewpublic BufferBundle.Access.View createView() |
|
private boolean |
destroyOldestBufferColumnprivate boolean destroyOldestBufferColumn() |
|
private void |
ensureBufferColumnExistsprivate void ensureBufferColumnExists(@Nonnull Vector3i var1, @Nonnull BufferBundle.Grid.TrackedBuffer[] var2) |
private |
boolean |
existingGridHasBufferTypeIndexboolean existingGridHasBufferTypeIndex(int var1) |
|
|
for for(var1.z = this.bounds_bufferGrid.min.z; var1.z < this.bounds_bufferGrid.max.z; var1.z++) |
|
|
for for(var1.x = this.bounds_bufferGrid.min.x; var1.x < this.bounds_bufferGrid.max.x; var1.x++) |
|
|
for for(var1.y = 0; var1.y < 40; var1.y++) |
|
|
for for(BufferBundle.Access var10 : this.accessors) |
|
|
for for(int var5 = 0; var5 < var2.length; var5++) |
|
|
for for(int var4 = 0; var4 < 40; var4++) |
|
|
for for(int var4 = 0; var4 < var3; var4++) |
|
|
for for(int var3 = 0; var3 < 40; var3++) |
|
|
for for(BufferBundle.Access var3 : this.accessors) |
|
|
for for(BufferBundle.MemoryReport.GridEntry var5 : this.gridEntries) |
|
|
for for(BufferBundle.MemoryReport.GridEntry var8 : this.gridEntries) |
abstract |
|
for for(int var1 = 0; var1 < this.oldestColumnEntryDeque_bufferGrid.size() |
|
public Bounds3i |
getBounds_bufferGridpublic Bounds3i getBounds_bufferGrid() |
|
public Bounds3i |
getBounds_bufferGridpublic Bounds3i getBounds_bufferGrid() |
|
public BufferBundle.Grid.TrackedBuffer |
getBufferpublic BufferBundle.Grid.TrackedBuffer getBuffer(int var1, int var2, int var3) |
|
public BufferBundle.Grid.TrackedBuffer |
getBufferpublic BufferBundle.Grid.TrackedBuffer getBuffer(@Nonnull Vector3i var1) |
|
public BufferBundle.Grid.TrackedBuffer |
getBufferpublic BufferBundle.Grid.TrackedBuffer getBuffer(int var1, int var2, int var3) |
|
public BufferBundle.Grid.TrackedBuffer |
getBufferpublic BufferBundle.Grid.TrackedBuffer getBuffer(@Nonnull Vector3i var1) |
|
public BufferType |
getBufferTypepublic BufferType getBufferType() |
|
public MemInstrument.Report |
getMemoryUsagepublic MemInstrument.Report getMemoryUsage() |
|
public MemInstrument.Report |
getMemoryUsagepublic MemInstrument.Report getMemoryUsage() |
|
public MemInstrument.Report |
getMemoryUsagepublic MemInstrument.Report getMemoryUsage() |
|
public MemInstrument.Report |
getMemoryUsagepublic MemInstrument.Report getMemoryUsage() |
|
|
if if(var3.bufferType.index == var1) |
|
|
if if(var3 == null) |
|
private boolean |
isBufferColumnInAccessprivate boolean isBufferColumnInAccess(@Nonnull Vector3i var1) |
|
private void |
loadGridprivate void loadGrid() |
|
public BufferBundle.Access |
openAccesspublic BufferBundle.Access openAccess(@Nonnull Bounds3i var1) |
|
private void |
removeBufferColumnprivate void removeBufferColumn(@Nonnull Vector3i var1) |
|
public String |
toStringpublic String toString() |
|
public String |
toStringpublic String toString(int var1) |
|
private void |
tryTrimSurplusprivate void tryTrimSurplus(int var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.GridUtils;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.Buffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.type.BufferType;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.performanceinstruments.MemInstrument;
class="kw">import java.util.ArrayDeque;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Arrays;
class="kw">import java.util.Deque;
class="kw">import java.util.HashMap;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3i;
class="kw">public class BufferBundle class="kw">implements MemInstrument {
@Nonnull
class="kw">private class="kw">final Map<BufferType, BufferBundle.Grid> grids = new HashMap<>();
class="kw">public BufferBundle() {
}
@Nonnull
class="kw">public BufferBundle.Grid createGrid(@Nonnull BufferType var1, int var2) {
assert var2 >= 0;
assert !this.grids.containsKey(var1);
assert !this.existingGridHasBufferTypeIndex(var1.index);
BufferBundle.Grid var3 = new BufferBundle.Grid(var1, var2);
this.grids.put(var1, var3);
class="kw">return var3;
}
@Nonnull
class="kw">public BufferBundle.Access createBufferAccess(@Nonnull BufferType var1, @Nonnull Bounds3i var2) {
assert var2.isCorrect();
class="kw">return this.getGrid(var1).openAccess(var2);
}
class="kw">public void closeALlAccesses() {
for (BufferBundle.Grid var2 : this.grids.values()) {
var2.closeAllAccesses();
}
}
@Nonnull
class="kw">public BufferBundle.Grid getGrid(@Nonnull BufferType var1) {
BufferBundle.Grid var2 = this.grids.get(var1);
assert var2 != null;
class="kw">return var2;
}
@Nonnull
@Override
class="kw">public MemInstrument.Report getMemoryUsage() {
long var1 = 16L;
for (Entry var4 : this.grids.entrySet()) {
var1 += var4.getValue().getMemoryUsage().size_bytes();
}
class="kw">return new MemInstrument.Report(var1);
}
class="kw">private boolean existingGridHasBufferTypeIndex(int var1) {
for (BufferBundle.Grid var3 : this.grids.values()) {
if (var3.bufferType.index == var1) {
class="kw">return true;
}
}
class="kw">return false;
}
@Nonnull
class="kw">public BufferBundle.MemoryReport createMemoryReport() {
BufferBundle.MemoryReport var1 = new BufferBundle.MemoryReport();
for (BufferBundle.Grid var3 : this.grids.values()) {
MemInstrument.Report var4 = var3.getMemoryUsage();
int var5 = var3.buffers.size();
var1.gridEntries.add(new BufferBundle.MemoryReport.GridEntry(var4, var5, var3.bufferType));
}
class="kw">return var1;
}
class="kw">public class="kw">static class Access class="kw">implements MemInstrument {
@Nonnull
class="kw">private class="kw">final BufferBundle.Grid grid;
@Nonnull
class="kw">private class="kw">final Bounds3i bounds_bufferGrid;
@Nonnull
class="kw">private class="kw">final BufferBundle.Grid.TrackedBuffer[] buffers;
class="kw">private boolean isClosed;
class="kw">private Access(@Nonnull BufferBundle.Grid var1, @Nonnull Bounds3i var2) {
assert var2.isCorrect();
this.grid = var1;
this.bounds_bufferGrid = var2.clone();
this.bounds_bufferGrid.min.y = 0;
this.bounds_bufferGrid.max.y = 40;
Vector3i var3 = this.bounds_bufferGrid.getSize();
int var4 = var3.x * var3.y * var3.z;
this.buffers = new BufferBundle.Grid.TrackedBuffer[var4];
this.isClosed = false;
}
@Nonnull
class="kw">public BufferBundle.Access.View createView(@Nonnull Bounds3i var1) {
assert this.bounds_bufferGrid.contains(var1);
class="kw">return new BufferBundle.Access.View(this, var1);
}
@Nonnull
class="kw">public BufferBundle.Access.View createView() {
class="kw">return new BufferBundle.Access.View(this, this.bounds_bufferGrid);
}
@Nonnull
class="kw">public BufferBundle.Grid.TrackedBuffer getBuffer(int var1, int var2, int var3) {
assert !this.isClosed;
assert this.bounds_bufferGrid.contains(var1, var2, var3);
int var4 = GridUtils.toIndexFromPositionYXZ(var1, var2, var3, this.bounds_bufferGrid);
class="kw">return this.buffers[var4];
}
@Nonnull
class="kw">public BufferBundle.Grid.TrackedBuffer getBuffer(@Nonnull Vector3i var1) {
assert !this.isClosed;
assert this.bounds_bufferGrid.contains(var1);
int var2 = GridUtils.toIndexFromPositionYXZ(var1, this.bounds_bufferGrid);
class="kw">return this.buffers[var2];
}
@Nonnull
class="kw">public Bounds3i getBounds_bufferGrid() {
class="kw">return this.bounds_bufferGrid.clone();
}
class="kw">public void close() {
this.grid.accessors.remove(this);
this.isClosed = true;
Arrays.fill(this.buffers, null);
}
@Nonnull
@Override
class="kw">public MemInstrument.Report getMemoryUsage() {
long var1 = 8L + this.bounds_bufferGrid.getMemoryUsage().size_bytes();
class="kw">return new MemInstrument.Report(var1);
}
class="kw">private void loadGrid() {
assert !this.isClosed;
assert this.bounds_bufferGrid.min.y == 0 && this.bounds_bufferGrid.max.y == 40;
Vector3i var1 = new Vector3i(this.bounds_bufferGrid.min);
var1.y = 0;
BufferBundle.Grid.TrackedBuffer[] var2 = new BufferBundle.Grid.TrackedBuffer[40];
for (var1.z = this.bounds_bufferGrid.min.z; var1.z < this.bounds_bufferGrid.max.z; var1.z++) {
for (var1.x = this.bounds_bufferGrid.min.x; var1.x < this.bounds_bufferGrid.max.x; var1.x++) {
var1.y = 0;
this.grid.ensureBufferColumnExists(var1, var2);
int var3 = 0;
for (var1.y = 0; var1.y < 40; var1.y++) {
int var4 = GridUtils.toIndexFromPositionYXZ(var1, this.bounds_bufferGrid);
this.buffers[var4] = var2[var3];
var3++;
}
}
}
}
class="kw">public class="kw">static class View {
@Nonnull
class="kw">private class="kw">final BufferBundle.Access access;
@Nonnull
class="kw">private class="kw">final Bounds3i bounds_bufferGrid;
class="kw">private View(@Nonnull BufferBundle.Access var1, @Nonnull Bounds3i var2) {
assert var1.bounds_bufferGrid.contains(var2);
this.access = var1;
this.bounds_bufferGrid = var2;
}
@Nonnull
class="kw">public BufferBundle.Grid.TrackedBuffer getBuffer(int var1, int var2, int var3) {
assert !this.access.isClosed;
assert this.bounds_bufferGrid.contains(var1, var2, var3);
class="kw">return this.access.getBuffer(var1, var2, var3);
}
@Nonnull
class="kw">public BufferBundle.Grid.TrackedBuffer getBuffer(@Nonnull Vector3i var1) {
assert !this.access.isClosed;
assert this.bounds_bufferGrid.contains(var1);
class="kw">return this.access.getBuffer(var1);
}
@Nonnull
class="kw">public Bounds3i getBounds_bufferGrid() {
class="kw">return this.bounds_bufferGrid.clone();
}
}
}
class="kw">public class="kw">static class Grid class="kw">implements MemInstrument {
@Nonnull
class="kw">private class="kw">final BufferType bufferType;
@Nonnull
class="kw">private class="kw">final Map<Vector3i, BufferBundle.Grid.TrackedBuffer> buffers;
@Nonnull
class="kw">private class="kw">final Deque<Vector3i> oldestColumnEntryDeque_bufferGrid;
class="kw">private class="kw">final int capacity;
@Nonnull
class="kw">private class="kw">final List<BufferBundle.Access> accessors;
class="kw">private Grid(@Nonnull BufferType var1, int var2) {
this.bufferType = var1;
this.buffers = new HashMap<>();
this.oldestColumnEntryDeque_bufferGrid = new ArrayDeque<>();
this.capacity = Math.max(var2, 0);
this.accessors = new ArrayList<>();
}
@Nonnull
class="kw">public BufferType getBufferType() {
class="kw">return this.bufferType;
}
@Nonnull
class="kw">public BufferBundle.Access openAccess(@Nonnull Bounds3i var1) {
BufferBundle.Access var2 = new BufferBundle.Access(this, var1);
this.accessors.add(var2);
var2.loadGrid();
class="kw">return var2;
}
class="kw">public void closeAllAccesses() {
for (int var1 = this.accessors.size() - 1; var1 >= 0; var1--) {
BufferBundle.Access var2 = this.accessors.get(var1);
var2.close();
}
}
@Nonnull
@Override
class="kw">public MemInstrument.Report getMemoryUsage() {
long var1 = 68L;
var1 += 28L * this.buffers.size();
var1 += 4L * this.buffers.size();
var1 += 32L * this.buffers.size();
for (BufferBundle.Grid.TrackedBuffer var4 : this.buffers.values()) {
var1 += var4.getMemoryUsage().size_bytes();
}
var1 += 8L * this.accessors.size();
for (BufferBundle.Access var10 : this.accessors) {
var1 += var10.getMemoryUsage().size_bytes();
}
class="kw">return new MemInstrument.Report(var1);
}
class="kw">private void ensureBufferColumnExists(@Nonnull Vector3i var1, @Nonnull BufferBundle.Grid.TrackedBuffer[] var2) {
assert var1.y == 0;
assert var2.length == 40;
BufferBundle.Grid.TrackedBuffer var3 = this.buffers.get(var1);
if (var3 == null) {
this.createBufferColumn(var1, var2);
} else {
Vector3i var4 = new Vector3i(var1);
for (int var5 = 0; var5 < var2.length; var5++) {
var4.y = var5 + 0;
var2[var5] = this.buffers.get(var4);
assert var2[var5] != null;
}
}
}
class="kw">private void createBufferColumn(@Nonnull Vector3i var1, @Nonnull BufferBundle.Grid.TrackedBuffer[] var2) {
assert !this.buffers.containsKey(var1);
assert var2.length == 40;
this.tryTrimSurplus(40);
int var3 = 0;
for (int var4 = 0; var4 < 40; var4++) {
Vector3i var5 = new Vector3i(var1.x, var4, var1.z);
BufferBundle.Tracker var6 = new BufferBundle.Tracker();
Buffer var7 = this.bufferType.bufferSupplier.get();
assert this.bufferType.isValid(var7);
var2[var3] = new BufferBundle.Grid.TrackedBuffer(var6, var7);
this.buffers.put(var5, var2[var3]);
var3++;
}
Vector3i var8 = new Vector3i(var1.x, 0, var1.z);
this.oldestColumnEntryDeque_bufferGrid.addLast(var8);
}
class="kw">private void tryTrimSurplus(int var1) {
int var2 = Math.max(0, this.buffers.size() - this.capacity - var1);
int var3 = var2 == 0 ? 0 : var2 / 40 + 1;
for (int var4 = 0; var4 < var3; var4++) {
if (!this.destroyOldestBufferColumn()) {
class="kw">return;
}
}
}
class="kw">private boolean destroyOldestBufferColumn() {
assert !this.oldestColumnEntryDeque_bufferGrid.isEmpty();
for (int var1 = 0; var1 < this.oldestColumnEntryDeque_bufferGrid.size(); var1++) {
Vector3i var2 = this.oldestColumnEntryDeque_bufferGrid.removeFirst();
if (!this.isBufferColumnInAccess(var2)) {
this.removeBufferColumn(var2);
class="kw">return true;
}
this.oldestColumnEntryDeque_bufferGrid.addLast(var2);
}
class="kw">return false;
}
class="kw">private void removeBufferColumn(@Nonnull Vector3i var1) {
assert var1.y == 0;
Vector3i var2 = new Vector3i(var1);
for (int var3 = 0; var3 < 40; var3++) {
var2.y = var3;
this.buffers.remove(var2);
}
}
class="kw">private boolean isBufferColumnInAccess(@Nonnull Vector3i var1) {
assert var1.y == 0;
for (BufferBundle.Access var3 : this.accessors) {
if (var3.bounds_bufferGrid.contains(var1)) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">public record TrackedBuffer(@Nonnull BufferBundle.Tracker tracker, @Nonnull Buffer buffer) class="kw">implements MemInstrument {
class="kw">public TrackedBuffer {
}
@Nonnull
@Override
class="kw">public MemInstrument.Report getMemoryUsage() {
long var1 = 16L + this.tracker.getMemoryUsage().size_bytes() + this.buffer.getMemoryUsage().size_bytes();
class="kw">return new MemInstrument.Report(var1);
}
}
}
class="kw">public class="kw">static class MemoryReport {
@Nonnull
class="kw">public class="kw">final List<BufferBundle.MemoryReport.GridEntry> gridEntries = new ArrayList<>();
class="kw">public MemoryReport() {
}
@Nonnull
@Override
class="kw">public String toString() {
this.gridEntries.sort((var0, var1x) -> {
if (var0.bufferType().index > var1x.bufferType().index) {
class="kw">return 1;
} else {
class="kw">return var0.bufferType().index < var1x.bufferType().index ? -1 : 0;
}
});
StringBuilder var1 = new StringBuilder();
long var2 = 0L;
for (BufferBundle.MemoryReport.GridEntry var5 : this.gridEntries) {
var2 += var5.report.size_bytes();
}
var2 /= 1000000L;
var1.append("Memory Usage Report\n");
var1.append("Buffers Memory Usage: ").append(var2).append(" mb\n");
for (BufferBundle.MemoryReport.GridEntry var8 : this.gridEntries) {
var1.append(var8.toString(1));
}
class="kw">return var1.toString();
}
class="kw">public record GridEntry(MemInstrument.Report report, int bufferCount, @Nonnull BufferType bufferType) {
class="kw">public GridEntry {
}
@Nonnull
class="kw">public String toString(int var1) {
long var2 = this.report.size_bytes() / 1000000L;
StringBuilder var4 = new StringBuilder();
var4.append("\t".repeat(var1)).append(this.bufferType.name + " Grid (Index ").append(this.bufferType().index).append("):\n");
var4.append("\t".repeat(var1 + 1)).append("Memory Footprint: ").append(var2).append(" mb\n");
var4.append("\t".repeat(var1 + 1)).append("Buffer Count: ").append(this.bufferCount).append("\n");
class="kw">return var4.toString();
}
}
}
class="kw">public class="kw">static class Tracker class="kw">implements MemInstrument {
class="kw">public class="kw">final int INITIAL_STAGE_INDEX = -1;
class="kw">public int stageIndex = -1;
class="kw">public Tracker() {
}
@Nonnull
@Override
class="kw">public MemInstrument.Report getMemoryUsage() {
class="kw">return new MemInstrument.Report(4L);
}
}
}