Giter VIP home page Giter VIP logo

ai-qa's Introduction

大家好,我是提奥(Theo)

👨🏻‍💻  关于我

一个喜欢玩游戏,也喜欢做游戏的程序员。从红白机到街机,再到网吧/PC/Steam,一路玩游戏长大的。

以前喜欢玩MMORPG,玩的比较久的有奇迹/奇迹世界/天下贰,玩的没那么久但也投入过真情实感的:剑网3/魔兽世界。其他浅尝则止的:征途/QQ幻想/热血江湖/QQ寻仙/大话西游/梦幻西游/问道/等等…… (我列这个干嘛,好像以前出来过的游戏就没有不玩的)

长时间玩过的非MMORPG还有QQ飞车,QQ音速等,QQ飞车玩到了96级左右。哦,对了,还有暗黑3和炉石传说,炉石最高打到传说,千胜德鲁伊,花的时间感觉有上万小时吧,千胜…… 懂得都懂。

页游/手游时代玩的很多很杂,好多都记不清了,一些印象深刻的:七雄争霸/神仙道/魔卡幻想/我叫MT1和2/剑与远征/War Eternal/不休的乌拉拉/出发吧麦芬……

现在年纪大了,MMORPG有点玩不动了,当然近几年也没出过什么好的。现在喜欢在 Steam 玩 Roguelike,只要是有点名气的基本都玩:杀戮尖塔/吸血鬼幸存者/土豆兄弟/小丑牌(Balatro)/Backpack Battles/...

玩游戏玩得多了,就想自己做,所以经常会在脑子里构思一些独立游戏的 idea,在业余时间会尝试着去制作,但因为本职工作是后端,前端并不熟悉,所以做起来有点费劲。

但梦想总是有的,工作之余经常做些小游戏练手,未来打算组建一个3~4人的小团队,正式开始我的游戏制作之旅,我在团队里的角色会是策划+后端。

以前我想做中国的暴雪,但自从暴雪腐烂后,已经不以他们为目标了。现在比较欣赏心动,跟我的游戏制作理念高度一致:

  • 聚匠人心,动玩家情。
  • 不以赚钱为目的,只为做好玩的游戏,游戏做好了,挣钱是水到渠成的事。即是心动所说的:挣玩家的打赏钱。

My slogan: Make Fun Games!

🛠  Tech Stack

  • 💻   Lua Go C++ C#
  • 🎮   Unity Unreal Godot LÖVE
  • 🌐   HTML5 CSS JavaScript
  • 🛢   MySQL Redis MongoDB
  • ⚙️   Git GitHub Markdown
  • 🔧   Visual Studio Code Vim

ai-qa's People

Contributors

najoast avatar

Watchers

 avatar  avatar

ai-qa's Issues

MySQL REPLACE INTO 语句和 INSERT INTO ... ON DUPLICATE KEY UPDATE 的区别

You:

mysql replace into 语句的原理


ChatGPT:

REPLACE INTO语句是MySQL中用于插入或替换数据的一种特殊语法。它的原理是根据指定的唯一键(Primary Key)或唯一索引(Unique Index)来判断是否执行插入或替换操作。

具体原理如下:

  1. 当执行REPLACE INTO语句时,MySQL首先检查表中是否存在要插入的数据行的唯一键或唯一索引。
  2. 如果存在相同唯一键或唯一索引的数据行,MySQL将执行更新操作,用新的数据替换原有数据。
  3. 如果不存在相同唯一键或唯一索引的数据行,MySQL将执行插入操作,将新的数据插入到表中。

这个过程可以简单理解为先尝试更新(如果已存在相同唯一键或唯一索引的数据行),然后再尝试插入(如果没有相同唯一键或唯一索引的数据行)。

在进行替换操作时,MySQL会按照以下步骤进行:

  1. 首先,MySQL尝试插入新的数据行。
  2. 如果插入操作引发了唯一键或唯一索引的冲突,表示已经存在相同的唯一键或唯一索引值,那么MySQL会执行更新操作。
  3. 更新操作将使用新的数据值更新已存在的数据行。
  4. 如果插入操作不引发唯一键或唯一索引的冲突,则表示数据行是新的,MySQL将完成插入操作。

总结来说,REPLACE INTO语句的原理是根据唯一键或唯一索引来判断是否执行插入或替换操作。如果存在相同的唯一键或唯一索引,将进行更新操作;如果没有相同的唯一键或唯一索引,将进行插入操作。


You:

使用 REPLACE INTO 时,是不是不管有没有数据,都会先删除旧的,再插入新的,导致数据库产生大量碎片?


ChatGPT:

