คำถามติดแท็ก multithreading

Multithreading อนุญาตให้มีหลายเธรดอยู่ในบริบทของกระบวนการเดียวที่แชร์ทรัพยากรเดียวกัน แต่สามารถดำเนินการได้อย่างอิสระ

2
การเคลื่อนไหวนั้นขึ้นอยู่กับอัตราเฟรมแม้จะใช้ Time.deltaTime
ฉันมีรหัสต่อไปนี้เพื่อคำนวณการแปลที่จำเป็นในการย้ายวัตถุเกมใน Unity ซึ่งเรียกว่าLateUpdateมา จากสิ่งที่ฉันเข้าใจการใช้งานของฉันTime.deltaTimeควรจะทำให้เป็นอิสระแปลสุดท้ายอัตราเฟรม (โปรดทราบCollisionDetection.Move()เป็นเพียงการแสดง raycasts) public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If …

5
สไปรท์ในฐานะนักแสดง
ฉันไม่ได้มีประสบการณ์ในคำถามการพัฒนาเกม แต่เป็นโปรแกรมเมอร์ ในภาษาสกาล่าคุณสามารถปรับขยายการทำงานแบบมัลติทาสกิ้งกับนักแสดงได้อย่างมั่นคงในขณะที่ฉันได้ยิน คุณสามารถมีหลายแสนคนทำงานพร้อมกันโดยไม่มีปัญหา ดังนั้นฉันคิดว่าบางทีคุณสามารถใช้สิ่งเหล่านี้เป็นคลาสพื้นฐานสำหรับ 2D-Sprites เพื่อแยกสิ่งลูปเกมที่ต้องผ่านสไปรต์ทั้งหมดและย้ายพวกเขา โดยพื้นฐานแล้วพวกเขาจะย้ายตัวเองขับเคลื่อนเหตุการณ์ นั่นจะสมเหตุสมผลสำหรับเกมหรือไม่? หากมีหลายภารกิจเช่นนั้น ท้ายที่สุดมันจะทำงานบน JVM แม้ว่าจะไม่เป็นปัญหามากในปัจจุบัน แก้ไข: หลังจากเล่นน้ำไปซักพักผมสังเกตเห็นว่ามีข้อได้เปรียบเพียงข้อเดียวที่แท้จริงสำหรับแนวคิดนี้: การสนับสนุนมัลติคอร์ เกมวนง่ายจะทำงานบนแกนเดียวเท่านั้นและจะทำงานทุกอย่างตามลำดับ ตั้งแต่คอมพิวเตอร์สมัยใหม่แม้ที่บ้านทุกวันนี้มีคอร์ในตัวตั้งแต่สองคอร์ขึ้นไปฉันคิดว่ามันเป็นความคิดที่ดีที่จะช่วยให้โปรแกรมเมอร์เกมสามารถใช้คอร์อื่นได้อย่างมีประสิทธิภาพ ท้ายที่สุดฉันคิดว่าโดยปกติผู้เล่นจะมีเพียงเกมที่ทำงานบนเครื่องแปดหลักของเขาเท่านั้นดังนั้นทำไมไม่ ข้อได้เปรียบอื่น ๆ ที่ฉันเห็นคือใน Scala คุณสามารถมีRemoteActorsซึ่งสามารถได้รับการปฏิบัติในลักษณะเดียวกัน แต่ทำงานบนคอมพิวเตอร์เครื่องอื่น ดังนั้นนี่อาจทำให้การเล่นเกมบนเครือข่ายง่ายขึ้นเช่นกัน ฉันตั้งใจจะสร้างสิ่งนั้นลงในเอ็นจิ้น Scala 2D ของฉันโดยเร็วที่สุด

