Xác định tài sản trong một công cụ trò chơi?


12

Tôi muốn xác định tài sản đã tải của mình, nhưng tôi không biết nên chọn tài sản nào. Có 2 lựa chọn:

  • Tên (chuỗi)

    • Đây là cách dễ nhất và cũng nhanh với unordered_map (O (1)), nhưng cách chậm hơn sau đó sử dụng số nguyên.
    • Dễ hiểu trong mã.
  • Số nguyên

    • Nhanh nhất.
    • Không thể hiểu được trong mã.

Tôi biết rằng các chuỗi không quá an toàn hoặc nhanh chóng, nhưng nó có tệ không, hay nó chỉ được tính là xấu trong một tiêu đề AAA? Tôi có thể tạo enum, để sử dụng số nguyên, nhưng nếu tôi tải cảnh, tài sản, v.v. từ một tệp khi chạy, tôi không thể sử dụng enums. Có cách nào để làm cho các số nguyên này có thể đọc được nếu chúng được tạo khi chạy không?

Tôi biết rằng vấn đề này có một vài chủ đề trên internet, nhưng tôi không thể tìm ra tầm quan trọng trong trường hợp này.


10
Tại sao không thực hiện cả hai? Phiên bản chuỗi kết nối với Từ điển <chuỗi, int> mà lần lượt gọi là Từ điển <int, Asset>. Bạn có thể phá vỡ lớp dựa trên chuỗi trong mã, nhưng sử dụng lớp dựa trên chuỗi để tương tác với người dùng.
Krythic

2
Tôi muốn thứ hai @ Krythic. Nếu mã của bạn thích số nguyên cho tốc độ, hãy để mã của bạn sử dụng số nguyên. Nếu người dùng của bạn thích chuỗi cho mức độ dễ đọc, hãy cho phép người dùng của bạn sử dụng chuỗi. Cả hai có thể cùng tồn tại khá vui vẻ (và bạn chỉ có thể biên dịch có chọn lọc phiên bản chuỗi thành các bản dựng phát triển, nếu bạn muốn bỏ qua toàn bộ chi phí phát hành)
DMGregory

Cùng một vấn đề trong một bối cảnh hơi khác nhau: Các phương pháp thực hiện mục khác nhau - sự khác biệt là gì?
Philipp

Câu trả lời:


19

Bạn có thể hỗ trợ cả hai.

Trong khi đó là thường hiệu quả hơn trong thời gian chạy để tài sản tham khảo một số nguyên hoặc một số tương tự như chìa khóa nhanh-to-so sánh, nó thường hiệu quả hơn trong thời gian thiết kế để tham khảo tên của họ, bởi vì con người là tốt hơn rất nhiều lúc làm việc với những cái tên như enemy_bullet_casing_soundhơn 72910613.

Sử dụng khóa số nguyên để tra cứu tài nguyên trực tiếp và sử dụng số nguyên này trong mã bất cứ khi nào có thể (nơi bạn có thể đặt giá trị thực của số nguyên vào một biến và do đó làm việc với nó dễ dàng hơn). Cung cấp ánh xạ từ tên đến khóa số nguyên đó (chứ không phải trực tiếp đến tài nguyên) và sử dụng ánh xạ đó bất cứ khi nào bạn gặp các tham chiếu có tên đến tài sản để giải quyết khóa số nguyên thực tế và tìm nội dung.

Sử dụng tra cứu dựa trên tên sẽ giúp các tệp dữ liệu của bạn dễ dàng làm việc hơn và ánh xạ tên tới khóa nhanh hơn sẽ bảo toàn tất cả các lợi ích quan trọng của khóa kiểu số nguyên nhanh hơn bất cứ nơi nào cần thiết.


