Tôi có nên sử dụng tệp văn bản cho dữ liệu lưu của mình không?


22

Câu hỏi của tôi là liệu tôi có nên sử dụng tệp văn bản để lưu dữ liệu trò chơi của mình hay không. Tôi có một số lo ngại cơ bản về việc này:

  1. Thực sự không có cách nào để bảo vệ dữ liệu, và do đó, người dùng có thể làm hỏng mọi thứ nếu họ chạm vào nó và tôi không muốn điều đó xảy ra.

  2. Đây có lẽ không phải là cách hiệu quả nhất để lưu trữ dữ liệu của tôi (Sẽ có rất nhiều dữ liệu)

Tôi biết làm thế nào để phân tích / ghi vào các tệp văn bản một cách hiệu quả, vì vậy để tạo mẫu chúng thật tuyệt vời. Tôi chỉ muốn nhìn về tương lai về những gì tôi nên nghĩ về việc chuyển sang để nó không đấm vào mặt tôi khi gần kết thúc sự phát triển.

Nếu tôi không nên sử dụng tệp văn bản, tôi nên sử dụng cái gì? Tôi cần một cái gì đó tương thích C ++.


2
Tệp zip (có mật khẩu) - có nhiều thư viện có sẵn sẽ cho phép bạn thực hiện việc này và nó sẽ tiết kiệm dung lượng ổ đĩa
SeanC

2
Áp dụng một mật mã đơn giản như en.wikipedia.org/wiki/ROT13 sẽ đủ để giữ cho người dùng trung bình không chỉnh sửa các tệp. Mọi người khác có thể biết những gì họ đang làm gì.
Exilyth

1
Có cách riêng của bạn, nhưng tôi thích các trò chơi của tôi có thể dễ dàng sửa đổi.
mmyer

Câu trả lời:


28

Hiện tại, vì bạn chỉ mới bắt đầu, các tệp văn bản có thể ổn. Có một vài mối quan tâm trong câu hỏi của bạn mà tôi sẽ giải quyết.

  1. Bảo vệ dữ liệu không quan trọng như bạn nghĩ. Nếu trò chơi của bạn là nhiều người chơi, bạn sẽ có dữ liệu được lưu ở phía máy chủ. Nếu trò chơi của bạn là một người chơi, vậy nếu người chơi sửa đổi dữ liệu thì sao? Nếu họ phá vỡ thứ gì đó thì đó thực sự là lỗi của họ và họ có thể cài đặt lại.

  2. Hiệu suất cũng là một cái gì đó khác mà chúng ta thường không lập kế hoạch đúng. Bạn không nên thực sự tối ưu hóa cho đến khi bạn thực sự đo lường một vấn đề hiệu suất. Tôi đoán là có thể bạn sẽ có một số lượng dữ liệu đó không phải là rằng tập tin văn bản lớn và điều đó sẽ được tốt.

Điều đó đang được nói, đặt cược tốt nhất của bạn là trừu tượng hóa việc lưu và tải dữ liệu của bạn một cách tốt nhất có thể. Ví dụ, bạn có thể có một lớp cơ sở, giả sử DataWriter, và sau đó cung cấp các triển khai khác nhau của các phương thức khác nhau của nó. Một ví dụ rất cơ bản sẽ giống như:

class DataWriter {
  virtual void save(GameState state) = 0;

  virtual ~DataWriter() { }
};

class TextFileDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to text file
  }
};

class DatabaseDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to database
  }
};

Cuối cùng, khi bạn lập hồ sơ trò chơi của mình và nhận ra nút cổ chai hiệu năng đang trong thói quen viết tệp, bạn có thể cung cấp một triển khai khác của lớp đó (ví dụ để ghi vào cơ sở dữ liệu thay thế) với các thay đổi tối thiểu đối với mã gọi.


Đó là một trò chơi một người chơi và đó là những suy nghĩ của tôi chính xác nếu họ muốn làm hỏng dữ liệu. Tôi không biết, một cái gì đó về các tập tin văn bản có vẻ không chuyên nghiệp và tôi nghĩ rằng nếu tôi có thể giữ cho người dùng không bị rối, tôi có lẽ nên làm vậy. Ngoài ra, ý bạn là gì khi bạn nói "Cơ sở dữ liệu"? Tôi nghe thấy điều đó bị ném rất nhiều nhưng tôi không biết định nghĩa chính xác hay loại tập tin nào đòi hỏi.
Althezel