不完全正确。REPLACE INTO语句在执行替换操作时并不是简单地删除旧数据再插入新数据,而是先尝试插入新数据,如果存在相同的唯一键或唯一索引,则删除旧数据并插入新数据。

在执行替换操作时,MySQL会进行以下步骤:

  1. 尝试插入新数据。
  2. 如果存在相同的唯一键或唯一索引,MySQL会删除旧数据。
  3. 插入新数据。

这意味着,在执行REPLACE INTO时,如果存在相同唯一键或唯一索引的数据行,将发生删除操作。而如果不存在相同的唯一键或唯一索引,将直接进行插入操作。

因此,如果表中的数据需要被替换,MySQL会在删除旧数据后插入新数据,这可能会导致数据库产生一些碎片空间。碎片空间是指在数据文件中由于删除操作而留下的未被完全填充的空间。

为了避免碎片空间的问题,可以定期进行表的优化操作(例如使用OPTIMIZE TABLE命令),它会重新组织表的数据以减少碎片空间的产生。


You:

REPLACE INTO 和 INSERT INTO ... ON DUPLICATE KEY UPDATE 的区别是什么?


ChatGPT:

REPLACE INTOINSERT INTO ... ON DUPLICATE KEY UPDATE是两种用于在MySQL中插入或更新数据的语句,它们有以下区别:

  1. 行为方式:REPLACE INTO语句会先尝试插入新数据,如果存在相同的唯一键或唯一索引,则删除旧数据并插入新数据。而INSERT INTO ... ON DUPLICATE KEY UPDATE语句则是在插入数据时,如果存在相同的唯一键或唯一索引,则执行更新操作。

  2. 执行效率:REPLACE INTO语句执行时会先删除旧数据再插入新数据,这可能会引起额外的开销,特别是在表中存在大量数据时。而INSERT INTO ... ON DUPLICATE KEY UPDATE语句只需要进行一次插入操作或一次更新操作,执行效率可能更高。

  3. 数据处理:REPLACE INTO语句会删除旧数据并插入新数据,因此可能会重置自增主键(Auto Increment Primary Key)的值。而INSERT INTO ... ON DUPLICATE KEY UPDATE语句在执行更新操作时不会改变自增主键的值。

  4. 语法:REPLACE INTO语句是MySQL特有的语法,而INSERT INTO ... ON DUPLICATE KEY UPDATE语句是标准的SQL语法,可以在多种关系型数据库中使用。

综上所述,主要区别在于处理方式、执行效率和对自增主键的影响。如果你希望在存在冲突时执行更新操作,而不影响自增主键的值,可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句。如果你想先删除旧数据再插入新数据,并且不关心自增主键的值,可以使用REPLACE INTO语句。


You:

你上面说 REPLACE INTO 不会删除旧的数据,现在又说会删除,并导致自增主键的自增,到底会不会删除旧的?


ChatGPT:

请接受我之前的回答中的错误表述的道歉。实际上,REPLACE INTO语句会删除旧数据并插入新数据,这可能会导致自增主键的重新自增。

REPLACE INTO语句在执行时的行为如下:

  1. 首先,它尝试插入新数据。
  2. 如果存在相同的唯一键或唯一索引,MySQL会删除旧数据。
  3. 然后,它插入新数据。

由于REPLACE INTO语句的行为类似于先删除再插入,所以它会导致自增主键的重新自增。这是因为在删除旧数据后,自增计数器会被重置,并在插入新数据时重新开始计数。

如果你的目标是在存在冲突时执行更新操作而不影响自增主键的值,那么你应该考虑使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句。这样可以在存在冲突时执行更新操作,而不会触发自增主键的重新自增。


You:

使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 时,如果要 UPDATE 的内容特别长,会导致 SQL 语句的长度翻倍,有什么办法能解决这个问题吗?比如使用事务,或者先使用 select 语句确认是否有数据,再决定使用 insert 还是 update


ChatGPT:

