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

Ảnh 1. Reference viewer trong option menu của một actor

Và thông thường sẽ thấy như sau, actor chính sẽ nằm ở giữa:

Ảnh 2. Reference của BP_MyCharacter

Để 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 ReferenceSoft 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 3. Spawn class vũ khí, thực phẩm và thuốc

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).

Ảnh 4. 3 actor mới hiển thị trong reference viewer

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

Ảnh 5. Load Soft Class Reference

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 6. Hard reference của Food/Medicine/Weapon đã không còn

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

Ảnh 7. Ví dụ Async load một static mesh từ disk

Ở 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.