Skip to content

Commit b7184e6

Browse files
authored
perf: release asset buffers once assets are loaded (#106)
1 parent 86c517c commit b7184e6

File tree

7 files changed

+56
-25
lines changed

7 files changed

+56
-25
lines changed

package/android/src/main/cpp/AndroidManagedBuffer.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class AndroidManagedBuffer : public ManagedBuffer {
1919
}
2020

2121
~AndroidManagedBuffer() override {
22-
jni::ThreadScope::WithClassLoader([&] { _buffer.reset(); });
22+
releaseBuffer();
2323
}
2424

2525
const uint8_t* getData() const override {
@@ -30,6 +30,14 @@ class AndroidManagedBuffer : public ManagedBuffer {
3030
return _buffer->getDirectSize();
3131
}
3232

33+
void release() override {
34+
releaseBuffer();
35+
}
36+
37+
void releaseBuffer() {
38+
jni::ThreadScope::WithClassLoader([&] { _buffer.reset(); });
39+
}
40+
3341
private:
3442
jni::global_ref<jni::JByteBuffer> _buffer;
3543
};

package/cpp/FilamentBuffer.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,19 @@ class FilamentBuffer : public HybridObject {
99
public:
1010
explicit FilamentBuffer(const std::shared_ptr<ManagedBuffer>& buffer) : HybridObject("FilamentBuffer"), _buffer(buffer) {}
1111

12-
void loadHybridMethods() override {}
12+
void loadHybridMethods() override {
13+
registerHybridMethod("release", &FilamentBuffer::release, this);
14+
}
1315

1416
const std::shared_ptr<ManagedBuffer>& getBuffer() {
1517
return _buffer;
1618
}
1719

20+
void release() {
21+
Logger::log("FilamentBuffer", "Manually releasing buffer of size %fmb", static_cast<float>(_buffer->getSize()) / 1024 / 1024);
22+
_buffer->release();
23+
}
24+
1825
private:
1926
std::shared_ptr<ManagedBuffer> _buffer;
2027
};

package/cpp/ManagedBuffer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ class ManagedBuffer {
1414
virtual ~ManagedBuffer() {}
1515
virtual const uint8_t* getData() const = 0;
1616
virtual size_t getSize() const = 0;
17+
// Note: in general we don't want to manually release anything.
18+
// However, the reference to the Buffers is managed on the JS side and Hades seldomly
19+
// GCs these buffers as it can't see their true size. Thus we need a mechanism to
20+
// manually release the memory of the buffers once we have loaded an asset.
21+
virtual void release() {}
1722
};
1823

1924
} // namespace margelo