如果使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句时,要更新的内容特别长,导致SQL语句长度翻倍,可以考虑以下两种方法来解决这个问题:

  1. 使用事务:可以将多个SQL语句封装在一个事务中执行,这样可以减少网络传输的开销,并在事务提交时才将数据写入磁盘。这样可以降低长SQL语句对网络和磁盘的压力。在使用事务时,可以先执行一个SELECT语句检查是否存在相同的唯一键或唯一索引,然后根据结果决定执行INSERT还是UPDATE语句。

    START TRANSACTION;
    SELECT * FROM table WHERE unique_key = 'value' FOR UPDATE;
    
    -- 根据SELECT的结果决定是执行INSERT还是UPDATE语句
    IF FOUND THEN
        UPDATE table SET column1 = 'new_value' WHERE unique_key = 'value';
    ELSE
        INSERT INTO table (unique_key, column1) VALUES ('value', 'new_value');
    END IF;
    
    COMMIT;

    使用事务可以确保一系列操作的原子性,并且可以减少长SQL语句的长度。

  2. 分为两个步骤:首先执行一个SELECT语句,检查是否存在相同的唯一键或唯一索引。根据查询结果,决定执行INSERT还是UPDATE语句。这样可以避免在单个SQL语句中包含大量的更新内容。

    -- 先执行SELECT语句检查是否存在相同的唯一键或唯一索引
    SELECT * FROM table WHERE unique_key = 'value';
    
    -- 根据SELECT的结果决定是执行INSERT还是UPDATE语句
    IF FOUND THEN
        UPDATE table SET column1 = 'new_value' WHERE unique_key = 'value';
    ELSE
        INSERT INTO table (unique_key, column1) VALUES ('value', 'new_value');
    END IF;

    这种方法可以将更新操作拆分为两个步骤,减少单个SQL语句的长度。

这两种方法都可以帮助解决长SQL语句的问题,并根据需要执行插入或更新操作。选择哪种方法取决于具体的需求和情况,以及系统性能的权衡。

如果提高游戏开发效率,降低游戏开发成本?Supercell的开发模式对我们有什么启发?

You:

如果提高游戏开发效率,降低游戏开发成本?


ChatGPT:

要提高游戏开发效率并降低游戏开发成本,可以考虑采取以下方法:

  1. 使用成熟的游戏引擎:选择已经成熟并广泛使用的游戏引擎,如Unity、Unreal Engine等。这些引擎提供了强大的工具和资源,可以加速游戏开发过程,减少重复劳动。

  2. 多平台开发:设计游戏时考虑多个平台,如PC、主机、移动设备等。这样一次开发就能在多个平台上发布游戏,减少额外的开发工作和成本。

  3. 团队合作与沟通:建立高效的团队合作机制,确保团队成员之间的良好沟通和协作。透明的项目管理和任务分配可以减少冗余工作和错误。

  4. 重用资产:在游戏开发中,尽可能地重用现有的资产和代码。利用现有的模块、特效、音效等可以节省开发时间和成本。

  5. 自动化工具:使用自动化工具来处理重复性任务,如构建、测试、部署等。自动化可以提高效率,减少手动错误,节省时间和资源。

  6. 优先级管理:确定游戏开发的优先级,专注于核心玩法和功能,避免在开发过程中不必要的功能扩展和范围膨胀。

  7. 外包与合作:将一些特定的任务外包给专业团队,如美术设计、音效制作等。外包可以减轻内部开发团队的负担,并提供高质量的专业服务。

  8. 及时反馈和测试:持续进行测试和反馈,及时发现和解决问题,避免在后期修复大量的bug,从而减少额外的开发成本。

  9. 参考开源资源:在合适的情况下,可以考虑使用开源资源和库,这些资源可以帮助减少开发时间和成本。

  10. 市场调研与规划:在着手开发前,进行充分的市场调研和游戏规划,确保游戏的目标受众和市场需求,避免开发过程中的方向偏差。

综合应用上述方法,可以显著提高游戏开发效率,减少开发成本,使得游戏开发过程更加高效和经济。


You:

Supercell 的开发模式你了解吗?他们是如何降低单个游戏的开发成本的?


ChatGPT:

Supercell是一家芬兰的移动游戏开发公司,以开发知名游戏如《部落冲突》(Clash of Clans)、《皇室战争》(Clash Royale)、《炉石传说》(Brawl Stars)等而闻名。他们采用了一种独特的开发模式,以降低单个游戏的开发成本,这个模式通常被称为"小团队模式"(Small Team Model)或"Cell模式"(Cell Structure)。

小团队模式的主要特点包括:

  1. 小团队开发:每个游戏项目都由一个小规模的开发团队负责,通常是5-7人。这个小团队被称为"Cell",他们负责游戏的全周期开发,从构思到上线再到后续维护。

  2. 独立决策权:每个Cell都拥有较高的自主权和独立决策权。这意味着他们可以自行决定游戏的方向、特性和设计,而不需要频繁地汇报和审批。

  3. 重用引擎和工具:Supercell的游戏通常共享同一个游戏引擎和一套通用的开发工具。这样一来,每个Cell不必从头开发游戏引擎,而是可以专注于游戏内容和体验的设计。

  4. 精益开发:Supercell倡导迅速发布原型并通过快速迭代的方式不断完善游戏。他们鼓励开发团队从早期的原型开始,将游戏快速推向市场,收集用户反馈并根据反馈进行改进,而非等待完美的游戏版本。

