Slide 1

Slide 1 text

1/92

Slide 2

Slide 2 text

2/92

Slide 3

Slide 3 text

3/92 ◆ ◆ ◆

Slide 4

Slide 4 text

4/92

Slide 5

Slide 5 text

5/92

Slide 6

Slide 6 text

6/92

Slide 7

Slide 7 text

7/92

Slide 8

Slide 8 text

8/92

Slide 9

Slide 9 text

9/92

Slide 10

Slide 10 text

10/92

Slide 11

Slide 11 text

11/92

Slide 12

Slide 12 text

12/92

Slide 13

Slide 13 text

13/92

Slide 14

Slide 14 text

14/92

Slide 15

Slide 15 text

15/92

Slide 16

Slide 16 text

16/92 ◆ ◆

Slide 17

Slide 17 text

17/92

Slide 18

Slide 18 text

18/92 ◆ ◆ ◆

Slide 19

Slide 19 text

19/92

Slide 20

Slide 20 text

20/92 autoplay_pipeline.exe ( golang ) Jenkins ( groovy Pipeline Script ) granblue_fantasy_relink.exe

Slide 21

Slide 21 text

21/92

Slide 22

Slide 22 text

22/92 ◆ ◆ ◆

Slide 23

Slide 23 text

23/92

Slide 24

Slide 24 text

24/92

Slide 25

Slide 25 text

25/92

Slide 26

Slide 26 text

26/92

Slide 27

Slide 27 text

27/92

Slide 28

Slide 28 text

28/92

Slide 29

Slide 29 text

29/92

Slide 30

Slide 30 text

30/92

Slide 31

Slide 31 text

31/92

Slide 32

Slide 32 text

32/92

Slide 33

Slide 33 text

33/92

Slide 34

Slide 34 text

34/92

Slide 35

Slide 35 text

35/92

Slide 36

Slide 36 text

36/92

Slide 37

Slide 37 text

37/92

Slide 38

Slide 38 text

38/92

Slide 39

Slide 39 text

39/92

Slide 40

Slide 40 text

40/92

Slide 41

Slide 41 text

41/92

Slide 42

Slide 42 text

42/92

Slide 43

Slide 43 text

43/92 ◆ ◆

Slide 44

Slide 44 text

44/92

Slide 45

Slide 45 text

45/92

Slide 46

Slide 46 text

46/92

Slide 47

Slide 47 text

47/92

Slide 48

Slide 48 text

48/92

Slide 49

Slide 49 text

49/92

Slide 50

Slide 50 text

50/92

Slide 51

Slide 51 text

51/92

Slide 52

Slide 52 text

52/92

Slide 53

Slide 53 text

53/92

Slide 54

Slide 54 text

54/92

Slide 55

Slide 55 text

55/92 ◆ ◆ ◆

Slide 56

Slide 56 text

56/92

Slide 57

Slide 57 text

57/92

Slide 58

Slide 58 text

58/92

Slide 59

Slide 59 text

59/92

Slide 60

Slide 60 text

60/92 ◆ ◆ ◆ ◆

Slide 61

Slide 61 text

61/92

Slide 62

Slide 62 text

