Chiếu sáng cho trò chơi dành cho thiết bị di động bằng Unity

Ánh sáng là một trong những khía cạnh quan trọng nhất của trò chơi. Yếu tố này có thể giúp tạo nên hứng thú, dẫn dắt người chơi, xác định các mối đe doạ hoặc mục tiêu, v.v. Ánh sáng có thể tạo ra hoặc phá hỏng yếu tố đồ hoạ của trò chơi. Ví dụ: Ánh sáng tốt có thể khiến mô hình kém chất lượng trông đẹp hơn trong trò chơi, còn ánh sáng kém có thể khiến mô hình tuyệt vời trông tệ hơn.

Hướng dẫn này cung cấp thông để bạn có thể sử dụng ánh sáng tốt hơn trong trò chơi dành cho thiết bị di động. Cách bạn quyết định sử dụng ánh sáng sẽ ảnh hưởng đến hiệu suất của trò chơi trên thiết bị di động. Bạn cần phải sử dụng ánh sáng một cách hiệu quả để đảm bảo trò chơi hoạt động suôn sẻ nhất có thể.

Các phần của bài viết này dựa trên nội dung do Arm Limited giữ bản quyền và đóng góp.

Các tuỳ chọn quy trình kết xuất (render pipeline)

Legacy Render Pipeline (Quy trình kết xuất kế thừa) của Unity bao gồm các đường dẫn kết xuất sau:

  • Kết xuất chuyển tiếp (Forward rendering)
  • Tô bóng trễ (Deferred shading)

Kết xuất chuyển tiếp (Forward rendering)

Với tính năng kết xuất chuyển tiếp, cần rất nhiều điểm sáng theo thời gian thực. Nếu giảm số lượng điểm sáng có trên mỗi pixel, bạn có khắc phục phần nào vấn đề này.

Tô bóng trễ (Deferred shading)

Chế độ tô bóng trễ đòi hỏi phải có GPU hỗ trợ. Trên phần cứng tương thích, chế độ tô bóng trễ có thể kết xuất một số lượng lớn điểm sáng theo thời gian thực với độ chân thực cao. Tiếc là, chế độ tô bóng trễ không hoạt động tốt trên GPU của thiết bị di động vì có băng thông thấp hơn.

Khi bạn tạo một trò chơi trên thiết bị di động, quan trọng là trò chơi phải chạy mượt mà trên nhiều thiết bị nhất có thể.

Universal Render Pipeline (Quy trình kết xuất phổ quát)

Unity đã phát triển Universal Render Pipeline (URP) (Quy trình kết xuất phổ quát). Bạn nên sử dụng URP cho trò chơi dành cho thiết bị di động.

Chế độ chiếu sáng

Nhiều chế độ sáng được sử dụng dựa trên cách ánh sáng di chuyển hoặc được sử dụng trong một Cảnh (Scene) Một loại chế độ sáng lại có đặc điểm hiệu suất riêng. Khi bạn triển khai việc chiếu sáng, hãy cân nhắc những yếu tố sau:

  • Sử dụng chế độ baked (bắt sáng) để chiếu sáng tĩnh. Chế độ này phù hợp nhất với các đối tượng không thay đổi ánh sáng trong thời gian chạy. Chiếu sáng bắt sáng (baking lights) là quá trình tổng hợp trước và lưu trữ dữ liệu về ánh sáng trong bản đồ kết cấu được có tên lightmap (bản đồ ánh sáng).
    • Bạn không thể sửa đổi tính năng chiếu sáng bắt sáng trong thời gian chạy. Ánh sáng và bóng trong bản đồ ánh sáng là tĩnh. Vì tất cả ánh sáng đã được xử lý trước trong Unity, nên không có phép tính ánh sáng trong thời gian chạy nào ảnh hưởng đến hiệu suất.
    • Không thể tạo bóng động bằng ánh sáng bắt sáng. Cách này có thể trông không phù hợp với các đối tượng động hoặc vật thể chuyển động.
  • Sử dụng chế độ mixed (hỗn hợp) cho nguồn sáng đứng mà bạn định tương tác với vật thể chuyển động. Ví dụ: ngọn đuốc chiếu sáng lên một người chơi và tạo bóng đổ khi người chơi di chuyển qua.
    • Chế độ sáng hỗn hợp trực tiếp tạo ra ánh sáng và bóng động.
    • Bạn có thể đưa ánh sáng hỗn hợp vào quá trình tính toán ánh sáng cho các đối tượng tĩnh.
    • Bạn có thể thay đổi cường độ sáng trong thời gian chạy. Chỉ ánh sáng trực tiếp (direct light) mới được cập nhật.
    • Đắt
  • Sử dụng chế độ thời gian thực (real time) cho các đèn động hoặc chuyển động được, chẳng hạn như ánh sáng được truyền từ quả cầu lửa phát ra từ mặt đất rồi phát nổ.
    • Bạn có thể sửa đổi thuộc tính bóng động và ánh sáng trong thời gian chạy.
    • Ánh sáng theo thời gian thực không được chuyển thành bản đồ ánh sáng.
    • Rất tốn kém.