通过这种小团队模式,Supercell取得了显著的成功。他们能够高效地开发并推出多款备受欢迎的游戏,不仅降低了单个游戏的开发成本,而且增加了创新的机会。此外,独立决策权和自主性也激发了团队成员的创造力和责任心,为游戏的质量和成功做出了贡献。


You:

对于普通的游戏公司,大部分达不到Supercell这种状态,项目和项目之间技术不通用,重复造轮子,导致了资源的严重浪费。你觉得普通游戏公司该如何做,才能达到或接近Supercell的状态?这样做能提高人效并降低开发成本吗?


ChatGPT:

确实,普通的游戏公司在很多情况下难以达到Supercell那种小团队模式的高效状态。然而,他们仍然可以采取一些措施,以接近这种高效状态并提高人效,降低开发成本:

  1. 技术共享与标准化: 尽量在项目之间共享通用的技术框架和工具,建立一套标准化的开发流程。这样可以避免每个项目都重新造轮子,减少开发时间和成本。

  2. 建立核心团队: 为公司打造一支高度专业化、经验丰富的核心团队。这些团队成员可以参与多个项目,快速适应和解决不同项目的挑战,提高开发效率。

  3. 外包与合作: 对于某些特定任务,可以考虑外包给专业团队,如美术设计、音效制作等。外包可以减轻内部开发团队的负担,节省时间和资源。

  4. 敏捷开发: 采用敏捷开发方法,强调快速迭代和及时反馈。这样可以更好地应对变化,减少错误和不必要的开发。

  5. 人才培养: 投资于员工培训和发展,提高团队成员的技能水平和专业素养。更具技术实力的团队能够更高效地解决问题和创造新的解决方案。

  6. 市场调研与规划: 在着手开发前,进行充分的市场调研和游戏规划,确保游戏的目标受众和市场需求,避免开发过程中的方向偏差。

  7. 数据驱动决策: 使用数据分析和用户反馈来指导开发决策。了解用户需求和行为可以更加精准地开发游戏,避免不必要的功能和修复。

尽管普通游戏公司可能无法完全达到Supercell的状态,但通过采取上述措施,他们可以在一定程度上接近这种高效状态。这样做可以提高团队人效,降低开发成本,使得游戏开发过程更加高效和经济。同时,这也有助于增加公司的创新能力和应对市场变化的能力。

吃芒果后嘴巴和喉咙比较涩是怎么回事

You:

吃芒果后嘴巴和喉咙比较涩是怎么回事


ChatGPT:

吃芒果后嘴巴和喉咙感到涩是因为芒果含有一种称为芒果酚的化合物。芒果酚是一种天然存在于芒果皮和树液中的物质,它具有收敛和干燥的特性,可能导致口腔和喉咙的不适感。

对于某些人来说,芒果酚可能会引起口腔黏膜的刺激,导致口腔干燥和涩感。此外,芒果酚也可能对敏感的喉咙黏膜产生类似的刺激作用,导致喉咙的不适感。

除了芒果酚,芒果还含有一些天然酸,如柠檬酸和苹果酸,它们可能增加口腔和喉咙的酸度,进一步引起涩感。

如果你在吃芒果后感到口腔和喉咙涩,你可以尝试以下方法缓解不适感:

  1. 饮用适量的水:喝一些水可以帮助清洁口腔和喉咙,缓解涩感。

  2. 漱口:用温盐水漱口可以缓解口腔不适感。

  3. 食用其他食物:尝试吃一些含有丰富水分的食物,如西瓜或柑橘类水果,以帮助缓解口腔和喉咙的涩感。

  4. 避免刺激性食物和饮品:避免食用过热、过冷、辛辣或酸性的食物和饮品,以减轻不适感。

如果你对芒果或其他食物的不适反应持续或加重,建议咨询医生或口腔专家以获取专业建议。


You:

如果有咽炎,能吃芒果吗


ChatGPT:

如果你患有咽炎,吃芒果可能会引起不适或加重症状。咽炎是咽喉黏膜的炎症,而芒果含有芒果酚等物质,可能对敏感的咽喉黏膜产生刺激作用,导致疼痛、痒或炎症加重。

每个人对芒果的耐受性不同,有些人可能能够耐受芒果而不引起不适,但对于有咽炎的人来说,建议在症状缓解之前避免食用芒果或其他可能刺激咽喉黏膜的食物。

