อัญมณีเฉพาะเกมที่คุณชอบคืออะไร? [ปิด]


24

ฉันจะเริ่มด้วยJohn Carmack'sรูทสแควร์รูทแบบเร็วใน Quake III:

float Q_rsqrt(float number) {

  long i;
  float x2, y;
  const float threehalfs = 1.5F;

  x2 = number * 0.5F;
  y = number;
  i = * ( long * ) &y;
  i = 0x5f3759df - ( i >> 1 );
  y = * ( float * ) &i;
  y = y * ( threehalfs - ( x2 * y * y ) );

  return y;

}

6
นั่นไม่ใช่คำถาม - อย่างน้อยที่สุดคุณอาจประกาศหน้าวิกิชุมชนนี้ ...
Rachel Blum

เสร็จสิ้นชุมชนเป็นศูนย์กลาง
gak

3
สกรูที่! เพียงไปกับรหัสใด ๆ ที่สร้างขึ้นโดย JC ที่ยอดเยี่ยม!
Adam Naylor

3
โดยวิธีการที่จะทราบว่ามี "จำนวนมายากล" ที่ถูกต้องมากขึ้นที่จะใช้ในฟังก์ชั่นสแควร์รูตแบบผกผันอย่างรวดเร็ว: 0x5f375a86 ( en.wikipedia.org/wiki/ … )
Ricket

8
โปรดทราบด้วยว่าไม่ใช่ของ John Carmack
Kaj

คำตอบ:


25

ฟังก์ชั่น mapValue:

float mapValue( float inVal, float inFrom, float inTo, float outFrom, float outTo )
{
    float inScale = (inFrom != inTo) 
        ? ( ( inVal - inFrom ) / ( inTo - inFrom ) ) 
        : 0.0f;
    float outVal = outFrom + ( inScale * ( outTo - outFrom ) );
    outVal = (outFrom < outTo ) 
        ? clamp( outVal, outFrom, outTo ) 
        : clamp( outVal, outTo, outFrom );
    return outVal;
}

มันต้องใช้ค่าแปลงเป็นสัดส่วนภายในช่วงจากนั้นปรับขนาดที่สัมพันธ์กับช่วงอื่น เช่นเดียวกับ lerp คู่

คุณสามารถใช้มันเพื่อทำให้ปกติเป็นปกติ:

float minDamage = 0.0f; float maxDamage = 300.0f;
float normalisedDamage = mapValue(damange, minDamage, maxDamage, 0.0f, 1.0f);

หรือคุณสามารถแปลงจากช่วงหนึ่งไปอีกช่วงหนึ่ง:

float brakeStrength = mapValue(timeToCollision, 
    0.0f, 10.0f, // seconds
    1.0f, 0.2f // brake values 
    );

ขอให้สังเกตในตัวอย่างที่สองว่าช่วงออกเป็นลำดับที่แตกต่างกันไปในช่วง

มันดูไม่มากนัก แต่ฉันใช้ไอ้หนูน้อยตัวนี้ไปทั่วสถานที่


14

ฉันยังไม่อยากเชื่อเลยว่าฉันใช้ทฤษฎีบทพีทาโกรัสในรหัสเกมของฉันกี่ครั้ง สำหรับฉันสูตรง่ายๆนี้เป็นอัญมณีในการพัฒนาเกม

a ^ 2 + b ^ 2 = c ^ 2
(ที่มา: mathurl.com )

หรือ

ข้อความแสดงแทน
(ที่มา: mathurl.com )

และเมื่อระยะห่างสัมพัทธ์มีความสำคัญก็สามารถใช้งานได้โดยไม่ต้องใช้การทำงานของรากที่มีราคาแพง

ข้อความแสดงแทน
(ที่มา: mathurl.com )


เอาเถอะคณิตศาสตร์ Pythagorean นั้นถูกใช้มากกว่ารหัสเกมโดยเฉพาะเอ็นจิ้นต่างๆเช่นรหัสฟิสิกส์รหัสการแสดงผล AI
Nick Bedford

1
จริง นั่นเป็นเหตุผลที่มันเป็นอัญมณี ;)
MrValdez

4
รูปแบบที่น่าสนใจคือเมื่อคุณสนใจเฉพาะระยะทางสัมพัทธ์ จากนั้นคุณสามารถข้ามอาจมีราคาแพงโทรและก็คำนวณsqrt distance2 = x^2 + y^2
mmyers