Để biết thêm thông tin, hãy đọc bài viết Unity's Lighting Pipeline (Quy trình chiếu sáng của Unity).

Khi có thể, hãy sử dụng ánh sáng tĩnh và tránh ánh sáng động

Ánh sáng động hoặc ánh sáng theo thời gian thực được tính toán và cập nhật cho mọi khung hình. Điều này rất tốt đối với các vật thể chuyển động, tương tác và tạo cảm xúc.

Ngược lại, thông tin về ánh sáng tĩnh được đưa vào bản đồ ánh sáng. Việc sử dụng kết cấu bản đồ ánh sáng (lightmap texture) cho phép đối tượng tránh được các phép tính tốn kém về mỗi đỉnh (vertex) hoặc ánh sáng trên mỗi pixel. Chi phí kết xuất của kết cấu bản đồ ánh sáng luôn rẻ hơn nhiều so với ánh sáng động. Bạn nên coi việc triển khai chiếu sáng bắt sáng là lựa chọn hàng đầu cho trò chơi dành cho thiết bị di động.

Xử lý bắt sáng bản đồ ánh sáng (Lightmap baking)

Việc tính toán trước các hiệu ứng ánh sáng được gọi là xử lý bắt sáng bản đồ ánh sáng (lightmap baking). Hiệu ứng của ánh sáng được lưu trữ trong một cấu trúc riêng biệt, được gọi là lightmap (bản đồ ánh sáng). Bạn có thể sử dụng bản đồ ánh sáng để tăng cường dáng vẻ bề ngoài của các đối tượng. Chỉ cần thực hiện bắt sáng bản đồ ánh sáng một lần cho mỗi lần Cảnh (Scene) lặp lại. Nếu thay đổi hình dạng Cảnh hoặc thay đổi các thông số của chế độ bắt sáng, bạn cần thực hiện lại việc xử lý bắt sáng bản đồ ánh sáng. Ngoại trừ mức hao tổn của kết cấu bản đồ ánh sáng, thời gian chạy sẽ không bị ảnh hưởng gì thêm về mặt hiệu suất. Đây là phương pháp ban đầu tốt nhất để chiếu sáng trên nền tảng di động.

Ánh sáng bắt sáng không bị ảnh hưởng bởi khía cạnh động hay chuyển động nào của Cảnh. Ánh sáng bắt sáng có bao gồm cả chế độ Baked Global Illumination (Chiếu sáng bắt sáng toàn cục) cho tất cả yếu tố tĩnh. Như vậy, phương pháp tính toán bản đồ ánh sáng bao gồm ánh sáng gián tiếp đã phá vỡ các đối tượng tĩnh khác cũng như các ánh sáng bắt sáng trực tiếp chiếu vào đối tượng.

Hình 1. Tuỳ chọn thiết lập chiếu sáng bắt sáng hoàn chỉnh được sử dụng trong bản minh hoạ công nghệ của Armies.

Để sử dụng chế độ sáng bắt sáng, hãy làm theo 3 bước sau.

Bước 1: Đặt ánh sáng ở chế độ Mixed (Hỗn hợp) hoặc Baked (Bắt sáng)

Đặt Mode (Chế độ) của ánh sáng thành Mixed (Hỗn hợp) hoặc Baked (Bắt sáng). Đối với trò chơi dành cho thiết bị di động, tốt nhất bạn nên ưu tiên Baked (Bắt sáng) hơn là Mixed (Hỗn hợp). Bắt sáng là cách ít tốn kém nhất để kết xuất ánh sáng.

