код библиотеки, выполняющийся непосредственно во время рендера может делать максимум по 1 аллокации на 1 квад
Я честно не понимаю, что автор имел ввиду под "кодом выполняющимся непосредственно во время рендера", но предположим, что код, аналогичный его бенчмаркам, то есть вызывающий что-то подобное каждый кадр.
public class RotationExample implements Function<BakedQuad, BakedQuad> {
@Override
public BakedQuad apply(BakedQuad quad) {
return LazyUnpackedQuad.apply(quad)
.rotate((float) Math.toRadians(-90), 0, 1, 0)
.toBakedQuad();
}
}
У меня глаз от таких утверждений немножко дергается, я пошел и померил сколько же там на самом деле аллоцируется в трех примерах: ColoredExample, RotationExample и SliceExample.
Измерял я переделав примеры как-то так (и вызывая это каждый кадр):
package hohserg.endothermic.example.java;
import com.sun.management.ThreadMXBean;
import hohserg.endothermic.quad.immutable.LazyUnpackedQuad;
import net.minecraft.client.renderer.block.model.BakedQuad;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Function;
public class ColoredExample implements Function<BakedQuad, BakedQuad> {
@Override
public BakedQuad apply(BakedQuad quad) {
ThreadMXBean threadMXBean = (ThreadMXBean) ManagementFactory.getThreadMXBean();
List<BakedQuad> list = new ArrayList<>(1000);
long threadAllocatedBytes = threadMXBean.getThreadAllocatedBytes(Thread.currentThread().getId());
long time = System.nanoTime();
for (int i = 0; i < 1000; i++) {
list.add(LazyUnpackedQuad.apply(quad)
.reconstructBuilder()
.v1_r(255)//colored first vertex to red
.v2_g(255)//colored second vertex to green
.v3_b(255)//colored third vertex to blue
.build()
.toBakedQuad());
}
time = System.nanoTime() - time;
threadAllocatedBytes = threadMXBean.getThreadAllocatedBytes(Thread.currentThread().getId()) -
threadAllocatedBytes;
System.out.println("Alocated bytes for 1000 iterations: " + threadAllocatedBytes);
System.out.println("Time spend for 1000 iterations: " + time + " ns");
return list.get(ThreadLocalRandom.current().nextInt(list.size()));
}
}
Итак, вот что я намерил (все результаты на трансформацию одного квада, то есть деленные на 1000):
Название теста | Аллоцировано, байт/квад | Затрачено времени, нс/квад |
ColoredExample | 2896 | ~2000 |
RotationExample | 4456 | ~4200 |
SliceExample | 10152 | ~9100 |
Зачем я это делал? Чтобы подкрепить цифрами два банальных утверждения:
- Не надо утверждать сколько там аллокаций не померив
- Не надо такое выполнять в кадре, запейкате ваши модельки...