1
กราฟฉากในเธรดแยกกัน
ฉันพัฒนาโปรแกรมเกมของตัวเองเพื่อความสนุก (แต่ไม่หวังผลกำไร) ฉันมีการแสดงผลในหนึ่งเธรดและกราฟฉากของฉันอัปเดต (ความเร็ว ฯลฯ ) ในอีกอันหนึ่ง เมื่อถึงเวลาที่จะแสดงผลเธรดการแสดงผลจะเพิ่มโหนดที่มองเห็นให้กับบัฟเฟอร์เชิงเส้นใหม่และข้ามไป รายละเอียดเพิ่มเติมกราฟฉากของฉันถูกแบ่งเป็นสามส่วน แต่ละโหนดในกราฟฉากของฉันมีสามชุดของเมทริกซ์การแปลงแบบสัมพัทธ์และสัมบูรณ์ (4x4) ณ เวลาใดเวลาหนึ่งจะมีการคัดลอกหนึ่งชุดโดยเธรดกราฟฉากหนึ่งชุดจะถูกอ่านโดย renderer และชุดที่สามมีอยู่เพื่อให้ผู้อ่านหรือนักเขียนสามารถย้ายไปยังหน้าถัดไปได้โดยไม่ต้องรออีกชุดหนึ่ง สิ่งนี้จะช่วยป้องกันการเขียนไปยังบางสิ่งในขณะที่กำลังแสดงผลและจากการแสดงกราฟฉากที่อัปเดตครึ่ง ยังไงก็เถอะฉันก็ได้สำเนาที่สี่ของแต่ละเมทริกซ์เพื่อให้ผู้ใช้ทำงานด้วยเพื่อไม่ให้ขัดแย้งกับเธรดการอัพเดต ดูเหมือนว่าจะทำงานได้ดีโดยหลีกเลี่ยงการซิงโครไนซ์ตลอดเวลา อย่างไรก็ตามนี่เป็นระเบียบ นี่คือเป้าหมายสูงสุดของฉันสำหรับระบบ: กราฟแสดงผลและการอัปเดตจะอยู่ในชุดข้อความแยกกัน ลดจำนวนเธรดเหล่านี้ให้เล็กลง อย่าแสดงฉากที่ได้รับการอัปเดตครึ่งทางโดยชุดอัพเดท สิ่งนี้จะสังเกตเห็นได้ชัดเจนเป็นพิเศษหากกล้องกำลังเคลื่อนไหวอย่างรวดเร็วและบางครั้งก็แสดงผลก่อนหรือหลังการอัพเดต การใช้งานหน่วยความจำลดลง ฉันมีเมทริกซ์ต่อโหนดมากเกินไป ฉันกำลังพิจารณาที่จะย้ายไปที่เวกเตอร์สำหรับตำแหน่ง / การหมุน / มาตราส่วนเนื่องจากการเพิ่มจุดลอยตัวด้วยเมทริกซ์ ความสามารถในการจัดการหมื่นโหนด ระบบปัจจุบันทำได้ดีพอสมควร ฉันหวังว่าจะรวม Bullet (เอนจิ้นฟิสิกส์) และการสร้างเครือข่ายในอนาคตซึ่งฉันไม่ได้คิดมาก มีวิธีใดบ้างที่จะทำให้กราฟซีนดีขึ้น

2
อัพเดตและแสดงผลในเธรดแยกกัน
ฉันกำลังสร้างเอ็นจิ้นเกม 2D ง่าย ๆ และฉันต้องการอัปเดตและแสดงสไปรต์ในชุดข้อความต่างๆเพื่อเรียนรู้วิธีการทำงาน ฉันต้องการซิงโครไนซ์เธรดการอัพเดทและเรนเดอร์หนึ่ง ปัจจุบันฉันใช้แฟล็กอะตอมสองอัน เวิร์กโฟลว์มีลักษณะดังนี้: Thread 1 -------------------------- Thread 2 Update obj ------------------------ wait for swap Create queue ---------------------- render the queue Wait for render ------------------- notify render done Swap render queues ---------------- notify swap done ในการตั้งค่านี้ฉัน จำกัด FPS ของเธรดการแสดงผลเป็น FPS ของเธรดการปรับปรุง นอกจากนี้ฉันใช้sleep()เพื่อ จำกัด ทั้งเรนเดอร์และอัปเดต FPS ของเธรดเป็น …