Hình 2. Chế độ cài đặt Mode (Chế độ) cho ánh sáng trong Unity.

Bước 2. Đặt đối tượng ở dạng tĩnh

Làm cho mọi vật thể bị ảnh hưởng bởi ánh sáng bắt sáng Static (Tĩnh). Có nhiều phương án tối ưu hoá cho một đối tượng được đánh dấu là tĩnh, nhưng thông thường, tốt nhất là bạn nên chọn Everything (Mọi thứ) trong danh sách thả xuống Static (Tĩnh). Khi vật thể được đánh dấu là Static (Tĩnh), Unity biết rằng nên bao gồm vật thể này khi thực hiện chiếu sáng bắt sáng.

Hình 3. Ví dụ mẫu về trình đơn tĩnh.

Bước 3. Xử lý bắt sáng

Bạn có thể xử lý bắt sáng (bake lights) bằng trình đơn Lighting (Ánh sáng) trong Window (Cửa sổ) > Rendering (Kết xuất) > Lighting Settings (Cài đặt ánh sáng).

Khi bạn xử lý bắt sáng, dữ liệu lưu lại dựa trên mọi Cảnh đang hoạt động khi bạn bắt đầu bắt sáng. Một thư mục được tạo bằng tên tương tự như Cảnh được bắt sáng. Thư mục này lưu trữ tất cả thành phần dữ liệu ánh sáng. Nếu dự án tải nhiều Cảnh cùng một lúc, bạn phải xử lý bắt sáng cho từng Cảnh. Nếu điều chỉnh Cảnh, bạn phải xử lý bắt sáng lại.

Hình 4. Ví dụ về bản đồ ánh sáng được xử lý bắt sáng

Tối ưu hoá bản đồ ánh sáng

Sau khi thiết lập ánh sáng bắt sáng, hãy đảm bảo rằng bản đồ bắt sáng (baked map) được tối ưu hoá. Kích thước của bản đồ ánh sáng còn tuỳ thuộc vào chế độ cài đặt tại thời điểm xử lý bắt sáng. Do phải giảm mức sử dụng bộ nhớ trên thiết bị di động nên bạn phải giám sát kích thước bản đồ ánh sáng.

Trong ví dụ sau từ bản minh hoạ của Armies, có 7 bản đồ ánh sáng 1024x1024 pixel. Trong bản xem trước, bạn có thể thấy các mắt lưới nằm trên bản đồ ánh sáng. Các mắt lưới đã chọn được làm nổi bật.

Hình 5. Đây là một ví dụ về bản đồ ánh sáng. Các phần màu xanh dương là các mắt lưới được chọn.

Có nhiều chế độ cài đặt trong Lightmapping Settings (Cài đặt bản đồ ánh sáng), cùng với kích thước của bản đồ, để xác định mức dung lượng bộ nhớ và dung lượng lưu trữ mà mỗi bản đồ sử dụng. Các phần sau đây nêu bật một số chế độ cài đặt quan trọng.

Công cụ lập bản đồ ánh sáng (Lightmapper)

Unity cung cấp 3 phương pháp sau đây để xử lý bắt sáng trong Cảnh:

  • Enlighten: Chỉ hỗ trợ cho đến khi có bản phát hành hỗ trợ dài hạn (LTS) năm 2020. Đừng sử dụng cho các dự án mới.
  • Progressive CPU: Tiết kiệm nhiều thời gian bởi vì quá trình này tạo dần bản đồ ánh sáng. Nếu Prioritize View (Chế độ xem ưu tiên) được chọn, thì các khu vực trong Scene view (Chế độ xem cảnh) sẽ được ưu tiên. Thao tác này có thể làm giảm thời gian lặp lại để thiết lập ánh sáng trên Cảnh.
  • Progressive GPU (GPU tăng tiến): Hoạt động giống như CPU tăng tiến (Progressive CPU), nhưng tạo ra bản đồ ánh sáng trên GPU thay vì CPU. Trên phần cứng được hỗ trợ, phương thức này có thể làm giảm đáng kể thời gian xử lý bắt sáng so với khi sử dụng CPU. Bạn cần đáp ứng thêm các yêu cầu để thiết lập GPU tăng tiến. Hãy tìm hiểu thêm về các yêu cầu trên trang Công cụ lập bản đồ ánh sáng cho GPU tăng tiến.

