Tôi có nên sử dụng cơ sở dữ liệu SQL để lưu trữ dữ liệu trong trò chơi trên máy tính để bàn không? [đóng cửa]


9

Phát triển công cụ trò chơi

Tôi đang lên kế hoạch cho một trò chơi máy tính và động cơ của nó. Sẽ có một thế giới 3 chiều với góc nhìn người thứ nhất và bây giờ nó sẽ là một người chơi. Ngôn ngữ lập trình là C ++ và nó sử dụng OpenGL.

Quyết định thiết kế tập trung dữ liệu

Quyết định thiết kế của tôi là sử dụng kiến ​​trúc tập trung dữ liệu trong đó có người quản lý sự kiện toàn cầu và người quản lý dữ liệu toàn cầu . Có nhiều thành phần như vật lý, đầu vào, âm thanh, trình kết xuất, ai, ... Mỗi thành phần có thể kích hoạt và lắng nghe các sự kiện . Hơn nữa, mỗi thành phần có thể đọc, chỉnh sửa, tạo và xóa dữ liệu .

Câu hỏi là về người quản lý dữ liệu.

Có nên sử dụng cơ sở dữ liệu quan hệ

Tôi có nên sử dụng Cơ sở dữ liệu SQL, ví dụ SQLite hoặc MySQL, để lưu trữ dữ liệu trò chơi không? Nó chứa hầu như tất cả các nội dung trò chơi như vật phẩm, nhân vật, hàng tồn kho, ... Ngoại trừ các mắt lưới và kết cấu thậm chí còn liên quan đến hiệu suất nhiều hơn, vì vậy tôi sẽ giữ chúng trong bộ nhớ.

Là một cơ sở dữ liệu SQL đủ nhanh để sử dụng nó cho việc đọc và viết thông tin trò chơi trong thời gian thực, giống như vị trí của một nhân vật chuyển động? Tôi cũng cần quan tâm về khả năng tương thích đa nền tảng. Ngoài việc giữ mọi thứ trong bộ nhớ, tôi có những lựa chọn thay thế nào?

Lợi thế sẽ là

Ưu điểm của việc sử dụng cơ sở dữ liệu quan hệ như MySQL sẽ là cấu trúc định hướng dữ liệu cho phép tính toán nhanh. Tôi sẽ không cần các đối tượng để đại diện cho các thực thể. Tôi có thể dễ dàng truy vấn dữ liệu của các đối tượng gần trình phát cần thiết để kết xuất. Và tôi không phải quan tâm đến dữ liệu của các đối tượng ở xa. Hơn nữa, sẽ không cần lưu tên vì trạng thái trò chơi lỗ được lưu trong cơ sở dữ liệu. Cuối cùng nhưng không kém phần quan trọng, việc mở rộng trò chơi thành trò chơi trực tuyến sẽ tương đối dễ dàng vì đã có một nơi lưu trữ trạng thái trò chơi lỗ.


Bạn có thể muốn xem xét cơ sở dữ liệu đối tượng trên cơ sở dữ liệu quan hệ, giải quyết một số vấn đề được đề cập trong câu trả lời được chấp nhận về lược đồ giòn và như vậy.
tro999

Nếu bạn có các quy trình phù hợp hơn với cơ sở dữ liệu quan hệ, bạn có thể sử dụng SQL nhúng với quyền truy cập bộ nhớ lai. Điều này sẽ bỏ qua nhiều vấn đề khiến cơ sở dữ liệu SQL truyền thống không phù hợp với nhu cầu về hiệu năng của trò chơi.
rovyko

Câu trả lời:


11

Một cơ sở dữ liệu SQL không đủ nhanh để sử dụng để đọc và viết thông tin trò chơi trong thời gian thực. Dữ liệu này hầu như luôn được giữ trong bộ nhớ, trong các cấu trúc dữ liệu truyền thống.

Có thể có một số lợi ích khi sử dụng cơ sở dữ liệu nhúng như SQLite cho một số loại dữ liệu nhất định, ví dụ: dữ liệu tĩnh không thay đổi trong quá trình chơi trò chơi nhưng không thay đổi trong quá trình phát triển. Điều này sau đó có thể được triển khai như một phần của trò chơi cuối cùng, nơi SQLite chỉ thực sự được sử dụng khi tải lên trò chơi lần đầu tiên hoặc khi bắt đầu một cấp độ mới, v.v.

