Tôi đã nhìn xung quanh rất nhiều và các phương pháp duy nhất mà tôi đã tìm thấy để tạo một Texture2D từ một Bitmap là:Có cách thay thế nhanh nào để tạo Texture2D từ đối tượng Bitmap trong XNA không?
using (MemoryStream s = new MemoryStream())
{
bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);
s.Seek(0, SeekOrigin.Begin);
Texture2D tx = Texture2D.FromFile(device, s);
}
và
Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);
đâu rgbValues là một mảng byte chứa của bitmap dữ liệu pixel ở định dạng ARGB 32 bit.
Câu hỏi của tôi là, có cách tiếp cận nào nhanh hơn mà tôi có thể thử không?
Tôi đang viết trình chỉnh sửa bản đồ phải đọc trong hình ảnh định dạng tùy chỉnh (lát bản đồ) và chuyển đổi chúng thành kết cấu Texture2D để hiển thị. Phiên bản trước của trình soạn thảo, là một triển khai C++, đã chuyển đổi các hình ảnh đầu tiên thành các ảnh bitmap và sau đó chuyển thành các họa tiết được vẽ bằng DirectX. Tôi đã thử cách tiếp cận tương tự ở đây, tuy nhiên cả hai phương pháp trên đều đáng kể quá chậm. Để tải vào bộ nhớ, tất cả các họa tiết cần thiết cho bản đồ sẽ là cách tiếp cận đầu tiên ~ 250 giây và cách tiếp cận thứ hai ~ 110 giây trên máy tính hợp lý (để so sánh, mã C++ mất khoảng 5 giây). Nếu có một phương pháp để chỉnh sửa dữ liệu của một kết cấu trực tiếp (chẳng hạn như với phương thức LockBits của lớp Bitmap) thì tôi sẽ có thể chuyển đổi các hình ảnh định dạng tùy chỉnh thẳng thành một Texture2D và hy vọng tiết kiệm thời gian xử lý.
Mọi trợ giúp sẽ được đánh giá rất nhiều.
Cảm ơn
Không nên là "từ người gọi" thay vì "callee"? Từ mục đích của người sử dụng mã này, đó là hàm này là callee. – drxzcl
Cảm ơn phản hồi của bạn, tuy nhiên tôi có nghĩa là trong câu hỏi ban đầu của tôi rằng tôi đã thử phương pháp này - sử dụng SetData(). Tôi chạy một số phân tích sâu hơn, và để tạo ra các Bitmap bằng cách sử dụng LockBits mất 2,7 giây. Khi tôi thêm vào mã đó, đối với mỗi Bitmap được tạo: Texture2D tx = new Texture2D (thiết bị, bmp.Width, bmp.Height, 0, TextureUsage.None, SurfaceFormat.Color); Nó tăng thời gian cần thiết lên 74 giây !! Chỉ cần tạo một kết cấu trống cho mỗi bitmap, và thậm chí không điền vào nó. Loại thời gian tải này không thể chấp nhận được đối với trò chơi 2D. Tôi không nghĩ rằng XNA sẽ chậm như vậy. :/ –
@Ranieri, cảm ơn - đã sửa! – bufferz