Tốt pratice khi thiết kế cấu trúc dữ liệuMemoryStore

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Tùy thuộc vào loại cấu trúc dữ đánh máy, MemoryStoreService thi hành giới hạn trên bộ nhớ và số lượng mục trong một cấu trúc dữ liệu. Tất cả các cấu trúc dữ liệu đều bị hạn chế bởi một giới hạn yêu cầu toàn cầu.

Mỗi trải nghiệm Roblox có Trình theo dõi quản lý bộ nhớ , bao gồm một loạt các biểu đồ mà bạn có thể sử dụng để theo dõi sử dụng bộ nhớ.

Bản đồ và hàng đợi xếp hạng

Cả các bản đồ và hàng đợi đều có giới hạn về số lượng tối đa các mục và tối đa bộ nhớ. Ngoài ra, các mục trong một trong các cấu trúc dữ liệu này luôn luôn ở trên một phân đoạn duy nhất. Mọi yêu cầu đối với một trong những cấu trúc dữ liệu này là một yêu cầ

Khi một bản đồ sắp xếp hoặc hàng đợi đạt đến giới hạn của mình hoặc bộ nhớ, cách tốt nhất để thực hiện là loại bỏ các mục không cần thiết bằng cách thêm một chính sách bỏ chí cho mục hoặc bằng cách thêm một chính sách bỏ chí cho mục. Hoặc, nếu chỉ là gi

Nếu bạn cần tất cả các mặt hàng của bạn hoặc đang gặp phải tình trạng bị rơi vào do lượng lớn yêu cầu đang được xử lý, giải pháp duy nhất là chia.

Phân cắt

Phân hủy là quá trình lưu trữ một bộ dữ liệu liên quan ở nhiều cấu trúc dữ liệu. Nói cách khác, nó có nghĩa là lấy một cấu trúc dữ liệu hiện tại, có hiệu suất cao, và thay thế nó bằng những cấu trúc dữ liệu nhỏ hơn, có chứa cùng một bộ dữ liệu như cấu trúc dữ liệu ban đầu.

Thách thức chính của việc chia là tìm cách phân tán dữ liệu vào nhiều cấu trúc dữ liệu một cách duy trì cùng một chức năng như nguyên bản.

Tách bản đồ sắp xếp

Để chia một bản đồ sắp xếp thành các thành phần alphabetic với các giới hạn nhân vật, hãy xem xét chia dữ liệu của bạn thành các thành phần alphabetic với các giới hạn nhân vật. Ví dụ, hãy cho rằng bạn chỉ có các chìa khóa với chữ cái đầu tiên từ A-Z và bạn tin rằng bốn map sorted n

  • Bản đầu tiên có thể tương ứng A-G, B-N, O-T và U-Z.
  • Để hiện hoặc lấy một đối vật phẩm, hãy sử dụng bản đồ thích hợp dựa trên nhân vật xuất phát của vật phẩmtượng.
Tách bản đồ sắp xếp

-- Khởi tạo dịch vụ bộ nhớ
local MemoryStoreService = game:GetService("MemoryStoreService")
-- Tạo một số thùng bản đồ xếp hạng của bạn
local sm_AtoG = MemoryStoreService:GetSortedMap("AtoG")
local sm_HtoM = MemoryStoreService:GetSortedMap("HtoM")
local sm_NtoT = MemoryStoreService:GetSortedMap("NtoT")
local sm_UtoZ = MemoryStoreService:GetSortedMap("UtoZ")
-- Chức năng giúp đỡ để lấy mũi tên từ Chìa khóa mục
local function getSortedMapBucket(itemKey)
if (itemKey >= "a" and itemKey < "h") then
return sm_AtoG
elseif (itemKey < "n") then
return sm_HtoM
elseif (itemKey < "u") then
return sm_NtoT
else
return sm_UtoZ
end
end
-- Khởi tạo tên người chơi với giá trị mặc định là 0
for _, player in game:GetService("Players"):GetPlayers() do
local bucket = getSortedMapBucket(player)
bucket:SetAsync(player, 0, 600)
end
-- Lấy giá trị của một người chơi
local player = "myPlayer"
local bucket = getSortedMapBucket(player)
local playerScore = bucket:GetAsync(player)
print(playerScore)

Chia một Hàng đợi

Đổi một hàng đợi thành các hàng đợi được lựa chọn. Mặc dù bạn muốn tăng tốc tăng trưởng thông qua nhiều hàng đợi, thêm, đọc và xóa chỉ xảy ra ở phía trước hoặc phía sau của hàng đợi.

