2010-10-08 24 views
7

Tôi đang tìm một số phê bình về cách tiếp cận để lưu trữ trạng thái của trình chỉnh sửa bitmap cho điện thoại di động Android và iPhone. Ngay cả một "Có vẻ ổn với tôi!" phản ứng sẽ tuyệt vời!Lưu/tải trạng thái tài liệu nhanh chóng và mạnh mẽ cho trình chỉnh sửa hình ảnh

Trong ứng dụng, tài liệu người dùng hiện tại chứa một số lớp bitmap (mỗi trang có thể là 1024 x 768 pixel) mà mỗi lớp có thể được vẽ. Các yêu cầu cơ bản cho ứng dụng là:

  1. Tôi cần có thể lưu và khôi phục trạng thái tài liệu.

  2. Khi người dùng thoát ứng dụng hoặc nhận cuộc gọi điện thoại, tôi cần có thể lưu nhanh trạng thái tài liệu (trong khoảng 2 giây).

  3. Nếu ứng dụng gặp sự cố, tôi cần khôi phục trạng thái tài liệu (OK nếu người dùng mất 30 giây mặc dù công việc).

Đối với 1, tôi không thể tìm thấy bất kỳ định dạng tệp mở nào hỗ trợ lớp. Tôi sẽ đi với cấu trúc tệp sau để lưu trữ tài liệu của tôi:

document_folder/ 
    layer1.png 
    layer2.png 
    ... 
    metadata.xml 

Các lớp này chỉ được lưu trữ dưới dạng tệp .png và tệp .xml chứa dữ liệu như lớp nào hiện có thể nhìn thấy. Thư mục tài liệu có thể được mở bởi ứng dụng hoặc thư mục có thể được lưu trữ trong một tệp .zip. Điều này có vẻ giống như một định dạng đơn giản tốt đẹp cho các ứng dụng khác để làm việc với quá.

Ngoài tệp .png, tôi cũng sẽ cho phép các lớp được lưu ở định dạng tệp .raw tùy chỉnh chứa dữ liệu pixel thô chưa được xử lý từ bitmap. Tôi có thể lưu chúng rất nhanh chóng trên điện thoại (< 0.5s) trong khi các tệp .png mất một hoặc hai giây.

Kế hoạch của tôi để lưu tài liệu nhanh chóng, khi khởi động, để tạo thư mục có tên/autosave và lưu các phiên bản .raw của tất cả các lớp ở đó. Sau một vài lệnh chỉnh sửa trên một lớp, tôi sẽ cập nhật tệp .raw cho lớp đó trong chuỗi nền. Để có độ mạnh khi lưu, tôi sẽ lưu lớp như ví dụ: layer1_tmp.raw và khi tôi đã xác nhận tệp đã được viết hoàn toàn, hãy thay thế layer1.raw bằng tệp này.

Nếu ứng dụng bị lỗi trong khi sử dụng, tôi sẽ chỉ mở lại thư mục/autosave. Khi ứng dụng bị đóng hoặc người dùng nhận cuộc gọi điện thoại, tôi chỉ cần cập nhật lớp được sửa đổi lần cuối để tự động lưu. Khi người dùng muốn lưu, tôi chỉ chuyển đổi tất cả các tệp .raw thành tệp .png và sau đó nén thư mục.

Bạn nghĩ sao? Có bất kỳ sai sót rõ ràng? đó có phải là cách dễ hơn? Tôi có phát minh lại bánh xe bằng cách nào đó không? Cảm ơn.

+3

@tifftuff: "Khi người dùng thoát ứng dụng hoặc nhận cuộc gọi điện thoại, tôi cần có thể lưu trạng thái tài liệu nhanh chóng (trong khoảng 2 giây)" - điều đó có thể không thực hiện được do tốc độ ghi vào flash. Flash là rất khó đoán về viết, vì nó phụ thuộc vào những thứ như mặc san lấp mặt bằng. Nếu không, tôi thấy không có gì đặc biệt sai với chiến lược của bạn, ít nhất là * vis a vis * Android. – CommonsWare

+0

