#javascript #android #react-native #expo #react-navigation
#javascript #Android #react-родной #expo #react-навигация
Вопрос:
В настоящее время я работаю над приложением React Native (Expo) и сталкиваюсь с некоторыми проблемами производительности. Я пока не нашел ответа на свою проблему, поэтому надеюсь, что кто-нибудь сможет мне помочь.
Моя проблема в том, что всякий раз, когда я запускаю приложение на своем физическом устройстве (Galaxy S9 ) и перехожу на разные экраны, я замечаю, что JS-кадры падают с 60 до 10-30. У меня есть навигатор главного ящика, навигатор нижней вкладки и несколько навигаторов стека. У меня есть базовый компонент View, Text, …, поэтому я не думаю, что это связано с тяжелыми компонентами.(Я использую react-navigation v5
)
Я также должен упомянуть, что я действительно не вижу никакого снижения производительности или снижения JS FPS в симуляторе iOS.
Ответ №1:
Устройства Android намного более чувствительны к неоптимизированному коду JavaScript, потому что они обычно имеют гораздо худшую производительность JS по сравнению с устройствами iOS, поэтому у вас меньше возможностей для написания неэффективного кода. Тот же код, который выполняется на iOS, может работать плавно, а на Android он может часто отбрасывать кадры.
Рекомендуется использовать React Devtools, чтобы понять источник низкой производительности рендеринга в приложениях React, и я думаю, что это прекрасный вариант здесь, и вы, безусловно, должны это сделать.
Еще одна вещь, которую вы можете сделать, это переключиться на createNativeStackNavigator, где бы вы ни использовали createStackNavigator
, и это поможет немного снизить некоторые ваши проблемы с производительностью в будущем. Вы также можете узнать больше об этом навигаторе в этом видео на YouTube.
Я бы лично сделал оба вышеперечисленных прямо сейчас: 1) профилируйте производительность рендеринга React и найдите, где вы выполняете ненужную / дополнительную работу, устраните это. 2) переключитесь на использование createNativeStackNavigator
.
Комментарии:
1. Спасибо за ваш ответ @brentvatne. Я действительно ценю, я попробую оба и дам вам знать как можно скорее. Хорошего дня!
2. Еще раз спасибо @brentvatne Я только что переключился
createNativeStackNavigator
, и все работает отлично. Я больше не получаю падения JS FPS!
Ответ №2:
Создайте свою собственную анимацию
Эта анимация сделает ваше приложение более быстрым
const App = () => {
const Stack = createStackNavigator();
const TransitionScreen = {
gestureDirection: 'horizontal',
transitionSpec: {
open: TransitionSpecs.TransitionIOSSpec,
close: TransitionSpecs.TransitionIOSSpec,
},
cardStyleInterpolator: ({current, next, layouts}) => {
return {
cardStyle: {
transform: [
{
translateX: current.progress.interpolate({
inputRange: [0, 1],
outputRange: [layouts.screen.width, 0],
}),
},
{
translateX: next
? next.progress.interpolate({
inputRange: [0, 1],
outputRange: [0, -layouts.screen.width],
})
: 1,
},
],
},
overlayStyle: {
opacity: current.progress.interpolate({
inputRange: [0, 1],
outputRange: [0, 0.5],
}),
},
};
},
};
const CardOptions = {
cardStyle: {backgroundColor: 'transparent'},
...TransitionScreen,
headerShown: false,
gestureEnabled: false,
};
return (
<NavigationContainer theme={DarkTheme}>
<Stack.Navigator>
<Stack.Screen
name="preloader"
component={PreLoader}
options={CardOptions}
/>
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;