2
จะรอการดำเนินการ async / coroutines ได้อย่างไร
ฉันกำลังมองหาวิธีทั่วไป / นำมาใช้ซ้ำเพื่อรอ coroutines และการดำเนินการแบบอะซิงโครนัสให้เสร็จใน Unity 5 คล้ายกับawaitคำสำคัญของ C # 5 วิธีที่ง่ายที่สุดที่ฉันนึกได้ก็คือ: public class SomeUtility { public bool IsDoingSomething { get; private set; } public IEnumerator DoSomethingAsync() { IsDoingSomething = true; yield return new WaitForSeconds(2); IsDoingSomething = false; } } และจากนั้นใน coroutine อื่น: while(!someUtilityInstance.IsDoingSomething) yield return null; อย่างไรก็ตามมันไม่ได้ดีมากเพราะมันจะตัดโค้ดที่มีwhileคำสั่งไม่สามารถใช้ซ้ำได้ (ต้องการอินสแตนซ์และคลาสเฉพาะแม้กระทั่งสำหรับฟังก์ชั่นยูทิลิตี้ง่าย ๆ …

3
แยกการอ่าน / การคำนวณ / การเขียนอย่างมีประสิทธิภาพสำหรับการประมวลผลพร้อมกันของเอนทิตีในระบบ Entity / Component
ติดตั้ง ฉันมีสถาปัตยกรรมเอนทิตีคอมโพเนนต์ที่เอนทิตีสามารถมีชุดของคุณลักษณะ (ซึ่งเป็นข้อมูลที่บริสุทธิ์โดยไม่มีพฤติกรรม) และมีระบบที่ใช้ตรรกะเอนทิตีซึ่งทำงานกับข้อมูลนั้น เป็นหลักในรหัสหลอกบ้าง: Entity { id; map<id_type, Attribute> attributes; } System { update(); vector<Entity> entities; } ระบบที่เพิ่งเคลื่อนที่ไปตามเอนทิตีทั้งหมดในอัตราคงที่อาจเป็น MovementSystem extends System { update() { for each entity in entities position = entity.attributes["position"]; position += vec3(1,1,1); } } เป็นหลักฉันพยายามขนาน update () อย่างมีประสิทธิภาพที่สุด สิ่งนี้สามารถทำได้โดยการรันทั้งระบบในแบบคู่ขนานหรือโดยการให้แต่ละการอัปเดต () ของระบบหนึ่งมีส่วนประกอบสองส่วนเพื่อให้เธรดที่แตกต่างกันสามารถดำเนินการอัปเดตระบบเดียวกันได้ แต่สำหรับชุดย่อยอื่น ปัญหา ในกรณีของระบบการเคลื่อนไหวที่แสดงการขนานกันนั้นเป็นเรื่องเล็กน้อย เนื่องจากเอนทิตีไม่ได้พึ่งพาซึ่งกันและกันและไม่แก้ไขข้อมูลที่แชร์เราจึงสามารถย้ายเอนทิตีทั้งหมดในแบบคู่ขนาน อย่างไรก็ตามบางครั้งระบบเหล่านี้ต้องการให้เอนทิตีโต้ตอบกับ …

