Tôi đang viết một ứng dụng đọc sách điện tử cho Windows Store. Tôi đang sử dụng chuỗi trao đổi Direct2D + DXGI để hiển thị các trang sách trên màn hình.Đa luồng Direct2D hiệu quả
Nội dung sách của tôi đôi khi khá phức tạp (hình học, bitmap, mặt nạ, v.v.), vì vậy có thể mất đến 100 mili giây để hiển thị nội dung sách. Vì vậy, tôi đang cố gắng để làm một màn hình hiển thị off-bit cho một bitmap trong một chủ đề riêng biệt, và sau đó chỉ hiển thị bitmap này trong chủ đề chính.
Tuy nhiên, tôi không thể biết cách thực hiện điều đó một cách hiệu quả.
Cho đến nay tôi đã thử hai cách tiếp cận:
Sử dụng một đơn
ID2D1Factory
với D2D1_FACTORY_TYPE_MULTI_THREADED cờ, tạoID2D1BitmapRenderTarget
và sử dụng nó trong chủ đề nền cho vẽ ra màn hình. (Điều này bổ sung yêu cầuID2D1Multithread::Enter/Leave
trên các hoạt độngIDXGISwapChain::Present
). Vấn đề là, hoạt độngID2D1RenderTarget::EndDraw
trong chủ đề nền đôi khi mất đến 100ms và hiển thị chuỗi chính bị chặn trong khoảng thời gian này do khóa Direct2D bên trong.Sử dụng
ID2D1Factory
riêng biệt trong chuỗi nền (như được mô tả trong http://www.sdknews.com/ios/using-direct2d-for-server-side-rendering) và tắt đồng bộ hóa Direct2D bên trong. Không có cross-locking betwen hai chủ đề trong trường hợp này. Thật không may, trong trường hợp này tôi không thể sử dụng kết quả bitmap trong chínhID2D1Factory
trực tiếp, bởi vì nó thuộc về một nhà máy khác nhau. Tôi phải di chuyển dữ liệu bitmap vào bộ nhớ CPU, sau đó sao chép nó vào bộ nhớ GPU của chínhID2D1Factory
. Hoạt động này cũng giới thiệu các sự chậm trễ đáng kể (tôi tin rằng đó là do truy cập bộ nhớ lớn, nhưng tôi không chắc chắn).
Có cách nào để thực hiện điều này một cách hiệu quả không?
P.S. Tất cả thời gian ở đây được cung cấp cho Acer Switch 10 tablet. Trên PC Core i7 thông thường, cả hai cách tiếp cận hoạt động mà không có bất kỳ độ trễ hiển thị nào.