mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-16 11:20:18 +00:00
Introduces ASLayoutRangeModeVisibleOnly, allowing the preservation of decoded backing stores without any extra padding to strictly minimize memory usage while supporting immediate re-display of content. Set visible range controllers to this mode upon app suspend / memory warning, while more aggressively clearing others to the ASLayoutRangeModeLowMemory mode. By default, when the app is running and recieves a memory warning, we set the range mode for non-visible controllers to ASLayoutRangeModeVisibleOnly. This is because, unlike in the app suspend case where on app resume we can restore controllers from LowMemory to VisibleOnly, the memory warning doesn't provide a good opportunity to do this. A new +Beta API to control this behavior is called +setRangeModeForMemoryWarnings:, as some apps may prefer to use LowMemory in the memory warning scenario. For these apps, optimal user experience will require manually setting the range mode back to some larger value as the user navigates the app, or they will encounter controllers that are temporarily blank and need a moment to re-display their contents as they start to become visible.
123 lines
4.3 KiB
Plaintext
123 lines
4.3 KiB
Plaintext
/* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
#import "ASAbstractLayoutController.h"
|
|
#import "ASAssert.h"
|
|
#include <vector>
|
|
|
|
extern ASRangeTuningParameters const ASRangeTuningParametersZero = {};
|
|
|
|
extern BOOL ASRangeTuningParametersEqualToRangeTuningParameters(ASRangeTuningParameters lhs, ASRangeTuningParameters rhs)
|
|
{
|
|
return lhs.leadingBufferScreenfuls == rhs.leadingBufferScreenfuls && lhs.trailingBufferScreenfuls == rhs.trailingBufferScreenfuls;
|
|
}
|
|
|
|
@interface ASAbstractLayoutController () {
|
|
std::vector<std::vector<ASRangeTuningParameters>> _tuningParameters;
|
|
CGSize _viewportSize;
|
|
}
|
|
@end
|
|
|
|
@implementation ASAbstractLayoutController
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (!(self = [super init])) {
|
|
return nil;
|
|
}
|
|
|
|
_tuningParameters = std::vector<std::vector<ASRangeTuningParameters>> (ASLayoutRangeModeCount, std::vector<ASRangeTuningParameters> (ASLayoutRangeTypeCount));
|
|
|
|
_tuningParameters[ASLayoutRangeModeMinimum][ASLayoutRangeTypeDisplay] = {
|
|
.leadingBufferScreenfuls = 0.25,
|
|
.trailingBufferScreenfuls = 0.25
|
|
};
|
|
_tuningParameters[ASLayoutRangeModeMinimum][ASLayoutRangeTypeFetchData] = {
|
|
.leadingBufferScreenfuls = 1,
|
|
.trailingBufferScreenfuls = 1
|
|
};
|
|
|
|
_tuningParameters[ASLayoutRangeModeFull][ASLayoutRangeTypeDisplay] = {
|
|
.leadingBufferScreenfuls = 1.5,
|
|
.trailingBufferScreenfuls = 0.75
|
|
};
|
|
_tuningParameters[ASLayoutRangeModeFull][ASLayoutRangeTypeFetchData] = {
|
|
.leadingBufferScreenfuls = 3,
|
|
.trailingBufferScreenfuls = 2
|
|
};
|
|
|
|
_tuningParameters[ASLayoutRangeModeVisibleOnly][ASLayoutRangeTypeDisplay] = {
|
|
.leadingBufferScreenfuls = 0,
|
|
.trailingBufferScreenfuls = 0
|
|
};
|
|
_tuningParameters[ASLayoutRangeModeVisibleOnly][ASLayoutRangeTypeFetchData] = {
|
|
.leadingBufferScreenfuls = 0,
|
|
.trailingBufferScreenfuls = 0
|
|
};
|
|
|
|
// The Low Memory range mode has special handling. Because a zero range still includes the visible area / bounds,
|
|
// in order to implement the behavior of releasing all graphics memory (backing stores), ASRangeController must check
|
|
// for this range mode and use an empty set for displayIndexPaths rather than querying the ASLayoutController for the indexPaths.
|
|
_tuningParameters[ASLayoutRangeModeLowMemory][ASLayoutRangeTypeDisplay] = {
|
|
.leadingBufferScreenfuls = 0,
|
|
.trailingBufferScreenfuls = 0
|
|
};
|
|
_tuningParameters[ASLayoutRangeModeLowMemory][ASLayoutRangeTypeFetchData] = {
|
|
.leadingBufferScreenfuls = 0,
|
|
.trailingBufferScreenfuls = 0
|
|
};
|
|
|
|
return self;
|
|
}
|
|
|
|
#pragma mark - Tuning Parameters
|
|
|
|
- (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType
|
|
{
|
|
return [self tuningParametersForRangeMode:ASLayoutRangeModeFull rangeType:rangeType];
|
|
}
|
|
|
|
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType
|
|
{
|
|
return [self setTuningParameters:tuningParameters forRangeMode:ASLayoutRangeModeFull rangeType:rangeType];
|
|
}
|
|
|
|
- (ASRangeTuningParameters)tuningParametersForRangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType
|
|
{
|
|
ASDisplayNodeAssert(rangeMode < _tuningParameters.size() && rangeType < _tuningParameters[rangeMode].size(),
|
|
@"Requesting a range that is OOB for the configured tuning parameters");
|
|
return _tuningParameters[rangeMode][rangeType];
|
|
}
|
|
|
|
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType
|
|
{
|
|
ASDisplayNodeAssert(rangeMode < _tuningParameters.size() && rangeType < _tuningParameters[rangeMode].size(),
|
|
@"Setting a range that is OOB for the configured tuning parameters");
|
|
_tuningParameters[rangeMode][rangeType] = tuningParameters;
|
|
}
|
|
|
|
#pragma mark - Abstract Index Path Range Support
|
|
|
|
- (NSSet *)indexPathsForScrolling:(ASScrollDirection)scrollDirection rangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType
|
|
{
|
|
ASDisplayNodeAssertNotSupported();
|
|
return nil;
|
|
}
|
|
|
|
- (void)setViewportSize:(CGSize)viewportSize
|
|
{
|
|
_viewportSize = viewportSize;
|
|
}
|
|
|
|
- (CGSize)viewportSize
|
|
{
|
|
return _viewportSize;
|
|
}
|
|
|
|
@end
|