1
จะใช้แอพพลิเคชั่น OpenGL แบบมัลติเธรดเพื่ออัพเดต VBOs และใช้งานพร้อมกันได้อย่างไร?
ฉันมีแอพพลิเคชั่นที่เรียบง่าย มันมีสองกระทู้แต่ละคนมีบริบทการแสดงผลของตัวเอง แต่พวกเขาแบ่งปัน VBO หนึ่ง (นี้ใช้งานได้ผมทดสอบมัน) ตอนนี้สิ่งที่ฉันต้องการ: หนึ่งเธรดกำลังแสดงผลข้อมูลบางส่วนจากครึ่งแรกของ VBO และเธรดที่สองกำลังอัปเดตส่วนที่สองของ VBO เมื่อฉันไม่อัปเดต VBO มันก็ใช้ได้ดี แต่ฉันมีปัญหาแปลก ๆ บางอย่างเมื่ออัปเดต เมื่อฉันใช้glMapBufferเพื่ออัปเดต VBO (ในเธรดที่สอง), ในเธรดแรก, โดยส่วนใหญ่, มันไม่มีการแสดงผลใด ๆ - ทั้งหน้าจอนั้นชัดเจน (หลังจากการglClearโทร) ดูเหมือนว่าจะไม่สามารถสัมผัสข้อมูลจาก VBO (เป็นที่เข้าใจได้เพราะบัฟเฟอร์ทั้งหมดถูกแมปและดังนั้นจึงสามารถล็อคได้อย่างใด) ผมพยายามที่จะใช้ซึ่งการใช้งานglMapBufferRange GL_MAP_UNSYNCHRONIZED_BITนี่ควรหมายความว่า "อย่ารอและใช้ VBO ตามที่คุณต้องการฉัน (โปรแกรม) จะซิงโครไนซ์ด้วยตนเอง" นอกจากนี้เมื่อฉัน map ช่วงของ VBOs และแสดงผลข้อมูลจากส่วนอื่นก็ไม่ควรจะรอ glMapBufferแต่ฉันประสบปัญหาเดียวกับผมด้วย ใครสามารถช่วยฉันแก้ไขหรืออธิบายได้ว่าทำไมมันถึงเกิดขึ้น

2
UDP ที่ไม่บล็อกหรือแยกเธรดสำหรับรับ
ฉันกำลังสร้างเกมผู้เล่นหลายคน (สำหรับผู้เล่นอายุต่ำกว่า 64 ปี) ฉันตัดสินใจที่จะมีเธรดแยกต่างหากสำหรับลูปเครือข่าย แต่ฉันสงสัยว่ามันจะดีกว่าถ้าจะสร้างเธรดพิเศษสำหรับรับ UDP หรือตั้งซ็อกเก็ตการรับบนการไม่บล็อก (ไม่มีเธรดพิเศษ) หรือจะเป็นการดีกว่าถ้าใช้วิธีอื่นเช่น Asynchronous Sockets ยินดีต้อนรับวิธีการที่ดีกว่าเสมอ!

5
ทำไมฉันไม่สามารถใช้โอเปอเรเตอร์ '> =' กับ Vector3s ได้
ฉันพยายามที่จะได้รับรูปสี่เหลี่ยมผืนผ้าย้ายไปมาระหว่างสองตำแหน่งที่ผมพูดถึงและ_positionA ทั้งสองประเภท_positionB Vector3สี่เหลี่ยมผืนผ้าเคลื่อนไหวได้ดี อย่างไรก็ตามเมื่อมันมาถึง_positionBมันจะไม่เคลื่อนที่ในทิศทางตรงกันข้ามเหมือนอย่างที่ควร ฉันกลับไปที่โค้ดเพื่อดู ฉันมาถึงข้อสรุปว่าเป็นวัตถุย้ายที่ifงบในรหัสพลาดเฟรมซึ่งในตำแหน่ง rects _positionBเท่ากับ ฉันตัดสินใจที่จะปรับเปลี่ยนรหัสไปในทิศทางที่ตรงกันข้ามถ้าตำแหน่ง rects คือมากกว่าหรือเท่ากับ _positionBรหัสของฉันไม่ยาวเกินไปดังนั้นฉันจะแสดงด้านล่าง: using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