62/92 f32 PointLightData::updateDistanceCurve() { auto retRate = 0.0f; auto distanceMin = distanceA_; auto distanceMax = distanceB_; auto t = (cameraDistance_ - distanceMin) / (distanceMax - distanceMin); t = GET_CLAMPF(t, 0.f, 1.f); // return t; }

Slide 63

Slide 63 text

63/92 f32 PointLightData::updateDistanceCurve() { auto retRate = 0.0f; auto distanceMin = distanceA_; auto distanceMax = distanceB_; // . auto denominator = (distanceMax - distanceMin); auto t = denominator <= FLT_EPSILON ? 1.f : (cameraDistance_ - distanceMin) / denominator; t = GET_CLAMPF(t, 0.f, 1.f); // return t; }

Slide 64

Slide 64 text

64/92

Slide 65

Slide 65 text

65/92 ◆ ◆ ◆ ◆

Slide 66

Slide 66 text

66/92 Matrix44 transform[3]; // Vector4 vertexs[16]; for (s32 i = 0, inum = std::size(vertexs); i < inum; ++i) { const div_t d = div(i, 4); VecMulMtx(vertexs[i], g_baseVertex[d.rem], transform[d.quot]); }

Slide 67

Slide 67 text

67/92 Matrix44 transform[4]; // Vector4 vertexs[16]; for (s32 i = 0, inum = std::size(vertexs); i < inum; ++i) { const div_t d = div(i, 4); VecMulMtx(vertexs[i], g_baseVertex[d.rem], transform[d.quot]); }

Slide 68

Slide 68 text

68/92 constexpr MaterialVariationID DEFAULT_MATERIAL_VARIATION_ID = 0; void hoge() { huga = KeyData::getConstantKeyParamWithDefault(subseq.materialVariationIdList_, 0.0f, asset::DEFAULT_MATERIAL_VARIATION_ID); } template KeyParam getConstantKeyParamWithDefault(const std::vector>& list, f64 nowSeconds, const KeyParam& defaultValue) { // }

Slide 69

Slide 69 text

69/92 constexpr MaterialVariationID DEFAULT_MATERIAL_VARIATION_ID = 0; void hoge() { huga = KeyData::getConstantKeyParamWithDefault(subseq.materialVariationIdList_, 0.0f, asset::DEFAULT_MATERIAL_VARIATION_ID); } template KeyParam getConstantKeyParamWithDefault(const std::vector>& list, f64 nowSeconds, const KeyParam defaultValue) { // }

Slide 70

Slide 70 text

70/92 SceneObject* SceneObject::clone(SceneObject* pParent, bool isRename, bool isEntity) const { const char* pName; if (isRename != false) { auto name = mName; // pName = name.get(); } else { pName = mName.get(); } auto pNewObject = SceneObject::create(className(), pName, pParent, false); }

Slide 71

Slide 71 text

71/92 SceneObject* SceneObject::clone(SceneObject* pParent, bool isRename, bool isEntity) const { SceneObject* pNewObject = nullptr; if (isRename != false) { auto name = name_; // pNewObject = SceneObject::create(className(), name.get(), pParent, false); } else { pNewObject = SceneObject::create(className(), mName.get(), pParent, false); } }

Slide 72

Slide 72 text

72/92

Slide 73

Slide 73 text

73/92

Slide 74

Slide 74 text

74/92

Slide 75

Slide 75 text

75/92

Slide 76

Slide 76 text

76/92 void write() { // void* address = reinterpret_cast (0x0123456789A); // placement new MyClass* obj = new (address) MyClass(42); } void read() { // void* address = reinterpret_cast (0x0123456789A); std::cout << reinterpret_cast (address)->data << std::endl; }

Slide 77

Slide 77 text

77/92 ================== WARNING: ThreadSanitizer: data race (pid=174) Write of size 8 at 0x0010a48bb360 by thread T11: #0 0x81119cf39 (ThreadSanitizer.sprx+0x64f39) #1 0x26670e46 in Mtx44Copy(Matrix44&, Matrix44 const&) { } #2 0x26670e46 in Matrix44::operator=(Matrix44 const&) { } #3 0x2c23d8b8 in Joint::setWorldMatrix(Matrix44 const&) { } #4 0x2c23d8b8 in JointList::addVecJointMatrix(Joint&, Vector4 const&) { } … Previous read of size 8 at 0x0010a48bb360 by thread T12: )(void*, void*) const { } … #5 0x2c23b98e in Joint::getWorldPos() const { } #6 0x2c22ce88 in ModelImpl::getWorldPos() const { } …

Slide 78

Slide 78 text

78/92 ================== WARNING: ThreadSanitizer: data race (pid=174) Write of size 8 at 0x0010a48bb360 by thread T11: #0 0x81119cf39 (ThreadSanitizer.sprx+0x64f39) #1 0x26670e46 in Mtx44Copy(Matrix44&, Matrix44 const&) { } #2 0x26670e46 in Matrix44::operator=(Matrix44 const&) { } #3 0x2c23d8b8 in Joint::setWorldMatrix(Matrix44 const&) { } #4 0x2c23d8b8 in JointList::addVecJointMatrix(Joint&, Vector4 const&) { } … Previous read of size 8 at 0x0010a48bb360 by thread T12: )(void*, void*) const { } … #5 0x2c23b98e in Joint::getWorldPos() const { } #6 0x2c22ce88 in ModelImpl::getWorldPos() const { } …

Slide 79

Slide 79 text

79/92 void Np0100::updateParameter() { Vector4 playerPos = PlayerManager::GetManualPlayerPos(); Vector4 vec = getPos() - playerPos; f32 length = VecMag(vec); f32 lengthY = vec.y; vec.y = 0.0f; f32 lengthXZ = VecMag(vec); }

Slide 80

Slide 80 text

80/92 void Np0100::updateParameter() { Vector4 playerPos = PlayerManager::GetManualPlayerPosRef(); Vector4 vec = getPos() - playerPos; f32 length = VecMag(vec); f32 lengthY = vec.y; vec.y = 0.0f; f32 lengthXZ = VecMag(vec); }

Slide 81

Slide 81 text

81/92 ================== WARNING: ThreadSanitizer: data race (pid=490) Write of size 8 at 0x00101a3a4000 by thread T10: #0 0x73b877da in model::bool_vector::set(unsigned long, bool) {コードの場所} #1 0x73bbfcdf in model::BoundingVolume::setForceVisible(bool) const {コードの場所} #2 0x73bfc74b in ModelImpl::updateBoundingVolume() {コードの場所} #3 0x73c24800 in auto ModelProcessingImpl::updateModelList(concurrency::JobSystem&):: ...template... const {コード の場所} #4 0x73c24800 in void concurrency::JobSystem::parallelForEach ...template... const {コードの場所} Previous write of size 8 at 0x00101a3a4000 by thread T14: #0 0x73b877bc in model::bool_vector::set(unsigned long, bool) {コードの場所} #1 0x73bbfcdf in model::BoundingVolume::setForceVisible(bool) const {コードの場所} #2 0x73bfc74b in ModelImpl::updateBoundingVolume() {コードの場所} #3 0x73c24800 in auto ModelProcessingImpl::updateModelList(concurrency::JobSystem&):: ...template... const {コード の場所} #4 0x73c24800 in void concurrency::JobSystem::parallelForEach ...template... const {コードの場所}

Slide 82

Slide 82 text

82/92 int main() { std::vector numbers = { 1, 2, 3 }; std::thread t1([&]() { numbers[0] = 42; //OK }); std::thread t2([&]() { numbers[1] = 84; //OK }); t1.join(); t2.join(); return 0; } int main() { std::vector numbers = { 1, 2, 3 }; std::thread t1([&]() { numbers[0] = 42; //t2 }); std::thread t2([&]() { numbers[0] = 84; //t1 }); t1.join(); t2.join(); return 0; }

Slide 83

Slide 83 text

83/92 int main() { std::vector flags = { true, false, true }; std::thread t1([&]() { flags[0] = true; //NG }); std::thread t2([&]() { flags[1] = true; //NG }); t1.join(); t2.join(); return 0; }

Slide 84

Slide 84 text

84/92

Slide 85

Slide 85 text

85/92

Slide 86

Slide 86 text

86/92

Slide 87

Slide 87 text

87/92 ◆ ◆ ◆

Slide 88

Slide 88 text

88/92

Slide 89

Slide 89 text

89/92 ◆ ◆ ◆

Slide 90

Slide 90 text

90/92 ◆ ◆ ◆

Slide 91

Slide 91 text

91/92 ◆ ◆ ◆

Slide 92

Slide 92 text

92/92