2012-07-01 11 views
9

Tôi đã xem các hướng dẫn trong SDK DirectX. Hướng dẫn 5 hoạt động tốt, nhưng sau khi tôi đã sao chép và tách mã thành các lớp của riêng tôi, tôi đã gặp lỗi lạ khi khởi chạy ứng dụng của mình.Tai nạn sau m = XMMatrixIdentity() - bộ nhớ aligment trong lớp học?

Dòng là:

g_World1 = XMMatrixIdentity(); 

Do đó, tôi đã nhận lỗi trong điều hành xnamathmatrix.int = trông như thế:

XMFINLINE _XMMATRIX& _XMMATRIX::operator= 
(
    CONST _XMMATRIX& M 
) 
{ 
    r[0] = M.r[0]; 
    r[1] = M.r[1]; 
    r[2] = M.r[2]; 
    r[3] = M.r[3]; 
    return *this; 
} 

Và thông báo lỗi là:

Access violation reading location 0xffffffff 

Tôi đã đọc ở đâu đó có thể do một thứ gì đó được kết nối với XMFLOAT4X4/XMMATRIX:

Bạn đã cân nhắc sử dụng XMFLOAT4X4 để lưu trữ ma trận và chỉ sử dụng XMMATRIX?

Nhưng tôi nghĩ rằng tôi đã sử dụng XMMATRIX.

MyClass.h:

private: 
    XMMATRIX g_World1; 

MyClass.cpp:

void init(){ 
    g_World1 = XMMatrixIdentity(); 
} 

Tôi không nghĩ rằng tôi nên thay đổi XMMATRIX g_World1; để XMFLOAT4X4 g_World1, vì nó tạo ra các lỗi như:

lỗi C2679: nhị phân '=': không có nhà điều hành tìm thấy trong đó có một toán hạng bên phải của loại 'XMMATRIX' (hoặc không có chuyển đổi có thể chấp nhận)

Vì vậy, vấn đề là gì?

Trả lời

5

XMVECTOR và XMMATRIX là các loại 'đăng ký proxy'. Bạn có thể sử dụng chúng một cách an toàn như các loại cho các nền tảng Xbox 360, Xbox One và Windows x64 vì tất cả chúng đều có liên kết 16 byte cho dữ liệu trên ngăn xếp và được cấp phát trên heap.

Sử dụng chúng cho Windows 32 bit hoặc Windows RT/ARM mất nhiều công sức hơn do liên kết gốc có kích thước nhỏ hơn 16 byte. Một cách tiếp cận là kỹ thuật được sử dụng bởi DirectX Tool Kit ... nó sử dụng thành ngữ pImpl và các lớp bên trong pImpl được phân bổ rõ ràng với sự liên kết 16-byte là nơi mà các loại XMVECTOR và XMMATRIX được sử dụng trực tiếp. Một cách tiếp cận khác là sử dụng tất cả các loại 'lưu trữ' khác nhau như XMFLOAT4 và XMFLOAT4X4.

Lưu ý: DirectXMath programmer's guide bao gồm việc này. Nó không phải là một tài liệu dài để đọc, và nó được đóng gói với rất nhiều gợi ý và khuyến nghị.

PS: Có phiên bản hướng dẫn Direct3D chuẩn cho máy tính Win32 trên MSDN Code Gallery không yêu cầu DirectX SDK ... nó chỉ sử dụng Windows 8.x SDK đi kèm với VS 2012 hoặc VS 2013. enter link description here

6

Vì XMMATRIX đại diện cho ma trận 4x4 liên kết 16 byte, phân bổ không được gán g_World1 gây ra vi phạm truy cập (chỉ cần đặt, địa chỉ của g_World1 không chia hết cho 16).

Sắp xếp giải pháp: cho phép căn chỉnh cấu trúc thành viên 16 byte (để MyClass có g_World1 "tại chỗ"). Nhưng bạn vẫn phải đảm bảo rằng các phiên bản MyClass nằm ở địa chỉ chia hết cho 16.

Bạn có thể sử dụng toán tử 'mới' để phân bổ các đối tượng MyClass.

Giới thiệu về căn chỉnh xem tại đây: How to align pointer

+0

Có lẽ đó là một câu hỏi ngu ngốc nhưng làm thế nào để đạt được nó? Tôi đã tạo ra một ma trận struct có chứa bốn ma trận (xem, thế giới, vv) nhưng làm thế nào để 'cho phép cấu trúc thành viên liên kết bởi 16 byte' cho nó? – PolGraphic

+0

Đối với VStudio: Thuộc tính dự án -> Thuộc tính cấu hình -> C/C++ -> Mã thế hệ -> Cấu trúc liên kết bộ nhớ -> chọn 16 có –

+0

Đối với GCC có một "__attribute__ ((aligned (16)))" cho cấu trúc –

1

Cảm ơn bạn.

Cuối cùng, tôi quyết định sử dụng các hàm XMLoadFloat4x4() và XMStoreFloat4x4(). Tôi lưu trữ các thành viên của lớp là Float4x4 và chuyển đổi chúng để sử dụng tạm thời thành XMMATRIX mỗi vòng lặp render(). Nhưng ... đó là một giải pháp nhanh hay câm?

+1

Cân nhắc việc bắt đầu một câu hỏi khác, đây không phải là diễn đàn thảo luận. Nếu số lượng ma trận nhỏ thì đây sẽ không phải là vấn đề. –

+0

Có vẻ như chúng bằng nhau. Nếu bạn không chuyển đổi chúng thành XMMatrix để tính toán (lol), tất nhiên. – Loryan55

+0

Đó chính là cách bạn dự kiến ​​sẽ xử lý căn chỉnh ... –

1

Trong mục "Giới thiệu về 3D Game Programming với DirectX 11" Sách từ "Frank D. Luna" nó nói:

Không sử dụng XMMATRIX như thành viên của một lớp hoặc cấu trúc.Luôn sử dụng XMFloat4x4 và tải và lưu trữ lại nếu bạn cần.

Các vấn đề liên quan