Hình 6. Lightmapper Settings (Cài đặt công cụ lập bản đồ ánh sáng) cho phép bạn thay đổi phương pháp bắt sáng cho Cảnh.

Texel

Một texel hay texture pixel (pixel kết cấu) là một pixel riêng lẻ trong bản đồ kết cấu (texture map). Texel lưu trữ thông tin về ánh sáng trong bản đồ ánh sáng cho từng điểm ánh sáng chiếu vào đối tượng. Nếu bạn sử dụng càng nhiều texel trên mỗi đơn vị không gian, thì chất lượng ánh sáng, thời gian tính toán để xử lý bắt sáng, chi phí dung lượng lưu trữ đĩa và chi phí VRAM của bản đồ ánh sáng đều bị ảnh hưởng.

Để giảm lượng dữ liệu bản đồ ánh sáng cần thiết, hãy điều chỉnh số lượng texel trên mỗi đơn vị sẽ được xử lý bắt sáng trong phần Lightmapping Settings (Cài đặt bản đồ ánh sáng).

Hình 7. Tuỳ chọn cài đặt hiện có cho bản đồ ánh sáng.

Trong mục Lightmapping Settings (Cài đặt bản đồ ánh sáng), tham số Lightmap Resolution (Độ phân giải bản đồ ánh sáng) kiểm soát số lượng texel được sử dụng cho mỗi đơn vị trong bản đồ ánh sáng. Sau đây là ví dụ về một hình lập phương có nhiều tuỳ chọn cài đặt Lightmap Resolution (Độ phân giải bản đồ ánh sáng). Bạn có thể thấy độ phân giải cao hơn làm tăng nhanh lượng công việc cần thiết như thế nào.

Hình 8. Khối lập phương đầu tiên có Lightmap Resolution (Độ phân giải bản đồ ánh sáng) là 1. Khối thứ hai có Lightmap Resolution (Độ phân giải bản đồ ánh sáng) là 2. Khối thứ ba có Lightmap Resolution (Độ phân giải bản đồ ánh sáng) là 5.

Để xem các texel được bố trí như thế nào trong Cánh, hãy chọn danh sách thả xuống Draw Mode (Chế độ vẽ) trên Scene view (Chế độ xem cảnh) rồi chọn Baked Lightmap (Bản đồ ánh sáng được xử lý bắt sáng).

Các đối tượng đã xử lý bắt sáng được bao phủ trong một lớp phủ (overlay) theo kiểu bàn cờ. Mẫu bàn cờ này cho biết cách phân phối texel khi bạn xử lý bắt sáng.

Trong ví dụ sau, việc giảm Lightmap Resolution (Độ phân giải bản đồ ánh sáng) từ 15 xuống 12 trong bản minh hoạ của Armies sẽ làm giảm số lượng bản đồ ánh sáng cần thiết từ 7 xuống 4.

Hình 9. Bản minh hoạ của Armies có Lightmap Resolution (Độ phân giải bản đồ ánh sáng) là 12.

Cách sử dụng Texel

Tuy bạn có thể đặt số lượng texel trên mỗi đơn vị trong toàn bộ Cảnh, nhưng thường có một số đối tượng không cần nhiều texel.

Unity cho phép bạn kiểm soát số lượng texel mà mỗi đối tượng sử dụng. Trong Inspector (Trình kiểm tra) > Mesh Renderer (Trình kết xuất mắt lưới) cho một đối tượng, giá trị tham số Scale In Lightmap (Điều chỉnh tỷ lệ trong bản đồ ánh sáng) kiểm soát số lượng texel mà đối tượng sử dụng trong bản đồ ánh sáng

Trong ví dụ sau, hình lập phương ở bên trái có 5 texel thông tin ánh sáng cho mỗi đơn vị bắt sáng. Hộp ở bên phải có Scale In Lightmap (Điều chỉnh tỷ lệ trong bản đồ ánh sáng) được đặt thành 0,5. Chế độ cài đặt đó điều chỉnh tỷ lệ texel của ánh sáng thành 2,5, nên cần ít không gian hơn trong bản đồ ánh sáng so với hộp ở bên trái.

Hình 10. Hai hình lập phương có độ phân giải bản đồ ánh sáng khác nhau.