Trường hợp của tôi: Tôi muốn thay đổi tài liệu của Đối tượng, vì vậy tôi gửi yêu cầu với tên của tài liệu mới. (chuỗi) Sau đó, trong hệ thống đồ họa, có một tìm kiếm trong <chuỗi, con trỏ> bản đồ chưa được sắp xếp và con trỏ của vật liệu của đối tượng sẽ được thay thế bằng con trỏ mới. Vì vậy, trong trường hợp của tôi, tôi không phải chuyển đổi nó thành một số nguyên? (vì tôi chuyển đổi nó thành con trỏ và trong các thuật toán thường xuyên tôi sử dụng con trỏ, tôi chỉ sử dụng chuỗi cho những thứ không thường xuyên.)
Tudvari

Hoặc tôi nên sử dụng ID số nguyên thay vì con trỏ ở mọi nơi có thể? . . Nhưng khi tôi chỉ lưu trữ các số nguyên tại thành phần kết xuất, tôi không phải đưa vào Material.h, nhưng tôi phải thực hiện tìm kiếm dựa trên số nguyên trong mảng con trỏ. Tôi nghĩ rằng cái sau tốt hơn. Là nó? Tôi có nên cấu trúc lại cái này không?
Tudvari

1

Trong dự án của tôi, tôi sử dụng các chuỗi băm, được chuyển đổi, tại thời điểm biên dịch theo số duy nhất (tôi muốn!). Vì vậy, khi tôi cần một tài nguyên, ví dụ như một kết cấu tôi chỉ cần gọi

MngTexture->get(hash("my_texture"))

Và vì tôi đang tạo một khung hệ thống thực thể đơn giản và tôi cần tải dữ liệu thành phần từ các tệp, tôi đã tạo một ngôn ngữ đơn giản như json để lưu trữ dữ liệu, nhưng có thể biên dịch được (chuyển đổi từ và ký tự từ chữ số sang số và từ chuỗi thành giá trị băm) . Vì vậy, ví dụ, nếu tôi muốn liên kết kết cấu với hàm băm ID ("mySphereure") với "ball.PNG" trong tệp dữ liệu của mình, tôi sẽ có

|my_texture| = "ball.PNG"

Ở đâu | | là một toán tử báo cho trình biên dịch băm từ bên trong.

Vì vậy, về cơ bản tôi sử dụng các chuỗi được ánh xạ tới ints trong thời gian biên dịch (vì vậy chúng không có bất kỳ chi phí nào), cả trong mã thực tế và trong các tệp là các luồng để tải các thành phần. Để tính toán hàm băm một thời gian biên dịch đơn giản là google nó, nó là một hàm đơn giản gồm 5-10 dòng mã.

Tất nhiên bạn có thể tải chuỗi từ các tệp của mình và băm nó trong thời gian chạy, trong trường hợp này bạn không phải tự viết từ điển vì thuật toán sẽ làm điều đó cho bạn (tạo số nguyên từ chuỗi) và tôi nghĩ rằng có ít nhất là nhanh như tìm kiếm trong bản đồ, vì tính cục bộ của bộ nhớ (bạn chỉ đang lặp qua một chuỗi dài vài byte).

Hy vọng điều này có thể giúp đỡ.


0

Xác định đối tượng bằng chuỗi không tối ưu, ints hiệu quả hơn nhiều. Để thuận tiện, bạn có thể duy trì một bảng chuỗi (hoặc từ điển) của chuỗi thành int để giúp tại thời điểm thiết kế và trong quá trình gỡ lỗi.

Tuy nhiên, tôi sẽ ủng hộ rằng trong mã trò chơi cốt lõi của bạn, bạn chỉ tham chiếu đến các đối tượng bằng ID số nguyên của chúng (hoặc một enum để dễ đọc). Làm điều này làm cho việc tách bảng chuỗi thành một tài sản riêng biệt đơn giản hơn. Nếu mã trò chơi cốt lõi của bạn không dựa vào bảng chuỗi này thì bạn có thể loại bỏ nó khỏi trò chơi đã phát hành có khả năng tiết kiệm một lượng bộ nhớ đáng kể - một cân nhắc quan trọng nếu bạn đang làm việc trên một trò chơi di động và muốn giữ kích thước tải xuống nhỏ như khả thi.

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.