Chắc hẳn mọi người đã quen với reference thông thường, hay còn gọi là hard-reference. Hard-reference khá là phổ biến ở UE bởi tính tiện dụng cũng như là khả năng load reference từ bộ nhớ đệm lên một cách nhanh chóng.
Tuy nhiên, nhược điểm to lớn nhất là của hard reference chính là việc mọi thứ đều sẽ được đưa vào hết bộ nhớ tạm thời (RAM), để có thể tiện access nhanh hơn. Dẫn đến việc đó là nếu một object A, chỏ tới Object B, Object B dùng Object C, thì tất cả đều sẽ được tải lên hết và lưu vào RAM.
Cách nhanh nhất để coi xem một actor đang được chỏ tới ở đâu, đó là chuột phải object đó phải chọn Reference Viewer hoặc tổ hợp phím Alt+Shift+R
Và thông thường sẽ thấy như sau, actor chính sẽ nằm ở giữa:
Để cho dễ hiểu, khi BP_MyCharacter được sử dụng, thì tất cả những thằng xung quanh cũng sẽ được tải lên cùng.
Để giải quyết việc này, ta sẽ sử dụng Soft Pointer Reference và Soft Pointer Class Reference.
Nếu project của bạn nhẹ và không phải lo lắng về memory thì có lẽ việc sử dụng Soft Pointer Reference không cần thiết.
Nhưng ví dụ bạn sử dụng nhiều hard reference, mỗi reference đều nặng thì bạn nên xem xét chuyển sang Soft Pointer Reference.
Một ví dụ cho thấy việc dùng hard reference vừa lợi vừa hại:
Giả sử như class nhân vật bạn trong quá trình sử dụng có thể spawn ra class vũ khí, thuốc thang, thức ăn,..
Cấu trúc của class nhân vật có thể như sau
Như vậy, nếu như Medicine có một loạt các hình ảnh hiển thị (HUD), mesh viên thuốc, hiệu ứng, âm thanh,.. thì tất cả mọi thứ đều sẽ được lưu vào RAM bất cứ khi nào nhân vật được dùng.
Tuy nhiên đổi lại, khi ta cần sử dụng medicine, việc truy xuất lên để sử dụng sẽ cực kì nhanh (nhờ lưu ở RAM).
Bây giờ hãy thử chuyển tất cả qua Soft Pointer Class Reference
Trước khi ta gọi Spawn Actor From Class, hãy load class đó từ dưới ổ lưu trữ lên trước bằng Async Load Class Asset
Sau khi load xong, bởi vì Spawn Actor yêu cầu một Actor Class, ta chỉ việc cast vào Actor Class và nối vào đầu Class là xong. Làm tương tự với Weapon và Medicine.
Lưu ý: Async Load Class Asset là hàm latent, chạy song song với thread chính. Nếu bạn cho thực thi hành động ở đầu nối trên cùng, thì nếu việc load chưa xong nhưng bạn lại sử dụng kết quả trả lại Class thì sẽ thất bại. Đầu nối Completed sẽ luôn được gọi sau khi quá trình load đã xong.
Và khi đó khi kiểm tra lại Reference Viewer, Food/Medicine/Weapon đã không còn được hard reference nữa
Như vậy ta đã bớt đi một phần lưu trữ bộ nhớ của Food/Medicine/Weapon, và chỉ tải lên cái nào cần thiết sử dụng.
Lưu ý: Sau khi load lên để sử dụng, sau một thời gian nếu không còn gì sử dụng nó, UE sẽ tự garbage collect đi.
Tương tự như với Soft Pointer Reference
Ở ví dụ trên là mình chỉ việc chọn Static Mesh mình muốn load ở mục Asset, và sau đó cast vào StaticMesh để sử dụng bình thường.
Comments