@CommonsWare: Trong Android, tôi có thể sao chép 1.5Mb pixel pixel từ đối tượng Bitmap vào tệp qua RandomAccessFile.write và sau đó đóng tệp trong vòng 0,1 giây. Nếu tôi gọi .sync() trên bộ mô tả tập tin (để buộc văn bản được thực hiện ngay bây giờ), phải mất khoảng từ 1 đến 3 giây. Tôi sẽ không có đủ thời gian để chờ .sync() trong phương thức onPause() hoạt động nhưng tôi có thể đợi .đóng() để hoàn thành. Đây có phải là không đủ để có một cơ hội rất tốt mà các tập tin đã thực sự được viết? Bất kỳ đề xuất về những gì tôi có thể làm thay vì nếu đây không phải là trường hợp? Tôi chỉ cần lưu một lớp (~ 1.5Mb). – memcom

+3

@tifftuff: Tất cả những gì tôi nói là flash chậm. Tại hội nghị Google I/O năm 2010, Brad Fitzpatrick đã trích dẫn một số thử nghiệm mà anh ta đã chạy, khi viết một byte đơn lẻ sẽ mất 200ms, mặc dù thông thường nó chỉ là một phần nghìn giây. Hãy chắc chắn rằng các bài kiểm tra tính thời gian của bạn được thực hiện trên phần cứng, vì flash có nhiều đặc tính khác với ổ đĩa cứng mà bạn có thể có trên máy phát triển của mình. Bạn càng viết ít dữ liệu, dữ liệu càng nhanh. Ví dụ, có lẽ những gì bạn đang nghĩ đến như là một "lớp" chỉ nên là các điểm ảnh được rút ra, không phải bất kỳ nền, để cố gắng cắt giảm 1,5MB xuống. – CommonsWare

Trả lời

0

Tôi nghĩ bạn có một kế hoạch tuyệt vời ở đó. Tôi có lẽ sẽ đi theo cùng một cách (nhưng chính nó không có nghĩa là bất cứ điều gì :-)

Những gì tôi nghĩ là nếu bạn không chỉ có một luồng công nhân lưu tệp mà là một dịch vụ nền hoàn chỉnh (với một chuỗi công nhân tất nhiên, vì bản thân dịch vụ cũng chạy trong luồng chính). Bằng cách này, bạn sẽ đảm bảo rằng luôn có thứ gì đó còn sống có thể xử lý các lớp của bạn, bất kể hoạt động vẽ có bị rơi hay ai đó gọi cho bạn. Đột nhiên bạn không có các ràng buộc thời gian giống nhau (thao tác ghi có thể mất 10 giây nếu nó muốn, hoạt động của bạn không bị chặn, cũng không phụ thuộc vào thao tác ghi).Tất nhiên dịch vụ của bạn sau đó sẽ tự tử khi nó đã làm trống hàng đợi lưu của nó (để tiết kiệm tài nguyên hệ thống).

Điều tôi không biết để quảng cáo thêm ý tưởng này là lượng dữ liệu bạn đang ghi vào tệp thô? Bạn có viết toàn bộ lớp 1024x768 mỗi lần hay bạn chỉ viết lại các phần đã thay đổi? Tôi cũng không chắc chắn về cách dữ liệu thực sự sẽ được truyền tới dịch vụ (từ Hoạt động). Tôi không biết nếu có một kích thước tối đa của một byte-mảng-thêm một Intent có thể xử lý.

Hy vọng điều này sẽ cung cấp cho bạn thêm ý tưởng.

Chúc mừng!

1

Ý tưởng của bạn souds tốt với tôi: lưu các lớp trong nền, khi bạn đi. Bất kỳ lớp nào mà người dùng hiện không chỉnh sửa sẽ được xếp hàng đợi để được lưu ngay sau khi họ chuyển từ lớp đó sang lớp khác. Nếu ứng dụng bị gián đoạn, bạn chỉ cần lưu lớp làm việc hiện tại, như bạn nói có thể được thực hiện trong 0,5 giây.

Tại sao lại bận tâm với định dạng png? Bạn chỉ cần nó nếu xuất dữ liệu sang một máy tính/hệ thống khác, đúng không?

+0

Rất đúng. Png chỉ cần thiết nếu bạn muốn người dùng có thể xuất. Vì vậy, có thể chỉ tạo ra png nếu người dùng nhấp vào xuất hoặc tương tự. Nếu không, chỉ cần sử dụng định dạng thô nhanh chóng của bạn. Cách tiếp cận của bạn thật tuyệt vời. –

Các vấn đề liên quan