2010-08-13 40 views
9

Tôi đang sử dụng ứng dụng mẫu của Apple GLPaint làm cơ sở cho ứng dụng vẽ OpenGL ES, nhưng tôi không thể tìm ra cách triển khai chức năng hoàn tác bên trong nó.Làm cách nào để triển khai hoàn tác trong ứng dụng vẽ OpenGL ES trên iPhone?

Tôi không muốn chụp ảnh mọi cảnh quay và lưu trữ chúng. Có cách nào để sử dụng các đối tượng đệm khung khác nhau để thực hiện hoàn tác không? Bạn có đề xuất nào khác cho những cách tốt hơn để làm điều này?

Trả lời

9

Sử dụng đối tượng bộ đệm đỉnh (VBO) để hiển thị nội dung của bạn. Trên mỗi đột quỵ mới sao chép VBO cuối cùng vào danh sách ít nhất được sử dụng gần đây (LRU). Nếu LRU của bạn đã đầy, hãy xóa VBO ít được sử dụng gần đây nhất. Để khôi phục (lùi lại) đột quỵ cuối cùng chỉ sử dụng VBO được sử dụng gần đây nhất của LRU và hiển thị nó.

VBO: http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

LRU: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used

+0

Bạn có thể vui lòng cung cấp một số mã mẫu về cách triển khai tính năng này không? – antalkerekes

+1

Lắc để hoàn tác :-) Điều này có phù hợp với bạn không? https://github.com/larsxschneider/Undo-in-OpenGL-ES –

+0

Hoạt động hoàn hảo, cảm ơn bạn rất nhiều! Tôi sẽ liên lạc để cho bạn thấy những gì tôi đã làm với nó. Bounty cũng xứng đáng. – antalkerekes

6

tôi sẽ khuyên bạn sử dụng NSUndoManager để lưu trữ một danh sách các hành động vẽ thực tế được thực hiện bởi người sử dụng (vẽ đường từ đây đến đây sử dụng cọ này, vv .). Nếu được lưu trữ dưới dạng danh sách các toạ độ x, y cho bản vẽ vector, cùng với tất cả siêu dữ liệu khác cần thiết để tạo lại phần bản vẽ đó, bạn sẽ không sử dụng bất kỳ nơi nào gần bộ nhớ nhiều như lưu trữ hình ảnh, đối tượng đệm đỉnh hoặc đối tượng khung hình .

Thực tế, nếu bạn lưu trữ các bước vẽ này trong cơ sở dữ liệu lõi dữ liệu, bạn gần như có thể hoàn tác miễn phí. Xem câu trả lời của tôi here để biết thêm.

+1

Lưu tất cả các bước và sau đó vẽ lại chúng - bước cuối cùng (hoàn tác) có thể rất chậm khi bạn có nhiều bước để vẽ lại, tôi có thiếu gì đó không? –

+0

Tôi khuyên bạn nên lưu trữ một hình ảnh thô cứ 10 điểm hoặc hơn để kiểm tra các điểm sao cho bạn không phải vẽ lại 100 bước cuối cùng hoặc điều gì đó điên rồ – jjxtra

-1

Hoặc bạn có thể sử dụng NSUndoManager, lớp được cung cấp bởi iOS

Hoặc bạn có thể lưu trạng thái hiện tại của khu vực màn hình bằng cách:

CGContextRef current = UIGraphicsGetCurrentContext(); 

Bạn có thể có một mảng như ngăn xếp với các đối tượng hình ảnh màn hình và trên undo hành động bạn có thể bật giá trị từ ngăn xếp và trên mỗi giá trị đẩy thay đổi vào ngăn xếp.

+0

Người hỏi đang tìm giải pháp liên quan đến OpenGL ES và trạng thái đồ họa như bạn mô tả chỉ hoạt động Đồ họa cốt lõi. Họ sẽ không áp dụng ở đây. –

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