2011-02-10 28 views
6

Tôi đã nghiên cứu các phương pháp thay thế để lưu dữ liệu của trò chơi giữa các lượt chơi và tự hỏi liệu có ai có thể chỉ cho tôi đúng hướng không.Phương pháp tốt nhất để lưu dữ liệu - sở thích, sqlite, serializable hoặc khác?

Tôi có khoảng 32 nghìn dữ liệu phải được lưu trong khi bật. Tôi loại trừ các tùy chọn do số lượng dữ liệu tuyệt đối. Tôi đã dành một vài ngày chơi xung quanh với SQLite nhưng không thể có được các dữ liệu để tiết kiệm trong vòng chưa đầy hai giây (mặc dù thời gian chắc chắn đã không bị lãng phí).

Tôi đã quyết định rằng tôi sẽ sử dụng cơ sở dữ liệu để tải dữ liệu không đổi ở đầu trò chơi. Điều này chắc chắn sẽ làm cho nó dễ dàng hơn để tinh chỉnh các thông số khác nhau và các giá trị mặc định trong trò chơi. Nhưng điều này vẫn khiến tôi tìm phương pháp lý tưởng để ghi dữ liệu.

Dữ liệu cần được lưu về cơ bản là 9 lần xuất hiện lớp A và 9 lần xuất hiện của lớp B. Tôi là một tháng chuyên sâu trong đường cong học tập của Android (và sắc thái của Java, đến từ nền C++) và đã googling như điên. Điều này mang lại hai khả năng để nhớ -

1) serialization (ObjectOutputStream)

Tôi nghĩ đây sẽ là giải pháp hoàn hảo nhưng, sau khi đọc một vài bài viết khác liên quan đến chủ đề này, thu thập rằng nó không phải là rất khuyến khích trên Nền tảng Android do tốc độ và phân bổ bộ nhớ kích thích bộ thu gom rác thành một cơn thịnh nộ tiềm ẩn.

2) DataOutputStream lớp

suy nghĩ hiện tại của tôi là thêm Lưu chức năng Load và cho cả lớp và sử dụng DataOutputStream và DataInputStream gọi trong họ viết và đọc dữ liệu tương ứng.

Dữ liệu trong các lớp là nguyên thủy (chuỗi và ints chủ yếu) và mảng nguyên thủy, vì vậy không có gì quá phức tạp trong đó để phá vỡ. Liệu giải pháp thứ hai này có vẻ là một giải pháp tốt, khả thi không? Hay có những giải pháp khác mà tôi chưa biết?

+0

Cân nhắc chính cần tính đến là việc ghi vào flash có thể là hoạt động lâu dài, bất chấp kích thước của dữ liệu. Ngay cả việc viết 1 byte cũng có thể mất một lượng thời gian đáng chú ý. Vì vậy, hãy chắc chắn rằng giải pháp của bạn đệm lên tất cả các dữ liệu và viết nó trong vài hoạt động càng tốt. – Jems

+1

Cảm ơn lời khuyên. Tôi đã đi với các phương pháp DataOutputStream và thời gian thực hiện để ghi dữ liệu bây giờ là không đáng kể (khoảng 0,1 giây). Tôi rất vui vì tôi đã bị sidetracked với cơ sở dữ liệu SQLite mặc dù, họ chắc chắn sẽ rất hữu ích :) – Rok

Trả lời

2

Bạn nên sử dụng một nhiệm vụ Async để lưu các dữ liệu, tôi đã sử dụng phương pháp này để lấy Highscores tại bắt đầu một trò chơi:

new HighscoreTask().execute(this); 

nhiệm vụ Async trông như thế này:

public class HighscoreTask extends AsyncTask<MainView, Void, Void> { 

    protected void onPreExecute() { 
    } 

    protected void onPostExecute(final Void unused) { 
    } 
    @Override 
    protected Void doInBackground(MainView... params) { 
     HighScoreFactory.syncScores(); 
     return null; 
    } 
} 

