nói dối e blog

Thiết Kế Một IDL Cho Bgfx

Vào tháng trước, tôi đã dành hơn một tuần đóng góp cho dự án bgfx. Sự việc bắt đầu khi tác giả của bgfx tạo một issue trên dự án sproto của tôi (sau này được chuyển sang dự án bgfxidl). Anh ấy muốn thiết kế một Ngôn ngữ Mô tả Giao diện (Interface Description Language - IDL) cho các API của bgfx nhằm tự động hóa việc duy trì các tệp giao diện đa ngôn ngữ, đồng thời mở ra khả năng sinh mã tự động hiệu quả.

Triển Khai Bảng Băm Đa Luồng

Trong Lua, các chuỗi ngắn được áp dụng kỹ thuật interning chuỗi, nghĩa là trong cùng một máy ảo, các chuỗi có giá trị giống nhau chỉ tồn tại duy nhất một bản. Điều này giúp tăng tốc độ tra cứu bảng băm sử dụng chuỗi làm khóa lên đáng kể. Vì độ phức tạp của phép so sánh chuỗi giảm từ O(n) xuống còn O(1), việc kiểm tra sự trùng khớp giữa khóa truy vấn và khóa trong bảng băm chỉ cần so sánh địa chỉ con trỏ của đối tượng chuỗi.

Cải Tiến Chia Sẻ Nguyên Mẫu Hàm Giữa Các Máy Ảo Lua

Trong hệ thống kiến trúc máy chủ của chúng tôi là skynet, thường cùng lúc khởi động hàng trăm máy ảo Lua trong cùng một tiến trình, đa phần chạy mã lệnh gần như trùng lặp (phục vụ cho người dùng khác nhau).
Do bản chất Lua xem mã nguồn cũng như dữ liệu, khác với Erlang vốn được thiết kế từ đầu để xử lý đa tiến trình, nền tảng Lua không tối ưu về quản lý bộ nhớ khi vận hành đa máy ảo song song. Vì vậy 5 năm trước, tôi đã xây dựng một bản vá (patch) cho Lua, cho phép trích xuất và chia sẻ dữ liệu nguyên mẫu hàm giữa các máy ảo, giúp tiết kiệm đáng kể bộ nhớ.

Cải Tiến Mô-Đun Toán Học

Tôi đã thiết kế một mô-đun toán học phi truyền thống cho engine 3D đang được phát triển. Khác biệt hoàn toàn với các thư viện toán học cho Lua thông thường sử dụng userdata hoặc bảng để biểu diễn vector/matrix, giải pháp của tôi sử dụng ID số nguyên 64bit để đại diện cho các đối tượng toán học. Quản lý vòng đời các đối tượng này được thực hiện thông qua một “ngăn xếp toán học” mô phỏng, hoàn toàn tách biệt với ngăn xếp hệ thống dùng để lưu trữ biến tạm thời của chương trình. Mọi đối tượng vector/matrix tồn tại trên ngăn xếp toán học sẽ được duy trì trong suốt một chu kỳ cố định (thường là 1 frame render), và được làm mới chủ động mỗi frame thông qua lệnh reset. Thiết kế này giúp giảm tải nhận thức khi sử dụng các đối tượng toán học trong Lua - không cần lo lắng về gánh nặng GC do kết quả trung gian tạo ra, đồng thời chi phí tạo lập các đối tượng mới cực kỳ thấp.

Một Số Suy Nghĩ Gần Đây Về Khung ECS

Động cơ trò chơi của chúng tôi sử dụng khung ECS. Trong năm phát triển vừa qua, chúng tôi đã tích lũy được nhiều kinh nghiệm quý báu trong việc ứng dụng ECS. Tôi cũng đã chia sẻ một số bài viết liên quan đến ECS trên blog cá nhân:

  • Khung ECS trong Lua
  • Thực thể (Entity) trong ECS

Trong hai tháng gần đây, dựa trên kinh nghiệm tích lũy được, chúng tôi đã tiến hành cải tiến lớn đối với thiết kế ban đầu của khung. Những thay đổi này xuất phát từ việc hiểu sâu sắc hơn về bản chất vấn đề khung cần giải quyết, cũng như tổng kết các mẫu thiết kế (design patterns) từ thực tiễn ứng dụng trong các tình huống điển hình.

Theo Dõi Sự Thay Đổi Của Component Trong ECS

Trong kiến trúc ECS (Entity-Component-System), mỗi hệ thống (System) thường xuyên quét qua một nhóm Component cụ thể để xử lý logic. Cách tiếp cận này phù hợp với đa số tình huống trong game, nơi mà trạng thái các đối tượng thay đổi liên tục. Tuy nhiên, việc kiểm tra từng đối tượng riêng lẻ để xác định có cần xử lý hay không lại tạo ra gánh nặng hiệu năng không đáng có.

0%