Làm sao dựng một cái 3D World rộng như GTASA hay Silkroad

Thảo luận trong 'Game Development' bắt đầu bởi lamtacla, 2/6/06.

  1. lamtacla

    lamtacla Donkey Kong

    Tham gia ngày:
    24/10/04
    Bài viết:
    340
    Nơi ở:
    City 17
    + Hồi đó giờ, hầu hết các game tui chơi đều chia thành những map nhỏ, khi đến một khu vực nào đó thì "loading"-> qua một khu vực mới.
    + Rất nhiều game thuộc thể loại này, nhiều nhất là dạng FPS như HL, Quake...
    + Thiết nghĩ việc lập trình dạng game này cũng ko quá phức tạp, tại mỗi khu vực - load cái map bsp và thả nhân vật vào - khi nó chạy tới điểm nào đó thì load cái 3d map khác.
    + Từ hồi mua cái GTA:SA về chơi mới thấy khác: Nhân vật chính của chúng ta chạy trong một thế giới rộng lớn mà hồi đó giờ chưa bao giờ thấy. Không hề có cảnh: "Loading-Plz wait".
    + Từ hồi lắp net, tập tành ba cái game online cũng thấy Silkroad như thế.
    + Đứng trên góc nhìn của một thằng lập trình tập tành viết game thì ko thể nào load được cái map tổ bố như thế vào bộ nhớ.
    + Chẳng hiểu bọn chúng dùng cách nào và đây là công nghệ gì, ai biết tham gia nào!
     
  2. cuongnhc

    cuongnhc Youtube Master Race

    Tham gia ngày:
    4/3/06
    Bài viết:
    3
    uh, chủ đề nay hay đấy, mọi người ai có kinh nghiệm hoặc biết thì vào share cho anh em với, mình cũng đang mới bắt đầu tìm hiều về nó. Theo mình nghĩ thì nó sẽ vẫn load toàn bộ cái map vào, nhưng tất nhiên chỉ là csdl bề mặt 3D của map thôi, nó có thể không khớp hoàn toàn với cái map mà mình nhìn thấy (có thể mấy cái cây sẽ được thay thế bằng một cái khối hình trụ tròn chẳng hạn - tất nhiên nó phải có cách đánh dấu để biết sẽ phải thay thế ngược lại bằng cái cây nào khi render, một cái nhà trông có thể rất đẹp nhưng trong map nó load ban đầu có thể chỉ là tổ hợp của các hình khối...) cái map này sẽ phục vụ cho việc xử lý khi nhân vật di chuyển và xử lý thuật toán tìm đường cho mob thôi. Còn cái cảnh mà ta nhìn thấy trong game nó sẽ render tại thời điểm minh chơi: trong các game 3D thường cho xác lập tầm nhìn nhân vật. máy tính càng mạnh thì mình có thể nhìn xa hơn (render được một vùng không gian lớn hơn, trong DX hay OpenGL no' gọi là độ sâu của không gian nhìn thì phải).
     
  3. tutukun

    tutukun Mario & Luigi

    Tham gia ngày:
    15/2/05
    Bài viết:
    749
    Nơi ở:
    Singapore
  4. gevf

    gevf Youtube Master Race

    Tham gia ngày:
    14/6/03
    Bài viết:
    97
    Nơi ở:
    HN
    Để sử dụng map to như vậy ng ta không dùng BSP (cảnh nhỏ trong phòng) như các game FPS mà sử dụng terrain (thảo nguyên bao la).
    Sử dụng kỹ thuật paging nghĩa là nạp từng phần vào bộ nhớ. Ngoài ra khi chạy từ vùng này sang vùng khác còn phải chuyển server nữa (mỗi server đáp ứng cho một vùng) như vậy cần sử dụng kỹ thuật zone liên quan đến thiết kế cấu trúc mạng. Khi nạp thì nó sẽ nạp trong một thread khác nên bạn không để ý đến quá trình nạp và cũng không cần hiển thị "loading".
     
  5. Thachsanh

    Thachsanh Dragon Quest

    Tham gia ngày:
    27/6/03
    Bài viết:
    1,436
    Cái này gọi là dynamic terrain loading. Thực tế ra bây giờ trong MMORPG có 3 trường phái, sử dụng dynamic terrain loading, sử dụng zone based. Cả zone based và dynamic terrain loading đều có ưu điểm khác nhau. Zone based thì người thiết kế có thể tạo ra zone phức tạp hơn, chi tiết hơn, đa dạng hơn, mỗi zone có thể có các đặc thù khác nhau, sử dụng được nhiều vật liệu hơn. Dynamic terrain loading thì có cảm giác thật hơn nhưng không thể nào thiết kế chi tiết như zone based được, các vật liệu cũng kém chi tiết hơn và không đa dạng như zone based.

    Không nên nhầm lẫn giữa zone based với instanced technology. Instanced technology cũng giống như zone based technology nhưng giới hạn chỉ có một nhóm người chơi trong một instance mà thôi, instance này sau đó sẽ hoàn toàn độc lập với thế giới bên ngoài cho đến khi nhóm người này quyết định rời khỏi instance. Sau khi tất cả mọi người rời khỏi instance thì instance này sẽ được hủy bỏ.

    Đại diện cho zone based là Final Fantasy XI, Everquest, Everquest 2...
    Đại diện cho dynamic terrain loading là Asheron's Call (có thể nói là game đầu tiên sử dụng technology này), Dark Age of Camelot, World of Warcraft...
     
  6. cuongnhc

    cuongnhc Youtube Master Race

    Tham gia ngày:
    4/3/06
    Bài viết:
    3
    hay quá, bác thạchsanh có thể nói chi tiết hơn về hai kỹ thuật dynamic terrain loading, và zone based này được không. Cách mà nó tổ chức dữ liệu, render... và nếu bác có tài liệu nào (basic thui) về cái này thì send cho tui được kô (cuongnhc@gmail.com), thx :D
     
  7. Alone Beast

    Alone Beast C O N T R A

    Tham gia ngày:
    14/1/04
    Bài viết:
    1,607
    Nơi ở:
    ...
    Có nghĩa là mỗi server đáp ứng cho 1 map, vậy với 1 game như Silk road phải có bao nhiêu server mới đủ ? Tôi nghĩ họ không làm như thế, mà có thể chia theo channel. Đồng ý là khi di chuyển từ vùng này sang vùng khác sẽ phải load phần map tương ứng, chuyển data của người chơi vào map mới - tôi nghĩ các map cùng nằm trên 1 server, vì thế mới dẫn đến chuyện full server như trong các game online hiện nay. Nếu mỗi map 1 server thì hiếm bao giờ có chuyện full server.
     
  8. lamtacla

    lamtacla Donkey Kong

    Tham gia ngày:
    24/10/04
    Bài viết:
    340
    Nơi ở:
    City 17
    Thế các game này map dạng gì là phù hợp nhất? BSP chắc là ko được - có lẽ là một terrain raw height map... nhưng như thế thì làm sao tạo được những cảnh phức tạp như silkroad? (cây cầu, thành trì...)
    Còn việc chia ra nhiều vùng - ý bác nói mỗi vùng là một mini-map hình chữ nhật? Nếu như vậy thì khi nhân vật chạy qua lại liên tục giữa góc giao của 4 vùng thì chắc ko có cpu nào chịu nổi.
    Còn một cách là load toàn bộ cái terrain - height map đó vào bộ nhớ lun, nhân vật chạu đến đâu thì hiển thị cảnh vật (cây cối, mob...) đến đó...
     
  9. Alone Beast

    Alone Beast C O N T R A

    Tham gia ngày:
    14/1/04
    Bài viết:
    1,607
    Nơi ở:
    ...
    Thường thì người ta không cắt ra như vậy, bởi nếu làm map có kích cỡ rộng (kinh khủng như vậy) rồi cắt ra nhiều phần hình chữ nhật thì... trình world editor nào chịu nổi, server cũng khó mà tải nổi - chắc load còn chậm hơn cả guildwar :D
    Tôi nghĩ họ tạo ra nhiều map riêng biệt - mỗi map là 1 vùng khá rộng, các góc và mép của map được rào kín bởi skybox, sông, hồ, núi non và các object để ngăn player tiếp cận. Player di chuyển từ map này sang map kia thì là chuyển data thôi.

    Thế thì toàn map chỉ thấy fog ở đằng xa xa thui ah :D Load cũng chậm nữa, chắc phải xài unreal ... ^^
     
  10. lamtacla

    lamtacla Donkey Kong

    Tham gia ngày:
    24/10/04
    Bài viết:
    340
    Nơi ở:
    City 17
    Ặc - nếu như vậy thì chẳng khác nào cái bsp map, đứng ở vùng này ko thể nhìn thấy vùng kia... khi chuyển vùng cũng phải "loading..."

    Uhm, bi giờ hình như game nào cũng chỉ thấy fog ở xa... làm gì đủ sức vẽ cảnh ở xa quá...
    Load tuy chậm, nhưng chỉ 1 lần vào đầu game. Nhưng như vậy ko biết có đủ bộ nhớ ko - nhất là khi địa hình quá phức tạp...
    Xài unreal là sao nhỉ?
     
  11. Alone Beast

    Alone Beast C O N T R A

    Tham gia ngày:
    14/1/04
    Bài viết:
    1,607
    Nơi ở:
    ...
    Thực ra ko phải vậy ,mà là số mặt polygon hiển thị của mỗi game engine là giới hạn thôi, vì thế càng rộng, càng lắm object thì càng khó load ==> lag là chuyện thường. Với game offline thì họ xử lí = cách dựng map thành nhiều room, rộng có chật có.
     
  12. Thachsanh

    Thachsanh Dragon Quest

    Tham gia ngày:
    27/6/03
    Bài viết:
    1,436
    Thực ra đây chính là nguyên tắc của dynamic terrain loading. Sử dụng prefetch ta có thể cache trước nhiều mảnh của map tùy vào vector di chuyển của nhân vật. Nếu bạn đã từng chơi Asheroll's call, game đầu tiên sử dụng kỹ thuật này thì sẽ thấy khá rõ. Trên máy nào yếu, ít RAM hay hardisk chậm là có thể thấy được game hơi khựng lại một chút mỗi khi di chuyển được một đoạn khá dài giống như vuột qua một vạch vô hình vậy.

    Đây chính là nguyên tắc của zone based MMORPG. Mỗi lần chuyển zone hay chuyển map là game phải load lại zone. Khi đó sẽ phải load texture, shader, monster models, map models và spawn table lại hết và cache trên memory. Texture và shader có thể cache trên memory của video card. Tuy có bất lợi là phải load mỗi lần chuyển map nhưng được cái là người thiết kế có thể thiết kế zone cực kỳ chi tiết và tạo cho mỗi zone một dáng vẻ khác nhau.
     
  13. lamtacla

    lamtacla Donkey Kong

    Tham gia ngày:
    24/10/04
    Bài viết:
    340
    Nơi ở:
    City 17
    Vậy là người ta cắt map ra thành những hình chữ nhật nhỏ hả bác Thachsanh? Nếu như vậy phải liên tục load các "hình chữ nhật" này mỗi khi nhân vật di chuyển à?
     
  14. buonnguqua

    buonnguqua Bị anh Tày dộng chày vào họng GameOver Lão Làng GVN

    Tham gia ngày:
    6/2/06
    Bài viết:
    8,266
    Nơi ở:
    Hà Nội City
    Liên tục đâu mà liên tục
    Chạy được 1 đoạn khá là xa thì mới load
    Chỉ liên tục khi bay chim trong WoW thôi, máy ít RAM gặp cảnh bay chim cứ gọi là giật lòi kèn
     
  15. Thachsanh

    Thachsanh Dragon Quest

    Tham gia ngày:
    27/6/03
    Bài viết:
    1,436
    Ờ, lúc bay trên gryphon bị giật là vì 2 điều
    - Thứ nhất là camera bị nâng cao lên rất nhiều, tầm nhìn tự nhiên bị mở rộng, số lượng polygon trong frustum tăng đột ngột mà không thể sử dụng các loại trick như khi ở trên mặt đất để hạn chế bớt được.
    - Thứ hai là tốc độ di chuyển quá cao, tăng đột ngột so với bình thường nên số lượng các mảnh nhỏ của map phải được prefetch vào memory phải tăng lên tương ứng. Nếu như chạy đến mép của cached map rồi mà vẫn chưa load kịp thì engine phải freeze frame người chơi lại (nếu không thì sẽ xảy ra hiện tượng là người chơi chạy vào vùng hoàn toàn trống không chẳng có gì cả) load map rồi dùng interpolate để đoán vị trí của người chơi sẽ phải ở đâu với tốc độ di chuyển đó, chính vị vậy mà sau khi freeze người chơi sẽ thấy mình đang ở rất xa so với vị trí ban đầu.
     
  16. Alone Beast

    Alone Beast C O N T R A

    Tham gia ngày:
    14/1/04
    Bài viết:
    1,607
    Nơi ở:
    ...
    [QUOTEThứ hai là tốc độ di chuyển quá cao, tăng đột ngột so với bình thường nên số lượng các mảnh nhỏ của map phải được prefetch vào memory phải tăng lên tương ứng. Nếu như chạy đến mép của cached map rồi mà vẫn chưa load kịp thì engine phải freeze frame người chơi lại (nếu không thì sẽ xảy ra hiện tượng là người chơi chạy vào vùng hoàn toàn trống không chẳng có gì cả) load map rồi dùng interpolate để đoán vị trí của người chơi sẽ phải ở đâu với tốc độ di chuyển đó, chính vị vậy mà sau khi freeze người chơi sẽ thấy mình đang ở rất xa so với vị trí ban đầu.[/QUOTE]

    Tôi có cái này chưa rõ: với loại Zone base, mỗi map là một khu vực riêng biệt, coi như kết nối với nhau bằng teleport point (area) nào đó. Vậy programmer phải xét vector di chuyển thế nào khi character "bay" (ví dụ vậy) đến mép map. Tất nhiên ko thể freeze frame đơn giản được.
    Tất nhiên họ có thể làm collusion đối với skybox (ect như Space Cowboy online) nhưng như vậy quá thô lậu. Có thể coi như làm Zone base là hạ sách nếu có thể loại game mà character bay được (như đề cập ở trên) nhưng nếu họ làm vậy thì giải quyết ra sao ? ^^
     
  17. Thachsanh

    Thachsanh Dragon Quest

    Tham gia ngày:
    27/6/03
    Bài viết:
    1,436
    Cái này sẽ phụ thuộc vào map design. Map design cho khéo thì các mép của map sẽ có các vật cản không vượt qua được như vách núi cao thẳng đứng hay tương tự. Nếu mà làm collision với skybox là design map dở. Do đó khi bay hay khi dùng các loại thú cưỡi khác người chơi phải bắt buộc bay qua hay chạy qua các điểm zone point. Đến điểm này thì cứ load map khác rồi đặt người chơi và thú cưỡi ngay tại zone point phía bên kia, thế thôi. Everquest, Everquest 2, hay Final Fantasy XI đều giải quyết theo kiểu này, zone cả người lẫn thú. Nếu thích thú về zone based MMORPG thì nên nghiên cứu Final Fantasy XI, zone design và zone load đều hơn hẳn so với các zone based game khác kể cả hàng khủng là EverQuest 2.
     
  18. gevf

    gevf Youtube Master Race

    Tham gia ngày:
    14/6/03
    Bài viết:
    97
    Nơi ở:
    HN
    Trong MMO thì không có khái niệm 1 server. Có nhiều loại server như login/auth server, patch server, db server, master server, logs server, và zone server. Chúng ta đang nói đến zone servers. Có thể là 1 server chứa nhiều zone như A.B vừa đề cập, nhưng cũng có thể là nhiều server chứa nhiều zone, và cứ phân cấp như vậy để cân bằng tải, và như vậy thì ko có chuyện full, là mô hình lý tưởng của MMO.

    Trong trường hợp đó, người ta phải xử lý việc giáp ranh giữa 2 zone. Trong vùng giáp ranh (2 server có chung zone) thì phải làm mirror để cho nhân vật ở zone/server này có thể nhìn/tác động đến nhân vật ở zone/server khác.

    Như thachsanh nói về "dynamic terrain", đó chỉ là quản lý ở phía client về diễn họa. Ngoài ra việc chia zone hoặc paging còn phải quản lý về các đối tượng nữa, cái đó phụ thuộc nhiều về phía server, mà server thì ko quan tâm lắm đến terrain, fog hay skybox, chỉ quan tâm đến sự phân chia giữa chúng hay còn gọi là "spatial".
     
  19. gevf

    gevf Youtube Master Race

    Tham gia ngày:
    14/6/03
    Bài viết:
    97
    Nơi ở:
    HN
    Một game vừa có zone vừa có chuyển cảnh rất mịn là Lineage2. Có thể sử dụng teleport để biến qua các zone (bản đồ của nó rất rộng lớn), cũng có thể chạy bộ từ vùng này đến vùng khác mà hầu như ko bị phát hiện chuyển vùng. Tuy nhiên vẫn có 2 vùng không thể chạy bộ tới được, mặc dù chúng rất nhỏ, là do thiết kế ban đầu, đó là vùng của người lùn và người orc.

    Bản đồ các vùng teleport của Lineage2 C2:
    http://l2dc.onlinewelten.com/images/c2/c2map.jpg

    Ngoài ra, khi làm bản đồ còn phải chú ý đến terrain và BSP. Terrain là vùng rộng lớn mà thường được định nghĩa bằng heightmap. Vì sử dụng heightmap nên ta thấy các vùng núi dốc đứng thường bị biến dạng bề mặt texture, vì nó thường vẽ theo kiểu lợp mái bằng, dốc đứng chịu chết. Còn các vùng cục bộ như lâu đài, hang động v.v... thì không thể làm theo heightmap được nên thường sử dụng BSP chẳng hạn. Do đó khi vẫn ở trong 1 zone nhưng chuyển cảnh từ ngoài terrain vào trong hang động cũng vẫn phải lưu ý coi như chuyển 2 zone.

    Cũng vì lý do lịch sử như thế mà ở phần đảo human trong Lineage2, kỹ thuật chuyển cảnh hồi đó còn kém, muốn vào hang động cũng phải teleport mới vào được.
     
  20. Thachsanh

    Thachsanh Dragon Quest

    Tham gia ngày:
    27/6/03
    Bài viết:
    1,436
    Cái này hoàn toàn tùy thuộc vào engine. Không phải engine nào cũng dùng BSP. Heightmap là kỹ thuật sử dụng lúc build terrain chứ không liên quan gì đến lúc engine vẽ terrain ra. Texture bị biến dạng là do người dựng map dở không chỉnh UVW lại cho đúng và không dùng texture blending một cách hợp lý.
     

Chia sẻ trang này