Tuy nhiên cũng có nhiều nhược điểm - khó có thể vá từng phần dữ liệu khi chúng được lưu trữ trong một tệp cơ sở dữ liệu, không lý tưởng cho nhiều loại dữ liệu phức tạp mà trò chơi cần (và bạn nói rằng bạn sẽ lưu trữ bên ngoài - nhưng sẽ có các tham chiếu đến và từ những thứ bên trong), nó không linh hoạt khi bạn cần thay đổi lược đồ, nó không nhất thiết phải tương thích ngược sau khi bạn thay đổi lược đồ, v.v.

Vì những lý do này, hầu hết các nhà phát triển trò chơi sẽ chỉ sử dụng định dạng của riêng họ. Các nhà phát triển chuyên nghiệp có ý thức về hiệu suất đôi khi tiến thêm một bước và lưu cấu trúc dữ liệu trong bộ nhớ trực tiếp vào đĩa để có thể tải nó với tối thiểu xử lý.

Và nếu bạn thực sự cần dữ liệu dạng bảng dựa trên văn bản dễ dàng chỉnh sửa, bạn có thể sử dụng định dạng dựa trên văn bản đơn giản, chẳng hạn như CSV, XML, JSON, YAML, v.v.


2
Tôi đã kết thúc bằng cách sử dụng SQLite để lưu trạng thái trò chơi. Vì tôi đang sử dụng một hệ thống thực thể, điều đó hoàn toàn có ý nghĩa: Mọi thứ tôi có đều là tài sản. Mỗi loại thuộc tính có bảng trong cơ sở dữ liệu và các thực thể được liên kết bởi id (duy nhất toàn cầu) của chúng. Nhưng, giả sử, cơ sở dữ liệu hệ thống thừa kế sẽ không có nhiều ý nghĩa, tôi đoán vậy.
danijar

1
Vâng, tôi nghĩ rằng sử dụng SQLite để lưu trạng thái trò chơi là một ý tưởng hay, cung cấp cho bạn kế hoạch để làm điều đó ngay từ đầu. Tuy nhiên, tôi không muốn DB là nơi lưu trữ dữ liệu trò chơi trong khi chơi.
Kylotan

5

Cơ sở dữ liệu không nhanh, sử dụng cơ sở dữ liệu chậm hơn rất nhiều so với truy cập bộ nhớ truyền thống. Lý do rất đơn giản, một cơ sở dữ liệu động, có một loạt các chi phí kèm theo, các truy vấn cần được phân tích cú pháp, băm cần phải được tính toán và các công cụ khác.

Chỉ có một lợi thế từ việc sử dụng cơ sở dữ liệu và đó là sự kiên trì. Bạn có thể chạy một hoặc nhiều ứng dụng với một cơ sở dữ liệu trong một thời gian dài mà không phải sợ dữ liệu. Nhưng khách hàng trò chơi hoàn toàn không cần điều đó.

Vì vậy, bạn muốn có được mọi đối tượng cách xa dưới 1000px?
Đó sẽ là:

List<Entity> retVal;
for(entity in entities)
  if(Distance(entity.pos(), to) < 1000)
     retVal.append(entity);
return retVal;

Bây giờ bạn sẽ nghĩ cơ sở dữ liệu sẽ làm gì nếu bạn yêu cầu nó lấy mọi đối tượng cách xa dưới 1000px?
Nó sẽ làm chính xác như vậy! Chỉ với một loạt chi phí sẽ làm cho thao tác cực kỳ đơn giản này tốn khoảng 100 lần thời gian xử lý (tùy thuộc vào số lượng thực thể bạn có). Cơ sở dữ liệu không phải là phép thuật.

Không sử dụng cơ sở dữ liệu cho bất cứ điều gì khác ngoài các ứng dụng máy chủ.


2
Máy chủ SQL có các chỉ mục không gian. Nó sẽ không lặp qua tất cả các bản ghi mà sử dụng cách tiếp cận chỉ mục thông minh
MichaelD
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.