Optimize ImDrawData memory consumption

This commit is contained in:
SpaiR committed 2020-08-23 16:56:49 +03:00
1 parent 1dcf2328a4
commit 60cb864fef
1 file changed
+17 -16
@@ -15,12 +15,11 @@ import java.nio.ByteOrder;
*/ */
public final class ImDrawData extends ImGuiStruct { public final class ImDrawData extends ImGuiStruct {
public static final int SIZEOF_IM_DRAW_IDX = 2; public static final int SIZEOF_IM_DRAW_IDX = 2;
public static final int SIZEOF_IM_DRAW_VERT = (4 + 1) * 4; public static final int SIZEOF_IM_DRAW_VERT = 20;
private static final int FACTOR = 5_000; private static final int RESIZE_FACTOR = 5_000;
private ByteBuffer idxBuffer = ByteBuffer.allocateDirect(SIZEOF_IM_DRAW_IDX * FACTOR).order(ByteOrder.nativeOrder()); private static ByteBuffer dataBuffer = ByteBuffer.allocateDirect(25_000).order(ByteOrder.nativeOrder());
private ByteBuffer vtxBuffer = ByteBuffer.allocateDirect(SIZEOF_IM_DRAW_VERT * FACTOR).order(ByteOrder.nativeOrder());
public ImDrawData(final long ptr) { public ImDrawData(final long ptr) {
super(ptr); super(ptr);
@@ -91,16 +90,17 @@ public final class ImDrawData extends ImGuiStruct {
public ByteBuffer getCmdListIdxBufferData(final int cmdListIdx) { public ByteBuffer getCmdListIdxBufferData(final int cmdListIdx) {
final int idxBufferCapacity = getCmdListIdxBufferSize(cmdListIdx) * SIZEOF_IM_DRAW_IDX; final int idxBufferCapacity = getCmdListIdxBufferSize(cmdListIdx) * SIZEOF_IM_DRAW_IDX;
if (idxBuffer.capacity() < idxBufferCapacity) { if (dataBuffer.capacity() < idxBufferCapacity) {
idxBuffer = ByteBuffer.allocateDirect(idxBufferCapacity + FACTOR).order(ByteOrder.nativeOrder()); dataBuffer.clear();
dataBuffer = ByteBuffer.allocateDirect(idxBufferCapacity + RESIZE_FACTOR).order(ByteOrder.nativeOrder());
} }
nGetCmdListIdxBufferData(cmdListIdx, idxBuffer, idxBufferCapacity); nGetCmdListIdxBufferData(cmdListIdx, dataBuffer, idxBufferCapacity);
idxBuffer.position(0); dataBuffer.position(0);
idxBuffer.limit(idxBufferCapacity); dataBuffer.limit(idxBufferCapacity);
return idxBuffer; return dataBuffer;
} }
private native void nGetCmdListIdxBufferData(int cmdListIdx, ByteBuffer idxBuffer, int idxBufferCapacity); /* private native void nGetCmdListIdxBufferData(int cmdListIdx, ByteBuffer idxBuffer, int idxBufferCapacity); /*
@@ -116,16 +116,17 @@ public final class ImDrawData extends ImGuiStruct {
public ByteBuffer getCmdListVtxBufferData(final int cmdListIdx) { public ByteBuffer getCmdListVtxBufferData(final int cmdListIdx) {
final int vtxBufferCapacity = getCmdListVtxBufferSize(cmdListIdx) * SIZEOF_IM_DRAW_VERT; final int vtxBufferCapacity = getCmdListVtxBufferSize(cmdListIdx) * SIZEOF_IM_DRAW_VERT;
if (vtxBuffer.capacity() < vtxBufferCapacity) { if (dataBuffer.capacity() < vtxBufferCapacity) {
vtxBuffer = ByteBuffer.allocateDirect(vtxBufferCapacity + FACTOR).order(ByteOrder.nativeOrder()); dataBuffer.clear();
dataBuffer = ByteBuffer.allocateDirect(vtxBufferCapacity + RESIZE_FACTOR).order(ByteOrder.nativeOrder());
} }
nGetCmdListVtxBufferData(cmdListIdx, vtxBuffer, vtxBufferCapacity); nGetCmdListVtxBufferData(cmdListIdx, dataBuffer, vtxBufferCapacity);
vtxBuffer.position(0); dataBuffer.position(0);
vtxBuffer.limit(vtxBufferCapacity); dataBuffer.limit(vtxBufferCapacity);
return vtxBuffer; return dataBuffer;
} }
private native void nGetCmdListVtxBufferData(int cmdListIdx, ByteBuffer vtxBuffer, int vtxBufferCapacity); /* private native void nGetCmdListVtxBufferData(int cmdListIdx, ByteBuffer vtxBuffer, int vtxBufferCapacity); /*