package/example/ios/Podfile.lock

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -886,81 +886,81 @@ PODS:
886886
- React-Mapbuffer (0.73.4):
887887
- glog
888888
- React-debug
889-
- react-native-filament (0.19.2):
889+
- react-native-filament (0.22.0):
890890
- glog
891891
- RCT-Folly (= 2022.05.16.00)
892892
- React-Core
893-
- react-native-filament/camutils (= 0.19.2)
894-
- react-native-filament/filamat (= 0.19.2)
895-
- react-native-filament/filament (= 0.19.2)
896-
- react-native-filament/gltfio_core (= 0.19.2)
897-
- react-native-filament/image (= 0.19.2)
898-
- react-native-filament/ktxreader (= 0.19.2)
899-
- react-native-filament/math (= 0.19.2)
900-
- react-native-filament/tsl (= 0.19.2)
901-
- react-native-filament/uberz (= 0.19.2)
902-
- react-native-filament/utils (= 0.19.2)
893+
- react-native-filament/camutils (= 0.22.0)
894+
- react-native-filament/filamat (= 0.22.0)
895+
- react-native-filament/filament (= 0.22.0)
896+
- react-native-filament/gltfio_core (= 0.22.0)
897+
- react-native-filament/image (= 0.22.0)
898+
- react-native-filament/ktxreader (= 0.22.0)
899+
- react-native-filament/math (= 0.22.0)
900+
- react-native-filament/tsl (= 0.22.0)
901+
- react-native-filament/uberz (= 0.22.0)
902+
- react-native-filament/utils (= 0.22.0)
903903
- react-native-worklets-core
904-
- react-native-filament/camutils (0.19.2):
904+
- react-native-filament/camutils (0.22.0):
905905
- glog
906906
- RCT-Folly (= 2022.05.16.00)
907907
- React-Core
908908
- react-native-filament/math
909909
- react-native-worklets-core
910-
- react-native-filament/filamat (0.19.2):
910+
- react-native-filament/filamat (0.22.0):
911911
- glog
912912
- RCT-Folly (= 2022.05.16.00)
913913
- React-Core
914914
- react-native-filament/math
915915
- react-native-filament/utils
916916
- react-native-worklets-core
917-
- react-native-filament/filament (0.19.2):
917+
- react-native-filament/filament (0.22.0):
918918
- glog
919919
- RCT-Folly (= 2022.05.16.00)
920920
- React-Core
921921
- react-native-filament/math
922922
- react-native-filament/utils
923923
- react-native-worklets-core
924-
- react-native-filament/gltfio_core (0.19.2):
924+
- react-native-filament/gltfio_core (0.22.0):
925925
- glog
926926
- RCT-Folly (= 2022.05.16.00)
927927
- React-Core
928928
- react-native-filament/filament
929929
- react-native-filament/ktxreader
930930
- react-native-filament/uberz
931931
- react-native-worklets-core
932-
- react-native-filament/image (0.19.2):
932+
- react-native-filament/image (0.22.0):
933933
- glog
934934
- RCT-Folly (= 2022.05.16.00)
935935
- React-Core
936936
- react-native-filament/filament
937937
- react-native-worklets-core
938-
- react-native-filament/ktxreader (0.19.2):
938+
- react-native-filament/ktxreader (0.22.0):
939939
- glog
940940
- RCT-Folly (= 2022.05.16.00)
941941
- React-Core
942942
- react-native-filament/filament
943943
- react-native-filament/image
944944
- react-native-worklets-core
945-
- react-native-filament/math (0.19.2):
945+
- react-native-filament/math (0.22.0):
946946
- glog
947947
- RCT-Folly (= 2022.05.16.00)
948948
- React-Core
949949
- react-native-worklets-core
950-
- react-native-filament/tsl (0.19.2):
950+
- react-native-filament/tsl (0.22.0):
951951
- glog
952952
- RCT-Folly (= 2022.05.16.00)
953953
- React-Core
954954
- react-native-worklets-core
955-
- react-native-filament/uberz (0.19.2):
955+
- react-native-filament/uberz (0.22.0):
956956
- glog
957957
- RCT-Folly (= 2022.05.16.00)
958958
- React-Core
959959
- react-native-filament/filamat
960960
- react-native-filament/tsl
961961
- react-native-filament/utils
962962
- react-native-worklets-core
963-
- react-native-filament/utils (0.19.2):
963+
- react-native-filament/utils (0.22.0):
964964
- glog
965965
- RCT-Folly (= 2022.05.16.00)
966966
- React-Core
@@ -1346,7 +1346,7 @@ SPEC CHECKSUMS:
13461346
React-jsinspector: 9ac353eccf6ab54d1e0a33862ba91221d1e88460
13471347
React-logger: 0a57b68dd2aec7ff738195f081f0520724b35dab
13481348
React-Mapbuffer: 63913773ed7f96b814a2521e13e6d010282096ad
1349-
react-native-filament: 237b6f9f7afecfecf3fb0d3887b12db7c26a0f87
1349+
react-native-filament: a5fa3cbbe340d29b8efca8d269b78245fbc81503
13501350
react-native-safe-area-context: b97eb6f9e3b7f437806c2ce5983f479f8eb5de4b
13511351
react-native-worklets-core: 81033d42d22985176f9d1ef97378df02c092232e
13521352
React-nativeconfig: d7af5bae6da70fa15ce44f045621cf99ed24087c

package/ios/src/AppleManagedBuffer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ class AppleManagedBuffer : public ManagedBuffer {
2424
return _data.length;
2525
}
2626

27+
// Manual release mechanism
28+
void release() override {
29+
_data = nil;
30+
}
31+
2732
private:
2833
NSData* _data;
2934
};

package/src/hooks/useModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export function useModel({ path, engine, shouldReleaseSourceData, autoAddToScene
7070
loadedAsset = engine.loadInstancedAsset(assetBuffer, instanceCount)
7171
}
7272

73+
assetBuffer.release()
7374
return loadedAsset
7475
}, context)().then(setAsset)
7576
}, [assetBuffer, context, engine, instanceCount])
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1-
export interface FilamentBuffer {}
1+
export interface FilamentBuffer {
2+
/**
3+
* Internal method to release memory early when the buffer is no longer needed.
4+
*/
5+
release(): void
6+
}
27

38
export type Asset = FilamentBuffer

0 commit comments

Comments
 (0)