상당히 복잡한 (메모리가 많은) 많은 항목이 있는데 제한된 RAM에 맞추기 위해 일부를 텍스처에 캐시하고 실제 복잡한 항목을 메모리에 보관하지 않습니다. 특히 내가하고 싶은 항목은 현재 애니메이션을 적용 할 필요가없는 모든 항목 (내 복잡한 항목 중에서)입니다 (그리고 대부분의 항목을 의미 함). 이 질문의 목적을 위해이 항목을 "비활성"이라고합니다.복잡한 항목을 텍스처에 캐시하고 실제 복잡한 항목의 메모리를 해제하는 방법은 무엇입니까?
내 계획이었다 : live: false; source: foo
으로 (더 ShaderEffect
를 관련과)
- 가
foo
에 의해 점유 된 것과 동일한 사각형에 동적으로ShaderEffectSource
를 작성하지 :- 항목 "푸"비활성화 될 때 .
ShaderEffectSource
업데이트가되는ShaderEffectSource
- 에
- 전화
scheduleUpdate()
,이 계획의 문제점foo
- 항목 "푸"비활성화 될 때 .
에 destroy()
를 호출하면 "를 ShaderEffectSource
가 업데이트된다"일 함께 : 없음이 일어날 때 알려주는 신호. scheduleUpdate()
이 다음 프레임에 대한 업데이트 을 예약한다는 사실 (the docs)을 사용할 수 있습니다. 그래서 아마 이런 식으로 뭔가를 보이는 Timer
을 시작할 것 :
== 2
체크 우리는 (예약 된 업데이트가 이미 일어난 것을 보장하지 않는) 다음 프레임에 도달하지했는지 확인하는 것입니다 Timer {
interval: 1 // 1ms interval meaning "fire every frame"
property int timesTriggered: 0
repeat: true
running: false
onTriggered: {
timesTriggered++;
if(timesTriggered == 2) {
complexItem.destroy();
running = false;
}
}
}
그러나 그 후 프레임에 도달했습니다.
하지만 그 방법은 해킹입니다. 해킹이 아닌 접근 방법이 있습니까? 당신이 QQuickRenderControl
를 사용할 필요가 같은
프레임 당 60fps ~ 16.67ms가 맞지 않습니까? 그래서 나는'간격 : 1'이 꽤 하드 코어라고 생각합니다. – derM
실제 프레임 속도와 동기화하거나 다음 렌더링 루프에서 호출을 예약하는 좋은 방법이 있습니다. – dtech
@derM : QML 타이머 트리거가 렌더 루프와 "동기화"되어 있으므로 높은 빈도를 요청하더라도 장면 새로 고침 속도보다 빠르게 발생하지 않습니다. 그래서 내가 먼저 가서 "1ms"를 선택했습니다. –