nói dối e blog

Quản Lý Vòng Đời Đối Tượng C Khi Đóng Gói Vào Lua

Việc bao bọc các đối tượng C để sử dụng trong Lua là công việc phổ biến khi phát triển ứng dụng kết hợp hai ngôn ngữ này. Vấn đề then chốt nằm ở việc đồng bộ hóa cơ chế thu gom rác (GC) giữa hai môi trường, đảm bảo các đối tượng không bị giải phóng sớm hoặc rò rỉ bộ nhớ.

Ba phương án tiếp cận chính

Giải pháp 1: Thiết kế thư viện C tối ưu cho Lua
Sử dụng lua_newuserdata để cấp phát bộ nhớ cho mọi đối tượng. Tận dụng bảng môi trường (environment table) của userdata để thiết lập mối quan hệ giữa các đối tượng, giúp Lua GC nhận diện đầy đủ các tham chiếu. Ưu điểm: Tích hợp tự nhiên với cơ chế quản lý bộ nhớ của Lua. Nhược điểm: Yêu cầu thiết kế lại toàn bộ thư viện C theo logic của Lua.

Trong Hai Tuần Vừa Qua, Đã Làm Rất Nhiều Việc.

Hai tuần vừa qua trôi qua như một cơn lốc xoáy công việc. Khi ngồi viết bản báo cáo tuần hôm nay, tôi lại rơi vào tình trạng quen thuộc: ghi chép lại những việc đã làm như một cuốn sổ nhật ký. Càng viết, tôi càng bất ngờ nhận ra mình đã hoàn thành khối lượng công việc khổng lồ đến vậy. Có những việc tưởng chừng như diễn ra từ rất lâu rồi, nhưng khi tra lại lịch trình thì hóa ra mới chỉ là thứ Ba hay thứ Năm tuần trước.

Vấn Đề Gỡ Bỏ Libstdc++

Ngày hôm nay, đồng nghiệp của tôi đã dành cả buổi chiều để truy tìm nguyên nhân chính xác của sự cố tôi gặp phải vào cuối tuần trước.

Nguyên nhân bắt nguồn từ việc thư viện GLU được viết bằng C++, dẫn đến việc libstdc++.so (thư viện chuẩn C++) bị gỡ bỏ theo. Đặc biệt, phiên bản libstdc++.so này chứa một lỗi ẩn, khiến ứng dụng gặp sự cố nghiêm trọng. Điều đáng chú ý là lỗi này chỉ bộc lộ khi chương trình hoàn toàn được viết bằng C và không sử dụng bất kỳ thành phần nào của libstdc++.

Vấn Đề Nhỏ Với Glx Trên Freebsd

Gần đây mình khá bận rộn, thường xuyên làm việc liên tục hơn 10 tiếng mỗi ngày. Vì vậy tâm trạng cũng bất ổn, nhiều khi một vấn đề lẽ ra chỉ mất 30 phút xử lý lại kéo dài hàng giờ đồng hồ. Ví dụ như sự cố mình gặp phải hôm qua.

Do phần code底层 (low-level code) được mình độc lực refactor toàn diện (với nguyên tắc không thay đổi kiến trúc tầng trung gian), tổng cộng sửa đổi hơn 10,000 dòng mã trải trên 100 file C, trong đó viết lại hoàn toàn hàng ngàn dòng. Sự thay đổi quy mô lớn như vậy dễ dẫn đến những lỗi hy hữu rất đau đầu. Code mới chạy hoàn hảo trên Windows và Ubuntu, nhưng kỳ lạ thay lại gây ra lỗi core dump khi thoát chương trình trên Freebsd.

Về Kỹ Thuật Ánh Xạ Bề Mặt

Trước hết, tôi không phải là người hoạt động chuyên sâu trong cộng đồng 3D, vì vậy tôi không nắm rõ các phương pháp kết xuất bề mặt đa dạng trong giới này. Bài viết hôm nay xuất phát từ việc tôi vừa giúp đồng nghiệp phụ trách phát triển module 3D giải quyết một vấn đề thuật toán cách đây không lâu.

Từ những hiểu biết hạn chế về engine 3D, ban đầu tôi biết đến phương pháp kết xuất mặt đất kiểu ghép mảnh 2D tương tự như công nghệ tile. Những ai từng chơi với trình chỉnh sửa bản đồ của StarCraft chắc hẳn hiểu tôi đang nói về điều gì. Đến phiên bản Warcraft III, dù engine đã chuyển sang 3D nhưng phương pháp vẫn không thay đổi lớn - dùng các texture tạo thành ô vuông để ghép lại. Tôi nhớ rằng Neverwinter Nights cũng áp dụng kỹ thuật tương tự, dù thời gian quá lâu nên không dám khẳng định chắc chắn.

0%