@mmyers - อีกสิ่งที่ยอดเยี่ยม: ถ้าคุณกำลังทำงานในพื้นที่ x ^ 2 ระยะทางไม่ได้เป็นเพียงแค่ญาติ
Steven Evers

ขอบคุณที่กล่าวถึงบิตระยะทางสัมพัทธ์ ฉันได้เห็นวิธีการดำเนินการรากที่ไม่จำเป็นมากเกินไปเช่นเดียวกับผู้ใช้ A * เมื่อพวกเขาควรจะใช้สิ่งที่แน่นอนน้อยลง
Ricket

13

หนึ่งที่ใหญ่ที่สุดจากฉันคือการอ่านเกี่ยวกับระบบ GameObject ของ Scott Bilas แม้ว่าฉันจะไม่ใช้ระบบฐานข้อมูลเหมือนที่เคยทำ แต่ก็ทำให้ฉันหยุดการสร้างแผนภูมิการสืบทอด 6 ระดับและทำให้ฉันสร้างระบบส่วนประกอบที่สามารถจัดการได้และนำกลับมาใช้ใหม่ได้มากขึ้น


10

ฉันต้องไปกับอุปกรณ์ของดัฟฟ์ มันเป็นบล็อคแรกของโค้ดที่ทำให้กรามของฉันหล่น "คุณทำอย่างนั้นได้?!?"


โอ้พระเจ้า. แว่นตา! พวกเขาไม่ทำอะไรเลย!
Raoul

"do-while" ที่ซ้อนกันอยู่ใน "switch-case" ทำให้ฉันกระพริบตาอยู่เสมอ แม้กระทั่ง 20 ปีต่อมา ...
Andreas

1
-1 ฉันไม่ชอบอันนี้ ในวันนี้ไม่ได้มีประโยชน์มาก (คุณจะใช้memcpyแทนถ้าคุณต้องการให้คนอื่นสามารถอ่านรหัสของคุณ)
bobobobo

1
@ JoeWreschnig ทำไมไม่ Memcpy จะสามารถอ่านได้พกพาและเพิ่มประสิทธิภาพมากขึ้นเสมอ
kaoD

1
@kaoD: เนื่องจาก memcpy ไม่เทียบเท่ากับอุปกรณ์ของ Duff - มันไม่สำคัญว่าจะ "อ่านได้พกพาและปรับให้เหมาะสมกว่า" เพราะถ้ามันไม่ทำแบบเดียวกัน! ท่อ CPU โมเดิร์นอาจจะทำได้ดีกว่าโดยไม่ต้องอุปกรณ์ดัฟฟ์กว่าด้วยเพราะการคาดการณ์และการสอนสาขาแคช แต่ที่มีอะไรmemcpyจะทำอย่างไรกับ

7

ตัวอย่างโค้ด C / C ++ ขนาดเล็กจากเกมที่ฉันช่วยเขียนหลายปีหลัง:

(fill ? FillRect : DrawRect) (x, y, w, h, colour);

ในเกมแรกของฉัน ( นี้ ) ฉันต้องการเข้าถึง RAM มากกว่า 1Mb และสิ่งนี้เป็นก่อนที่อินเทอร์เน็ตจะถูกปิดฉันไม่มีเอกสารสำหรับ XMS และ EMS ที่แอป DOS ใช้เพื่อเข้าถึง RAM เพิ่มเติม

ดังนั้นฉันจึงลงเอยด้วยการใช้ 'แบ็คดอร์' ตัวเล็กที่ให้ความสำคัญกับ 386 สำหรับการลงทะเบียนเซกเมนต์ โดยปกติในโหมดจริงที่อยู่จะคำนวณตามseg*16+offที่ จำกัด คุณไว้ที่ 1Mb

อย่างไรก็ตามคุณสามารถเปลี่ยนเป็นโหมดที่ได้รับการป้องกันตั้งค่าเซ็กเมนต์เป็นแอดเดรส 4Mb สลับกลับและหากคุณไม่ได้เขียนลงทะเบียนเซ็กเมนต์ (ซึ่งก็โอเคเนื่องจาก DOS ใช้การลงทะเบียนเซ็กเมนต์ 8086 เท่านั้น) คุณสามารถเข้าถึงทั้งหมดได้ 4Mb เป็นพื้นที่แอดเดรสแบบแฟลต การพลิกกลับเป็นโหมดจริงนั้นเป็นสิ่งจำเป็นหากคุณต้องการใช้บริการ DOS