Hình 11. Bạn có thể thay đổi tuỳ chọn cài đặt Scale In Lightmap (Điều chỉnh tỷ lệ trong bản đồ ánh sáng) để một đối tượng có ít texel hơn.

Cố gắng tránh dùng texel cho những vấn đề sau:

  • Các bề mặt và vật thể mà người chơi sẽ không nhìn thấy. Điều này giúp tránh lãng phí bộ nhớ trên bản đồ ánh sáng cho các chi tiết không có trên màn hình.
  • Các bề mặt có ít biến thể ánh sáng. Ví dụ: các đối tượng trong một bóng đổ hoặc được nhấn bởi một nguồn ánh sáng duy nhất.
  • Các vật thể nhỏ hoặc mỏng. Lượng ánh sáng mà các đối tượng này nhận được sẽ không ảnh hưởng nhiều đến lần kết xuất cuối cùng của Cảnh.

Ánh sáng giả càng nhiều càng tốt

Để giảm các yêu cầu xử lý, bạn có thể làm giả một số thành phần. Điều này có thể khiến nội dung trông như sử dụng ánh sáng, nhưng thực ra lại sử dụng các phương pháp hiệu quả hơn.

Bóng giả

Bóng theo thời gian thực thì tốn kém. Chúng được tạo bằng một kỹ thuật có tên là shadow mapping (lập bản đồ bóng). Chi phí để kết xuất các yếu tố hình học của Scene vào shadow map (bản đồ bóng) sẽ tỷ lệ với số đỉnh (vertex) được vẽ với các bóng đã bật. Bạn nên giới hạn lượng yếu tố hình học dùng để đổ bóng và số lượng ánh sáng đổ bóng theo thời gian thực.

Bạn có thể triển khai bóng giả (fake shadow) cho các bóng trên vật thể động mà không có ánh sáng động. Điều này giúp chi phí kết xuất thấp và có thể đạt được hiệu ứng tương tự như tính năng bóng động. Dưới đây là một số cách triển khai bóng giả:

  • Sử dụng một lưới 3D, chẳng hạn như một mặt phẳng hoặc bốn cạnh, đặt bên dưới nhân vật và áp dụng một kết cấu (texture) làm mờ.
  • Bạn có thể viết trình đổ bóng tuỳ chỉnh của riêng mình để có nhiều bóng giả tinh vi hơn.

Ví dụ sau đây cho thấy kết quả nếu bạn sử dụng lưới 3D để đổ bóng:

Hình 12. Thực hiện đổ bóng trong bản minh hoạ công nghệ của Armies.

Vẽ trực tiếp thông tin về ánh sáng trên kết cấu

Nếu bạn tô một số màu của bóng vào kết cấu, thì điều này sẽ giảm bớt quá trình tính toán bắt buộc cho các điểm sáng bổ sung. Lựa chọn này sẽ giúp tiết kiệm bộ nhớ khi bạn xử lý bắt sáng ánh sáng của Cảnh, vì cần ít dữ liệu bản đồ ánh sáng hơn.

Đầu dò ánh sáng (Light Probe)

Khi bạn sử dụng các đối tượng động với kỹ thuật chiếu sáng bắt sáng, bản đồ ánh sáng sẽ không ảnh hưởng đến các đối tượng đó. Điều này khiến các đối tượng đó có vẻ như không thuộc về Cảnh.

Bạn có thể giải quyết vấn đề này bằng Đầu dò ánh sáng (Light Probe). Đầu dò ánh sáng có các lợi ích tương tự như bản đồ ánh sáng. Các đầu dò ánh sáng này lưu trữ dữ liệu ánh sáng có thể được tính toán trước và lưu lại để sử dụng trong thời gian chạy. Việc này sẽ chuyển phần lớn chi phí tính toán vào thời gian chỉnh sửa.

Trong khi bản đồ ánh sáng mã hoá ánh sáng nhận được trong một texel cho các bề mặt, thì Đầu dò ánh sáng lưu trữ ánh sáng truyền qua không gian trống. Bạn có thể sử dụng dữ liệu này để chiếu sáng các đối tượng sẽ di chuyển. Đầu dò ánh sáng giúp tích hợp các đối tượng động với các đối tượng được lập bản đồ ánh sáng trong suốt Cảnh.

