Skip to content

Commit 60cb864

Browse files
committed
Optimize ImDrawData memory consumption
1 parent 1dcf232 commit 60cb864

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

imgui-binding/src/main/java/imgui/ImDrawData.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@
1515
*/
1616
public final class ImDrawData extends ImGuiStruct {
1717
public static final int SIZEOF_IM_DRAW_IDX = 2;
18-
public static final int SIZEOF_IM_DRAW_VERT = (4 + 1) * 4;
18+
public static final int SIZEOF_IM_DRAW_VERT = 20;
1919

20-
private static final int FACTOR = 5_000;
20+
private static final int RESIZE_FACTOR = 5_000;
2121

22-
private ByteBuffer idxBuffer = ByteBuffer.allocateDirect(SIZEOF_IM_DRAW_IDX * FACTOR).order(ByteOrder.nativeOrder());
23-
private ByteBuffer vtxBuffer = ByteBuffer.allocateDirect(SIZEOF_IM_DRAW_VERT * FACTOR).order(ByteOrder.nativeOrder());
22+
private static ByteBuffer dataBuffer = ByteBuffer.allocateDirect(25_000).order(ByteOrder.nativeOrder());
2423

2524
public ImDrawData(final long ptr) {
2625
super(ptr);
@@ -91,16 +90,17 @@ public ImDrawData(final long ptr) {
9190

9291
public ByteBuffer getCmdListIdxBufferData(final int cmdListIdx) {
9392
final int idxBufferCapacity = getCmdListIdxBufferSize(cmdListIdx) * SIZEOF_IM_DRAW_IDX;
94-
if (idxBuffer.capacity() < idxBufferCapacity) {
95-
idxBuffer = ByteBuffer.allocateDirect(idxBufferCapacity + FACTOR).order(ByteOrder.nativeOrder());
93+
if (dataBuffer.capacity() < idxBufferCapacity) {
94+
dataBuffer.clear();
95+
dataBuffer = ByteBuffer.allocateDirect(idxBufferCapacity + RESIZE_FACTOR).order(ByteOrder.nativeOrder());
9696
}
9797

98-
nGetCmdListIdxBufferData(cmdListIdx, idxBuffer, idxBufferCapacity);
98+
nGetCmdListIdxBufferData(cmdListIdx, dataBuffer, idxBufferCapacity);
9999

100-
idxBuffer.position(0);
101-
idxBuffer.limit(idxBufferCapacity);
100+
dataBuffer.position(0);
101+
dataBuffer.limit(idxBufferCapacity);
102102

103-
return idxBuffer;
103+
return dataBuffer;
104104
}
105105

106106
private native void nGetCmdListIdxBufferData(int cmdListIdx, ByteBuffer idxBuffer, int idxBufferCapacity); /*
@@ -116,16 +116,17 @@ public ByteBuffer getCmdListIdxBufferData(final int cmdListIdx) {
116116

117117
public ByteBuffer getCmdListVtxBufferData(final int cmdListIdx) {
118118
final int vtxBufferCapacity = getCmdListVtxBufferSize(cmdListIdx) * SIZEOF_IM_DRAW_VERT;
119-
if (vtxBuffer.capacity() < vtxBufferCapacity) {
120-
vtxBuffer = ByteBuffer.allocateDirect(vtxBufferCapacity + FACTOR).order(ByteOrder.nativeOrder());
119+
if (dataBuffer.capacity() < vtxBufferCapacity) {
120+
dataBuffer.clear();
121+
dataBuffer = ByteBuffer.allocateDirect(vtxBufferCapacity + RESIZE_FACTOR).order(ByteOrder.nativeOrder());
121122
}
122123

123-
nGetCmdListVtxBufferData(cmdListIdx, vtxBuffer, vtxBufferCapacity);
124+
nGetCmdListVtxBufferData(cmdListIdx, dataBuffer, vtxBufferCapacity);
124125

125-
vtxBuffer.position(0);
126-
vtxBuffer.limit(vtxBufferCapacity);
126+
dataBuffer.position(0);
127+
dataBuffer.limit(vtxBufferCapacity);
127128

128-
return vtxBuffer;
129+
return dataBuffer;
129130
}
130131

131132
private native void nGetCmdListVtxBufferData(int cmdListIdx, ByteBuffer vtxBuffer, int vtxBufferCapacity); /*

0 commit comments

Comments
 (0)