1
เหตุใด V8 จึงไม่ทำงานกับเธรด SDL
ฉันสามารถคอมไพล์และเชื่อมโยง V8 กับเกมของฉันและการตีความโค้ดทำงานได้ดี อย่างไรก็ตามฉันต้องการแบ่งรหัสของฉันและลูปเกมควรมีอยู่ในเธรดเดียวและเอ็นจิ้นการเขียนสคริปต์ควรรันในเธรดที่สองข้างลูปเกมของฉัน ฉันใช้ SDL และลองใช้รหัสนี้เพื่อวางไข่เธรดใหม่ SDL_CreateThread(ScriptingEngine::SpawnMain, NULL); ที่รหัสต่อไปนี้เป็นเครื่องมือทดสอบสคริปต์ของฉัน: namespace ScriptingEngine { v8::HandleScope handleScope; v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); v8::Persistent<v8::Context> context; void Setup() { // TODO: bind functions to global // ... context = v8::Context::New(NULL, global); } int SpawnMain(void *arguments) { v8::Context::Scope scope(context); v8::Handle<v8::Script> script = v8::Script::Compile( v8::String::New("'Hello World'") ); …

3
หัวข้อ Android มีปัญหาห่อหัวของฉันไปรอบ ๆ การออกแบบ
ฉันมีปัญหาในการพันหน้าออกแบบเกม บนแพลตฟอร์ม Android ฉันมีกิจกรรมและตั้งค่ามุมมองเนื้อหาด้วยมุมมองพื้นผิวที่กำหนดเอง มุมมองพื้นผิวที่กำหนดเองทำหน้าที่เป็นพาเนลของฉันและฉันสร้างอินสแตนซ์ของคลาสทั้งหมดและทำรูปวาดและการคำนวณทั้งหมดในนั้น คำถาม: ฉันควรสร้างอินสแตนซ์ของคลาสอื่นในกิจกรรมของฉันแทนหรือไม่ ตอนนี้ฉันสร้างคลาสเธรดที่กำหนดเองที่จัดการลูปเกม คำถาม: ฉันจะใช้คลาสนี้ในทุกกิจกรรมได้อย่างไร หรือฉันจะต้องสร้างอินสแตนซ์ที่แยกต่างหากของคลาสเธรดเสริมแต่ละครั้งหรือไม่ ในเกมก่อนหน้าของฉันฉันมีหลายระดับที่ต้องสร้างอินสแตนซ์ของคลาสเธรดและในคลาสของเธรดที่ฉันต้องตั้งค่าวิธีการสร้างสำหรับแต่ละระดับที่แยกจากกันและในลูปใช้คำสั่งสลับเพื่อตรวจสอบระดับที่ต้องการแสดง และอัปเดต ขออภัยหากฟังดูสับสน ฉันแค่อยากรู้ว่าวิธีที่ฉันใช้นั้นไม่มีประสิทธิภาพ (ซึ่งน่าจะเป็น) และวิธีออกแบบให้ถูกวิธี ฉันได้อ่านแบบฝึกหัดมากมายที่นั่นและฉันยังคงมีปัญหามากมายกับหัวข้อนี้โดยเฉพาะ อาจจะเชื่อมโยงไปยังบทเรียนบางอย่างที่อธิบายเรื่องนี้? ขอบคุณ

1
XNA: เธรดทำงานอย่างไร
ฉันต้องการนำเธรดมาใช้ในเกม XNA ของฉัน แต่ฉันไม่แน่ใจว่าสิ่งต่าง ๆ ทำงานได้อย่างไรเมื่อรวบรวมสำหรับ XBOX 360 ใครบางคนสามารถอธิบายรายละเอียดเกี่ยวกับเรื่องนี้ได้? ตัวอย่างเช่น XBOX รองรับหลายเธรด? ฉันรู้ว่า XNA ใช้ Compact Framework รุ่นพิเศษ สิ่งนี้มีผลต่อรหัสในระหว่างการพัฒนาอย่างไร ฉันใช้สิ่งต่าง ๆ เมื่อพัฒนาสำหรับ XBOX มากกว่า Windows หรือไม่ ขอบคุณ.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.