Đầu dò ánh sáng được sử dụng tốt nhất để chiếu sáng các vật thể chuyển động trong Cảnh. Đầu dò ánh sáng tận dụng ánh sáng được bắt sáng, cho phép các đối tượng chuyển động có ánh sáng giống trong Cảnh. Việc chiếu sáng các đối tượng động bằng Đầu dò ánh sáng sẽ ít tốn kém hơn so với ánh sáng theo thời gian thực.

Bạn có thể tìm hiểu thêm ở các trang Chiếu sáng tĩnh bằng Đầu dò ánh sáng Đầu dò ánh sáng.

Hình 13. Các đầu dò ánh sáng được đặt để thắp sáng những đám đông động trong bản minh hoạ công nghệ của Armies.

Cài đặt Trình kết xuất lưới (Mesh Renderer)

Bất kể loại cảnh bạn sử dụng là gì, quan trọng là phải thiết lập chế độ cài đặt Mesh Renderer (Trình kết xuất lưới) chính xác.

Hãy tắt mọi thứ bạn không sử dụng. Các chế độ cài đặt như Cast Shadows (Soi bóng) sẽ làm tăng chi phí khi bạn kết xuất Scene ngay cả khi đối tượng không sáng. Ví dụ sau về các tuỳ chọn cài đặt Mesh Renderer (Trình kết xuất lưới) cho một nhân vật hiển thị trong Hình 13. Nhân vật này sử dụng dữ liệu đầu dò ánh sáng, nhưng không sử dụng đầu dò phản chiếu (reflection probe).

Tuỳ chọn cài đặt Blend Probes (Đầu dò kết hợp) kết hợp thông tin ánh sáng của các đầu dò ánh sáng gần nhất đến nhân vật. Khi nhân vật di chuyển xung quanh Cảnh, các đầu dò ánh sáng ảnh hưởng đến nhân vật sẽ thay đổi. Cast Shadows (Soi bóng) bị tắt vì quy trình kết xuất sử dụng phương thức blob. Receive Shadows (Nhận bóng) cũng bị tắt do Cảnh được bắt sáng và không có bóng theo thời gian thực.

Hình 14. Chế độ cài đặt Mesh Renderer (Trình kết xuất lưới) cho phần kết xuất trong Hình 13.

Ánh sáng theo thời gian thực và các loại ánh sáng

Bạn nên xử lý ánh sáng bằng kỹ thuật chiếu sáng bắt sáng, Đầu dò ánh sáng và các kỹ thuật chiếu sáng giả như vẽ ánh sáng lên kết cấu hoặc hiệu ứng vật liệu đổ bóng. Tuy nhiên, nếu cần ánh sáng theo thời gian thực, bạn phải xem xét loại ánh sáng sẽ sử dụng.

Mỗi loại ánh sáng lại có chi phí tính toán ánh sáng riêng. Sau đây là danh sách chi tiết về từng loại ánh sáng:

  • Directional (Định hướng): Ánh sáng này có hướng đồng nhất và không có hướng tắt. Ánh sáng định hướng là ánh sáng theo thời gian thực rẻ nhất. Thông thường, bạn chỉ cần một ánh sáng định hướng cho mỗi cảnh. Với tính năng kết xuất chuyển tiếp, hướng đi được đề xuất cho thiết bị di động, Unity sẽ đưa vào ánh sáng định hướng mặc định nếu không có ánh sáng định hướng trong Scene.
  • Spot (Đèn rọi): Quét các vật thể bên ngoài hình nón và không chiếu sáng chúng. Điều này làm cho chiếu sáng kiểu đèn rọi ít tốn kém hơn so với mặt cầu nguồn sáng điểm. Để có hiệu suất tốt nhất, hãy cố định chiều rộng của hình nón và chỉ nhấn vào các đối tượng dự định.
  • Point (Điểm sáng): Các điểm sáng này phát sáng theo mọi hướng. Việc sử dụng ánh sáng theo mọi hướng hữu ích nhưng rất tốn kém. Điểm sáng rất tốn kém trong một khu vực rộng lớn. Ngoài ra, việc tính toán đổ bóng có thể là phần tốn kém nhất của việc chiếu sáng. Nếu bạn truyền ánh sáng theo mọi hướng, thì sẽ có thêm nhiều bóng và nhiều tính toán hơn.