如果你患有咽炎,以下是一些建议:

  1. 避免刺激性食物和饮品:避免食用过热、过冷、辛辣或酸性的食物和饮品,这些可能刺激咽喉黏膜并加重症状。

  2. 喝温水:饮用温水可以缓解咽喉的不适感,并有助于保持喉咙的湿润。

  3. 咽喉保湿:可以使用含有舒缓成分的喉糖片或含漱口液来保湿和舒缓咽喉。

  4. 遵循医生的建议:如果你已经就医并接受了咽炎治疗,遵循医生的建议和处方药物使用。

记住,每个人的情况不同,最好在遇到健康问题时咨询医生或医疗专业人士,以获取个性化的建议和治疗方案。

如何避免游戏设计进入“开发-效果不好-玩家不满-大改-继续效果不好”的恶性循环?

You:

如何避免游戏设计进入“开发->效果不好->玩家不满->大改->继续效果不好”的恶性循环?


ChatGPT:

要避免游戏设计进入“开发->效果不好->玩家不满->大改->继续效果不好”的恶性循环,开发团队可以采取以下策略:

  1. 明确目标和设计阶段:在游戏开发之前,确保整个团队对游戏的目标和核心玩法有清晰的理解。在设计阶段,进行充分的头脑风暴和原型测试,以确保初期设计就尽可能符合预期效果。

  2. 小规模测试和反馈:在游戏的早期阶段,进行小规模测试并收集玩家反馈。这有助于快速发现潜在的问题和改进点,避免投入大量资源在一个未经验证的设计上。

  3. 迭代开发:采用敏捷开发或迭代开发的方法,将游戏设计和开发过程分成多个阶段。每个阶段后都进行评估和反馈,这样可以在后续阶段及时调整和优化设计。

  4. 基于数据和玩家反馈做决策:收集游戏运营数据和玩家反馈,结合定量和定性分析,做出决策。避免过度凭借开发团队的主观意见,而是以玩家的需求和喜好为导向。

  5. 投入多样化的测试人员:在测试游戏时,尽量引入具有不同游戏经验和背景的测试人员,从多个角度评估游戏的质量和可玩性。

  6. 避免频繁的大改动:在游戏开发的后期阶段,尽量避免频繁进行大规模的游戏改动。这样可以保持游戏的稳定性和一致性,同时避免过多投入导致效果不好。

  7. 建立良好的沟通和协作机制:确保开发团队内部良好的沟通和协作,及时分享信息和发现问题。同时,与玩家保持积极的沟通,回应他们的反馈和需求。

  8. 学习他人成功和失败的经验:研究其他游戏的成功和失败案例,从中吸取经验教训,避免重复他人的错误。

  9. 灵活应对市场变化:游戏行业竞争激烈,市场需求也会变化。开发团队要保持灵活性,及时调整游戏设计以适应市场的需求。

最终,避免恶性循环需要团队的共同努力和持续不断地学习与改进。


You:

如果一个游戏的系统在每个版本都进行大改,会有什么后果?


ChatGPT:

如果一个游戏在每个版本都进行大改,可能会导致以下后果:

  1. 玩家不稳定性:频繁的大改动会让玩家感到不稳定和不适应。他们可能需要重新学习游戏机制和规则,这会让他们感到困惑和失去兴趣。

  2. 玩家流失:由于不断的大改动,部分玩家可能感到不满意,并选择离开游戏。他们可能觉得之前投入的时间和精力都付诸东流,而不愿意再去适应新的游戏系统。

  3. 破坏游戏平衡:大规模的系统改动可能会导致游戏内部的平衡被打破。之前经过精心调整和测试的游戏机制可能在新版本中失去效果或者变得过于强大,影响游戏的公平性和可玩性。

  4. 开发资源浪费:频繁进行大规模的改动需要大量的开发资源和时间。如果每个版本都进行大改,那么开发团队可能会花费过多的时间在重新设计和开发新系统上,而无法专注于修复现有问题或增加新内容。

  5. 不利于游戏品牌建设:一个成功的游戏通常需要建立自己的品牌和风格,让玩家对其产生认同感。频繁的大改动可能会导致游戏失去其独特性和特色,让玩家失去对游戏的信心。

  6. 缺乏稳定的玩家群体:如果游戏的系统在每个版本都发生巨大变化,那么可能难以形成稳定的玩家群体。稳定的玩家社区对于游戏的长期发展和运营非常重要,频繁的大改动可能会让社区难以形成并持续发展。

因此,虽然在游戏中进行一些改动和优化是正常的,但频繁进行大规模的系统改动可能会带来负面影响,包括玩家流失、游戏品质下降以及开发资源的浪费。在设计和开发游戏时,需要谨慎考虑每次改动的必要性和影响,以确保游戏的稳定和长期发展。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.