Tất cả tương tác cơ sở dữ liệu xảy ra trong HighScoreFactory.syncScores() điều này có thể mất đến chừng nào cần bởi vì nó xảy ra ở chế độ nền. Trong trường hợp của tôi, nó sẽ gửi một yêu cầu HTTP đến một máy chủ bên ngoài và tải chúng vào một cơ sở dữ liệu. Nó không bao giờ gây ra bất kỳ vấn đề và hoạt động liên tục.

+0

Cảm ơn - Tôi chắc chắn sẽ giữ cho rằng trong tâm trí. Tôi đang lưu dữ liệu trò chơi dưới dạng tệp nhị phân thô hiện đang hoạt động nhanh hơn * rất nhiều *. Nhưng chắc chắn sẽ điều tra Async như một vài người đã gợi ý nó ngay bây giờ. – Rok

1

Bạn đã thử chèn dữ liệu vào cơ sở dữ liệu trong giao dịch chưa?

try{ 
db.beginTransaction(); 

//here insert data to database  

db.setTransactionSuccessful(); 
} finally { 
db.endTranscation(); 
} 

Điều đó có thể tăng tốc hoạt động.

+0

Tôi đã thử nghiệm với việc sử dụng các giao dịch đến mức mà tất cả các bài viết của tôi đã được thực hiện trong một giao dịch duy nhất - điều này mang lại thời gian giảm từ 8 giây xuống còn 2 giây. Tôi dường như đã đâm vào một bức tường gạch tại thời điểm đó, và cho hay lấy một phần mười giây, không thể thấp hơn. Đây là mã SQLite đầu tiên tôi đã thực hiện, nhưng cảm giác của tôi là tôi không thể lấy nó nhanh hơn (mặc dù tôi rất vui khi được thông báo khác) – Rok

0

Tạo chủ đề mới thực hiện ghi dữ liệu bằng Context.openFileOutput (Tên chuỗi, chế độ int) với điều này làm ngữ cảnh. Sau đó bạn có thể viết nó trong nền với chủ đề mới và lấy nó với: Context.openFileInput (String name) một lần nữa với điều này như là bối cảnh. Hy vọng rằng điều này sẽ giúp.

2

Tại sao bạn có giới hạn 2 giây đối với cơ sở dữ liệu của mình? Nếu nó hoàn toàn là vì lợi ích của UI, thì có một cách tiếp cận khác mà bạn có thể thực hiện.

Bạn không thực sự phải thực hiện lưu trong chính phương thức của mình, bạn chỉ có thể khởi chạy Thread mới thực sự tiết kiệm cho bạn.

private void backgroundSave(){ 
    Thread backgroundThread = new Thread() { 
     @Override 
     public void run() { 
      //do save here 
     } 
    }; 
    backgroundThread.start(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    backgroundSave(); 
} 

Hoặc bạn có thể sử dụng AsyncTask cho việc này.

Bạn có thể phải xem xét trường hợp khi người dùng cố gắng khởi động lại ứng dụng của bạn trước khi lưu xong, nhưng điều đó không quá khó để tính đến.

+1

Dữ liệu được lưu sẽ được sử dụng liên tục trong mọi hoạt động. Ý tưởng chỉ định lưu vào một chuỗi nền có vẻ tốt, nhưng tôi chưa có thời gian để tự làm quen với giải quyết các vấn đề đồng bộ hóa. Đó là điều tôi chắc chắn sẽ xem xét ngay sau khi tôi có cơ hội. Bây giờ, tôi đã tìm thấy rằng tôi có thể ghi dữ liệu trong một tệp nhị phân trong khoảng 0,1 giây. Tôi đánh giá cao những lời khuyên mặc dù. Vì vậy, nhiều để tìm hiểu, vì vậy ít thời gian ... :) – Rok

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