ไม่มีตัวขยาย DPMI จำนวนมากที่มีอยู่


เกือบทำงานใน C # (คุณจำเป็นต้องประกาศประเภทผู้รับมอบสิทธิ์และแทรกอย่างน้อยหนึ่งหล่อ)
finnw

คุณหมายถึงว่าด้วยโหมดการระบุที่อยู่ 32 บิตในโหมดจริง? (เช่นต้องการคำนำหน้าขนาดที่อยู่) คุณแน่ใจหรือว่าจำเป็นต้องตั้งค่าตัวอธิบายส่วนและไม่ได้ใช้การลงทะเบียนกลุ่มตามปกติ 16 * FS + ตามที่ระบุ ฉันไม่คิดว่าเซ็กเมนต์จะมีข้อ จำกัด ในโหมด 16 บิตเพียงที่อยู่พื้นฐาน (16 * ค่าของพวกเขา) ดังนั้นคุณไม่สามารถตั้งค่า FS เป็นบางสิ่งในโหมด 16 บิตและใช้[fs:esi]หรืออะไรก็ตามที่คุณเข้าถึง ต้องการ?
Peter Cordes

ฉันยังไม่ได้ลองหรือเขียนรหัสจริงสำหรับโหมด 16 บิตเพียง 32 และ 64 บิต asm แต่ฟังดูแปลก ๆ อืมน่าจะเป็นไปได้ ซีพียูสมัยใหม่ทำหน้าที่แบ่งเซ็กเมนต์ภายในอย่างแน่นอนและโหลดแคชเหล่านั้นใหม่เมื่อคุณเขียนไปยังเซ็กเมนต์ regs ดังนั้นนั่นอาจเป็นวิธีที่มันรักษาฐาน + ข้อ จำกัด ของโหมดการป้องกันไว้ (ถ้าเป็นสิ่งที่เกิดขึ้นจริงและคุณไม่ได้ 4MB เริ่มต้นที่ 16 * FS)
Peter Cordes

5

โดยส่วนตัวฉันเป็นแฟนตัวยงของ Mersenne Twister สำหรับตัวเลขสุ่มที่คาดเดาได้โดยเฉพาะถ้าคุณต้องการสร้างอินสแตนซ์ต่าง ๆ ของ Rand

http://en.wikipedia.org/wiki/Mersenne_twister


Mersenne Twister นั้นดีในแง่ที่ว่ามันเป็นตัวสร้างตัวเลขสุ่มที่ดี แต่มันก็ไม่ได้สวยงามหรือเท่ห์ เพื่อที่คุณอาจต้องการที่จะดูที่en.wikipedia.org/wiki/Rule_30

1
โดยทั่วไปจะดีกว่า MT สำหรับการใช้งานส่วนใหญ่ .. en.wikipedia.org/wiki/Well_equidistributed_long-period_linear
Jari Komppa

5

ต่อไปนี้เป็นหนึ่งที่กล่าวถึงโดย Chris Crawford (และเห็นได้ชัดว่าใช้โดย Atari) ซึ่งเขาเรียกว่า 'A Graphics Trick':

LDA FIRST
EOR SECOND
AND CONTROL
EOR SECOND
STA OUTPUT

อ่านบทความเต็มสำหรับคำอธิบาย


1
ลิงค์นั้นเสียแล้วดังนั้นมันจะช่วยให้มีคำอธิบายที่นี่
finnw

ขอบคุณ เขาไปแล้วและเปลี่ยนเว็บไซต์ของเขาอีกครั้ง ฉันอัพเดทลิงค์
แอนโธนี

4

ด้วยเหตุผลบางอย่างผู้คนมักจะลดพลังของรูปแบบการออกแบบในเกม ฉันเห็นรูปแบบ GoF เกือบทุกรูปแบบที่นำไปใช้กับความสำเร็จของเกม


