WPF 앱에서 DirectX로 작업하기 시작했습니다. 내 첫 번째 단계는 간단한 라이브러리를 사용하는 것입니다 : SharpdDX.WPF. 샘플을 기반으로 간단한 선을 그리는 WPF 컨트롤을 구현했습니다. SharpDX.WPF는 D3DImage를 사용하여 WPF에서 이미지를 렌더링합니다. 불행히도 응용 프로그램의 메모리가 항상 증가합니다.SharpDX.WPF 렌더링시 메모리 사용량 증가
클래스 TestControlRenderer : D3D10을 구현했습니다. 그런 재정의 된
_controlInfoConstantBuffer = new ConstantBuffer<ControlParamsShaderData>(Device);
Device.VertexShader.SetConstantBuffer(0, _controlInfoConstantBuffer.Buffer);
애니메이션 리셋 방법을 초기화하기 : 쉐이더에서 사용하는 파라미터와
var sizeInBytes = dataLength * sizeof(int) * 3;
var bufferDescription = new BufferDescription(
sizeInBytes,
ResourceUsage.Dynamic,
BindFlags.VertexBuffer,
CpuAccessFlags.Write,
ResourceOptionFlags.None);
using (var stream = new DataStream(sizeInBytes, true, true))
{
stream.Position = 0;
_graphDataVertexBuffer = new SharpDX.Direct3D10.Buffer(Device, stream, bufferDescription);
}
Device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_graphDataVertexBuffer, sizeof(int) * 3, 0));
Device.InputAssembler.PrimitiveTopology = PrimitiveTopology.LineStrip;
이어서 일정한 완충액 : 정점 셰이더들은 동일한 초기화
base.Reset(args);
if (args.RenderSize.Width == 0) return;
_drawArgs = args;
InitVertexBuffer(dataLength);
_controlInfoConstantBuffer.Value = new ControlParamsShaderData
{
SamplesInControl = dataLength,
MinSignalDataY = -1500,
MaxSignalDataY = 1500
};
Device.VertexShader.SetConstantBuffer(0, _controlInfoConstantBuffer.Buffer);
마지막 단계 RenderScene 메서드입니다.
public override void RenderScene(DrawEventArgs args)
{
if (args.RenderSize.Width == 0) return;
Device.ClearRenderTargetView(RenderTargetView, Color.Transparent);
using (var stream = _graphDataVertexBuffer.Map(MapMode.WriteDiscard, SharpDX.Direct3D10.MapFlags.None))
{
for (int i = 0; i < Data.Length; i++)
{
stream.Write(new Vector3(i, Data[i], 0));
}
}
_graphDataVertexBuffer.Unmap();
Device.Draw(Data.Length, 0);
}
렌더링은 DispatcherTimer에 의해 제어되며, OnTickMethod는 점 좌표로 배열을 업데이트 한 다음 Render() 메서드를 호출합니다.
제 질문은 간단히 말해서, 메모리 누수가 발생하거나 각 렌더 반복마다 무언가가 생성되는 것입니까? 백 버퍼를 변경하거나 다른 개체를 만들지 않습니다. 데이터 배열 만 변경하고 GPU로 업데이트하면 셰이더가 처리하여 표시합니다. 제 경우는 한 화면에 약 30 wpf 컨트롤의 너비 인 DirectX를 표시하는 것입니다. 컨트롤은 간단하지만 실시간 애니메이션입니다. 그렇게 가능합니까?
않는 당신'폐기()''graphDataVertexBuffer' 수있다? – thumbmunkeys