Skip to content

Commit b0b928f

Browse files
authored
Fix an issue where Android can fire extra app state change events when the state didn't actually change (#80)
1 parent 01394fa commit b0b928f

File tree

6 files changed

+43
-48
lines changed

6 files changed

+43
-48
lines changed

Apps/PackageTest/package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/PackageTest/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"lint": "eslint . --ext .js,.jsx,.ts,.tsx"
1111
},
1212
"dependencies": {
13-
"@babylonjs/core": "^4.2.0-beta.1",
13+
"@babylonjs/core": "^4.2.0-beta.2",
1414
"@babylonjs/react-native": "file:../../Package/Assembled/babylonjs-react-native-0.0.1.tgz",
1515
"react": "16.13.1",
1616
"react-native": "0.63.1",

Apps/Playground/package-lock.json

+11-21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/Playground/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"lint": "eslint . --ext .js,.jsx,.ts,.tsx"
1111
},
1212
"dependencies": {
13-
"@babylonjs/core": "^4.2.0-beta.1",
14-
"@babylonjs/loaders": "^4.2.0-beta.1",
13+
"@babylonjs/core": "^4.2.0-beta.2",
14+
"@babylonjs/loaders": "^4.2.0-beta.2",
1515
"@babylonjs/react-native": "file:../../Modules/@babylonjs/react-native",
1616
"@react-native-community/slider": "^2.0.9",
1717
"logkitty": "^0.7.1",

Modules/@babylonjs/react-native/EngineHook.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,12 @@ export function useEngine(): Engine | undefined {
6666
const [engine, setEngine] = useState<Engine>();
6767

6868
useEffect(() => {
69-
let engine: Engine | undefined;
7069
let disposed = false;
7170

7271
(async () => {
7372
if (await BabylonModule.initialize() && !disposed)
7473
{
75-
engine = new NativeEngine();
74+
const engine = new NativeEngine();
7675

7776
// NOTE: This is a workaround for https://github.com/BabylonJS/BabylonReactNative/issues/60
7877
let heartbeat: NodeJS.Timeout | null;
@@ -119,9 +118,12 @@ export function useEngine(): Engine | undefined {
119118

120119
return () => {
121120
disposed = true;
122-
if (engine) {
123-
DisposeEngine(engine);
124-
}
121+
setEngine(engine => {
122+
if (engine) {
123+
DisposeEngine(engine);
124+
}
125+
return undefined;
126+
})
125127
};
126128
}, []);
127129

Modules/@babylonjs/react-native/EngineView.tsx

+19-16
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export interface EngineViewCallbacks {
3737

3838
export const EngineView: FunctionComponent<EngineViewProps> = (props: EngineViewProps) => {
3939
const [failedInitialization, setFailedInitialization] = useState(false);
40+
const [appState, setAppState] = useState(AppState.currentState);
4041
const [fps, setFps] = useState<number>();
4142
const engineViewRef = useRef<Component<NativeEngineViewProps>>(null);
4243
const snapshotPromise = useRef<{promise: Promise<string>, resolve: (data: string) => void}>();
@@ -50,34 +51,36 @@ export const EngineView: FunctionComponent<EngineViewProps> = (props: EngineView
5051
}, []);
5152

5253
useEffect(() => {
53-
if (props.camera) {
54+
const onAppStateChanged = (appState: AppStateStatus) => {
55+
setAppState(appState);
56+
};
57+
58+
AppState.addEventListener("change", onAppStateChanged);
59+
60+
return () => {
61+
AppState.removeEventListener("change", onAppStateChanged);
62+
}
63+
}, []);
64+
65+
useEffect(() => {
66+
if (props.camera && appState === "active") {
5467
const engine = props.camera.getScene().getEngine();
5568

5669
if (!IsEngineDisposed(engine)) {
57-
const onAppStateChanged = (appState: AppStateStatus) => {
58-
if (appState === "active") {
59-
engine.runRenderLoop(() => {
60-
for (let scene of engine.scenes) {
61-
scene.render();
62-
}
63-
});
64-
} else {
65-
engine.stopRenderLoop();
70+
engine.runRenderLoop(() => {
71+
for (let scene of engine.scenes) {
72+
scene.render();
6673
}
67-
};
68-
69-
onAppStateChanged(AppState.currentState);
70-
AppState.addEventListener("change", onAppStateChanged);
74+
});
7175

7276
return () => {
7377
if (!IsEngineDisposed(engine)) {
7478
engine.stopRenderLoop();
7579
}
76-
AppState.removeEventListener("change", onAppStateChanged);
7780
};
7881
}
7982
}
80-
}, [props.camera]);
83+
}, [props.camera, appState]);
8184

8285
useEffect(() => {
8386
if (props.camera && (props.displayFrameRate ?? __DEV__)) {

0 commit comments

Comments
 (0)