6
@Althezel Điều này là, bất kể bạn lưu dữ liệu của mình như thế nào, ai đó đủ quyết tâm để sửa đổi nó sẽ có thể. Theo nghĩa đó, thường sẽ lãng phí thời gian phát triển quý báu của bạn để thử và đặt các biện pháp bảo vệ tại chỗ :)
pwny

@Althezel Đối với cơ sở dữ liệu, hãy nghĩ về nó như một loại công cụ mà bạn chuyển yêu cầu để đọc hoặc ghi dữ liệu. Công cụ đó chịu trách nhiệm lưu / đọc nó một cách hiệu quả, thường ở dạng quan hệ trong các bảng. Trong trường hợp sử dụng của bạn, tôi sẽ xem SQLite ( sqlite.org ). Về cơ bản, bạn sẽ sử dụng thư viện C ++ để kết nối với cơ sở dữ liệu SQLite cục bộ (SQLite sử dụng các tệp cục bộ) và chuyển các cuộc gọi thư viện đó theo cú pháp SQL để truy cập dữ liệu của bạn.
pwny

2
Đó là một thế giới buồn khi các nhà phát triển muốn có thể khóa người dùng khỏi thông tin họ lưu trữ trên máy tính của họ.
ClassicThunder

2
Việc sử dụng các tệp văn bản thực sự chỉ cảm thấy không chuyên nghiệp vì rất ít trò chơi lưu trữ mọi thứ dưới dạng "save-data.txt" - nhưng nếu bạn đã từng dành thời gian xem xét hầu hết các tệp trò chơi đã lưu, bạn sẽ thấy chúng thường không có gì nhiều hơn các tệp văn bản mà đôi khi có dữ liệu nhị phân được thêm vào chúng. Chẳng hạn, mọi trò chơi thuộc dòng Civilization và Total War đều sử dụng các tệp .txt thực tế cho nhiều loại dữ liệu trò chơi. 'Nâng cấp' phổ biến nhất cho điều này là một hệ thống cơ sở dữ liệu kết thúc việc lưu trữ dữ liệu dưới dạng tệp phẳng - ngoại trừ một số đốm nhị phân - chỉ là một tệp văn bản.
Brian

3

Từ dữ liệu trò chơi có thể có nghĩa là nhiều thứ, ví dụ

  • Gamestate
  • Tập tin cấu hình
  • Bản đồ, kết cấu, âm thanh, kịch bản, dữ liệu hoạt hình, ...
  • Bản địa hóa
  • Dữ liệu bố trí GUI
  • nhiều hơn tôi đã không nghĩ về

Đối với mỗi loại bạn có thể thực hiện một cách tiếp cận khác.

Ví dụ: bạn có thể sử dụng SQLite cho nội dung Bản địa hóa, nhị phân cho Bản đồ, kết cấu, âm thanh, v.v.

Đối với công cụ cấu hình, bạn nên sử dụng dễ dàng để thay đổi tập tin xml.

Như mọi khi, câu trả lời đúng là "nó phụ thuộc".

Tồn tại nhiều trình phân tích xml có ràng buộc c ++ và liên kết c ++ cho SQLite cũng tồn tại.


Nó có thể là một điều tôn giáo nhưng tôi muốn sử dụng định dạng tệp INI cho các cấu hình thay vì XML. Cái sau cảm thấy như một sự quá mức cho kịch bản này. Và có một trình đọc INI trong các thư viện boost.
Artur Czajka

0

Bạn có thể lưu dữ liệu của mình dưới dạng blob nhị phân và truyền dữ liệu trở lại khi bạn truy cập vào tệp đó. Điều này sẽ giải quyết cả hai vấn đề của bạn. Chỉ cần đảm bảo rằng mã tuần tự hóa giống hệt như mã tuần tự hóa.

Truyền phát trong blob nhị phân tương đối nhanh và cũng ngăn người dùng xem dữ liệu và thay đổi nó.

Bạn có thể đạt được tất cả điều này bằng cách sử dụng các luồng thư viện tiêu chuẩn.


2
Mặc dù blob nhị phân rất nhanh và dễ dàng (cả phát triển và tải / chạy), vấn đề lớn nhất tôi gặp phải với blob nhị phân là ngay khi bạn thay đổi bất cứ điều gì về tổ chức cấu trúc dữ liệu (nhiều như thêm một floatthành viên vào một đối tượng), các lưu trữ cũ trở nên hoàn toàn không hợp lệ. Điều này rất khó đối phó trong quá trình phát triển, nhưng nếu bạn phụ thuộc vào nó, thì bằng mọi cách.
bobobobo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.