Một giải pháp là sử dụng một hàng đợi xoay, có nghĩa là tạo một hàng đợi và quay vòng tròn giữa chúng khi bạn thêm hoặc đọc một vật phẩm:

  1. Tạo một số hàng đợi và thêm chúng vào một mat阵.

  2. Tạo hai điểm dữ liệu địa phương. Một trong số chúng đại diện cho hàng đợi bạn muốn đọc và xóa các mục. Cái khác đại diện cho hàng đợi bạn muốn thêm các mục vào:

    • Đối với các hoạt động đọc, tính số lượng các mục bạn cần từ mỗi hàng đợi, cũng như nơi di chuyển dấu hiệu đọc.
    • Đối với các hoạt động xóa, truyền ID từ đọc sang mỗi hàng đợi.
    • Đối với các hoạt động thêm, thêm vào hàng đợi tại điểm thêm và tăng điểm thêm.
Chia một Hàng đợi

-- Khởi tạo dịch vụ bộ nhớ
local MemoryStoreService = game:GetService("MemoryStoreService")
-- Tạo Hàng Đợi của bạn
local q1 = MemoryStoreService:GetQueue("q1")
local q2 = MemoryStoreService:GetQueue("q2")
local q3 = MemoryStoreService:GetQueue("q3")
local q4 = MemoryStoreService:GetQueue("q4")
-- Đặt Hàng Đợi Trong Một Ma Trận
local queueArr = { q1, q2, q3, q4 }
-- Tạo hai mảng đại diện cho chỉ mục đọc và thêm queues
local readIndex = 1
local addIndex = 1
-- Tạo một chức năng địa phương cập nhật các chỉ số phù hợp
local function rotateIndex(index, n)
return (index + n - 1) % 4 + 1
end
-- Tạo một chức năng địa phương đọc n các mục từ hàng đợi
local function readFromQueue(count, allOrNothing, waitTimeout)
local endIndex = count % 4
local countPerQueue = count // 4
local items = {}
local ids = {}
-- loop qua mỗi hàng đợi
for i = 1, 4, 1 do
-- xác định nếu hàng này sẽ đọc thêm một vật phẩm
local diff = i - readIndex
if diff < 0 then
diff += 4
end
local queue = queueArr[i]
-- đọc các mục từ mỗi hàng đợi
-- +1 vật phẩm nếu phù hợp với các tiêu chuẩn đọc thêm
if diff < endIndex then
items[i], ids[i] = queue:ReadAsync(countPerQueue + 1, allOrNothing,waitTimeout)
else
items[i], ids[i] = queue:ReadAsync(countPerQueue, allOrNothing,waitTimeout)
end
end
readIndex = rotateIndex(readIndex, count)
return items, ids
end
-- Tạo một chức năng địa phương xóa n các mục khỏi hàng đợi
local function removeFromQueue(ids)
for i = 1, 4, 1 do
local queue = queueArr[readIndex]
queue:RemoveAsync(ids[i])
end
end
-- Tạo một chức năng địa phương thêm vật phẩm vào hàng đợi
local function addToQueue(itemKey, expiration, priority)
local queue = queueArr[readIndex]
queue:AddAsync(itemKey, expiration, priority)
addIndex = rotateIndex(addIndex, 1)
end
-- Viết một số mã!
for _, player in game:GetService("Players"):GetPlayers() do
addToQueue(player, 600, 0)
end
local players, ids = readFromQueue(20, true, -1)
removeFromQueue(ids)

Bản đồHash

Map thu hồi không có giới hạn lượng bộ nhớ hoặc số lượng mục tùy chỉnh và bị chia nhỏ tự động, nhưng bạn vẫn có thể gặp phải tình trạng bị rơi vào chậm nếu bạn sử dụng chúng không đúng cách.

Ví dụ, hãy xem xét một trải nghiệm với bản đồ trùm của dữ liệu trò chơi, lưu như giá trị của một chìa khóa tên metadata . Nếu thông số này chứa thông tin như ID nơi, số lượng người chơi

Thay vì lưu tất cả các métadữ như một mục tập trung, thì phương pháp tốt hơn là lưu mỗi trường như một chìa khóa để map hiệu ứng tách hạch tự động. Nếu bạn cần phải tách biệt giữa métadữ và phần còn lại của map hiệu