1
สิ่งหนึ่งที่ฉันชอบเกี่ยวกับการเขียนโปรแกรมเกมคือการหลีกหนีจากวิธี GoF มาตรฐานของ "ความถูกต้อง" และเพียงมุ่งเน้นที่ความเร็วที่น่ารักบริสุทธิ์! ที่กล่าวว่าฉันได้เห็นการใช้งาน MVC ที่ไม่ดีจำนวนมากในเกมซึ่งทำอันตรายมากกว่าดี
เลน

ฉันคิดว่ารูปแบบการออกแบบมีที่ของพวกเขา ไม่มากในเกมแม้ว่า
blissfreak

@blissfreak: ไม่มีอะไรพิเศษเกี่ยวกับการเขียนโปรแกรมเกมที่ทำให้มันเป็นป่าตะวันตกที่รูปแบบไม่เหมือนกัน มันเป็นเรื่องธรรมดาที่น่าขันและนี่คือตัวอย่างบางส่วน
Steven Evers

4

Math.atan2 () มีประโยชน์อย่างมาก (พร้อมด้วยตรีโกณมิติทั้งหมด)


มันคือเอ้ย! ฉันทำ 3D เป็นจำนวนมากและไม่ต้องการมันจริงๆ
Skizz

+1 เป็นวิธีเดียวที่จะเปลี่ยนจากองค์ประกอบเวกเตอร์ x + y ไปยังทิศทางเรเดียน
RCIX

1
@ RCIX: จุดของฉันคือการแปลงที่ไม่จำเป็นเช่น (x, y) -> มุมมีเวกเตอร์วิธีการแก้ปัญหามุมใด ๆ
Skizz

6
ฉันจะไม่เรียกฟังก์ชั่นไลบรารี่มาตรฐานว่า "อัญมณี"

1
@Skizz: อาจจะเป็นแบบ 3 มิติ แต่ฉันไม่รู้วิธีอื่นที่จะใช้เวกเตอร์ที่ทำให้เป็นมาตรฐานและดึงค่าทิศทางเรเดียน ซึ่งเป็นค่าที่ดีในเกม 2D
RCIX

3

เพื่อเพิ่มอัญมณีพีทาโกรัสด้านบน ...
ฉันมักจะบอกคนอื่นว่าสำหรับการเขียนโปรแกรม 3 มิติที่พวกเขาต้องการเพียงรู้ว่า:
- a ^ 2 + b ^ 2 = c ^ 2
- soscastoa (บาป = ด้านตรงข้าม / ด้านข้างเอียง, cos = ด้านที่แนบ / ด้านที่ลาดเอียง, tan = ด้านตรงข้าม / ด้านที่แนบ)
- b = | a | * | b | * cos alpha
- a * b = | a | * | b | * sin alpha * vector vector
มันสามารถแก้ปัญหา 3 มิติ (หรือ 2d) ใด ๆ ที่คุณพบในการพัฒนาเกม - 4 กฎ
แน่นอนว่ามีวิธีที่ดีกว่า แต่สิ่งนี้สามารถแก้ปัญหาทั้งหมดได้ - ฉันควรรู้ฉันเป็นแฮ็คที่ขึ้นอยู่กับอาชีพของพวกเขา


5
Re: soscastoa ฉันคิดว่าคนส่วนใหญ่รู้ว่าเป็น sohcahtoa (แทนที่ 'ลาดด้าน' ด้วยความเฉพาะเจาะจงมากขึ้นถ้ายอมรับชัดเจนมากขึ้น 'ด้านตรงข้ามมุมฉาก') ไหลออกจากลิ้นได้ง่ายขึ้นและฉันคิดว่าง่ายต่อการจดจำ
Asmor

1
ฉันมักจะชอบ 'The Old Arab Sat กับอูฐและโหยหวนของเขา' ตั้งแต่มัธยม (อายุมัธยม) มันถูกตราตรึงอยู่บนสมองของฉัน
George Duckett

นอกจากนี้ยังมี " SโอมO LD H Ippy C AME ครั้งHโฆษณาTฉีกO n cid"
blissfreak

3

หนึ่งในรายการโปรดของฉันคือ 'Life' เวอร์ชันภาษาแอสเซมบลีและคำอธิบายทั้งหมดของการปรับให้เหมาะสมใน " The Zen of Code Optimization"โดย Michael Abrash

ฉันอยากจะแนะนำหนังสือของเขาให้กับทุกคนที่กำลังมองหาการเข้ารหัสอัญมณี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.