syxme
@syxme

Direct2d winapi почему высокая нагрузка gpu на dwm.exe?

Инициализация direct2d
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory);
		DWriteCreateFactory(DWRITE_FACTORY_TYPE_ISOLATED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown **>(&wFactory));
		DPIScale::Initialize(factory);
		HWND hand = mWindowStatic->getWindowHandle();
		factory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),D2D1::HwndRenderTargetProperties(hand, D2D1::SizeU(mWidth, mHeight)),&renderTarget);
        renderTarget->SetDpi(96, 96);

Создание окна Windows
WNDCLASSEXW windowClass = {0};
		windowClass.cbSize = sizeof(WNDCLASSEX);
		windowClass.hbrBackground = NULL;
		windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
		windowClass.hInstance = NULL;
		//windowClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
		windowClass.lpfnWndProc = MessageRouter;
		windowClass.lpszClassName = title.c_str();
		windowClass.lpszMenuName  = NULL;
		windowClass.style = CS_HREDRAW | CS_VREDRAW;
		RegisterClassExW(&windowClass);

		int aElements[2] = {COLOR_ACTIVECAPTION, COLOR_ACTIVECAPTION};

		windowHandle = CreateWindowExA(
				WS_EX_WINDOWEDGE,
				std::string(title.cbegin(),title.cend()).c_str(),
				NULL,
				WS_POPUP | WS_VISIBLE | WS_SIZEBOX,
				posX,
				posY,
				width,
				height,
				NULL,
				NULL,
				NULL,
				this);


Ну и естественно рисование
renderTarget->BeginDraw();
//1 кадр рисую UI 
//Все остальные кадры перерисовываю область 100x50px через PushAxisAlignedClip
renderTarget->PushAxisAlignedClip(rect,D2D1_ANTIALIAS_MODE_ALIASED);

renderTarget->PopAxisAlignedClip();

renderTarget->EndDraw();

Проблема в том что даже если я оптимизирую реднеринг перерисовывая грязные треугольники dwm нагружается так, что как будто ему отсылается полностью весь буффер изображения.
Возможно ли как то сказать ему что я перерисовываю только маленькую область окна?

P.S Интерфейс рисую полностью на direct2d, без участия WM_PAINT
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы